Seek Job Scraper - Australia & NZ Job Listings and Salaries avatar

Seek Job Scraper - Australia & NZ Job Listings and Salaries

Pricing

from $2.00 / 1,000 actor run starteds

Go to Apify Store
Seek Job Scraper - Australia & NZ Job Listings and Salaries

Seek Job Scraper - Australia & NZ Job Listings and Salaries

Search Seek in Australia or New Zealand and get every job listing as a row: title, company, location, category, work type and arrangement, posting date, and the pay text with real numbers parsed out only when the advertiser actually stated one.

Pricing

from $2.00 / 1,000 actor run starteds

Rating

0.0

(0)

Developer

SR

SR

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Seek Job Scraper - Australia & New Zealand

This Seek job scraper searches seek.com.au or seek.co.nz and returns every job listing as a structured row: title, company, location, category, work type, work arrangement, posting date, and the pay. Use it for salary benchmarking, recruitment intelligence and job market monitoring in Australia and New Zealand.

Type a keyword, a location, or both. No API key, no login, no Seek account.

How to use the Seek job scraper

  1. Enter Keywords the way you would type them into Seek's search box, for example data scientist or registered nurse.
  2. Enter a Location in Seek's own format, for example Sydney NSW, Melbourne VIC or Auckland, or leave it empty to search the whole country.
  3. Pick the Country: Australia or New Zealand.
  4. Set Maximum jobs and start the run. Results land in the dataset, ready to export as JSON, CSV or Excel, or to read through the Apify API.

Input

fieldtypedefaultwhat it does
keywordsstringemptyWhat to search for, exactly as you would type it into Seek. Leave empty to list everything in a location.
wherestringemptyWhere to search, in Seek's format (Sydney NSW, Melbourne VIC, Auckland). Leave empty for the whole country.
countryau or nzauWhich Seek site to search.
max_jobsinteger, 1–100096Stop after this many jobs. Seek returns 32 per page, so this rounds up to whole pages and is also the cost ceiling for the run.

An example input that collects the first 40 nursing jobs in Auckland:

{
"keywords": "registered nurse",
"where": "Auckland",
"country": "nz",
"max_jobs": 40
}

Output: what the Seek job scraper returns per listing

The job — title, url, job_id, teaser (the summary line on the card) and bullet_points (the selling points the advertiser chose).

Who is hiring — company, company_url where Seek has a profile, and advertiser_id. Recruiters and direct employers both appear, and the advertiser id is what tells you the same agency is behind fifteen of your rows.

Where — location, all_locations when a listing names several, and region for the state or territory it sits in.

What kind of job — classification and sub_classification from Seek's own taxonomy, work_types (full time, contract, casual) and work_arrangements (on-site, hybrid, remote) where the advertiser stated one.

When — listing_date as a UTC timestamp and listing_age as Seek phrases it ("1d ago").

Placement — is_sponsored, is_featured, logo_url, and position in the run, following result order.

Pay — salary_label, salary_min, salary_max, salary_period and salary_is_stated. See below; this is the part worth reading.

Example row

This is a real row from the input above:

{
"job_id": "94930768",
"title": "General Practice Nurse / Registered Nurse",
"url": "https://www.seek.co.nz/job/94930768",
"company": "CityMed",
"company_url": null,
"advertiser_id": "60030505",
"location": "Auckland CBD, Auckland",
"all_locations": ["Auckland CBD, Auckland"],
"region": "All Auckland",
"classification": "Healthcare & Medical",
"sub_classification": "Nursing - Community, Maternal & Child Health",
"work_types": ["Full time"],
"work_arrangements": ["On-site"],
"teaser": "We’re looking for a fantastic full-time Practice Nurse / Registered Nurse to join our friendly, supportive team of doctors, nurses and admin staff.",
"bullet_points": null,
"listing_date": "2026-09-29T00:14:42.000Z",
"listing_age": "5d ago",
"is_sponsored": false,
"is_featured": false,
"logo_url": null,
"position": 4,
"salary_label": "$38 – $45 per hour",
"salary_min": 38,
"salary_max": 45,
"salary_period": "hour",
"salary_is_stated": true
}

Run summary

Next to the dataset, every run stores a summary record in the key-value store. For the same Auckland search it read:

{
"country": "nz",
"keywords": "registered nurse",
"where": "Auckland",
"jobsReturned": 40,
"pagesRead": 2,
"totalMatchingOnSeek": "273",
"withStatedSalary": 17,
"withSalaryLabelButNoAmount": 1,
"sponsored": 4,
"uniqueCompanies": 32,
"errorCount": 0
}

Pages that could not be read are listed in an errors record, with a code and a short message.

About the salary, which is the field everyone gets wrong

Seek does not publish a salary number. It publishes a line of text the advertiser typed, and the advertiser can type anything. From a single page of results:

$150,000 – $160,000 per year a real range
$90,000 – $95,000 + Super + Bonus a range plus extras
Up to $95,170 depending on qualifications a ceiling, not a range
$120 - $140 - inc Super - Weekly Pay Options an hourly rate, paid weekly
Suited to detail-oriented engineers with strong QA not a salary at all
Attractive salary + bonus + benefits not a salary at all
most of them, blank

Treating that field as a number is how a "roles over $100k" filter quietly ends up including jobs whose pay is unknown and excluding jobs that pay well. So this Actor returns both:

  • salary_label — the text exactly as written, always, whatever it says
  • salary_min, salary_max, salary_period — filled only when the text genuinely reads as money
  • salary_is_stated — the flag that lets you tell "no pay stated" apart from "the label was marketing copy"

salary_max stays empty when the advertiser gave a single figure, because repeating it as a maximum invents a range nobody offered. Up to $95,170 becomes a maximum with no minimum, because it promises no floor.

Pay periods, and one specific trap

A results page mixes annual salaries and hourly contractor rates freely, and 45 sitting next to 150000 in one column is worse than an empty column. Every parsed amount carries salary_period, so you can compare like with like.

The trap is that a period word in the text often describes how often you are paid, not what the rate is in. $120 - $140 - inc Super - Weekly Pay Options is an hourly rate offering weekly payment; read literally it says someone earns $140 a week. When the wording and the amount disagree, the amount decides, so that listing comes back as hourly.

Roughly a third of listings state a real amount. The run summary reports withStatedSalary and withSalaryLabelButNoAmount so you always know how much of a run carried one rather than assuming.

Employers pay for placement on Seek, and a sponsored ad sits above organic results. A row's position therefore reflects what Seek chose to show, not relevance or recency. is_sponsored lets you drop the paid slots, or study them on purpose: which agencies are paying to be seen is a useful signal in itself.

Australia and New Zealand are separate boards

seek.com.au and seek.co.nz carry different listings, and the Country input picks between them. A search of one never returns the other's jobs, so a national picture means two runs.

Filters and scale

Seek returns 32 listings per page. Maximum jobs rounds up to whole pages and is the ceiling on both time and cost: 96 jobs is three pages, and a run can go up to 1,000 jobs.

The summary also reports totalMatchingOnSeek, the count Seek itself claims for your search. When that reads 22,482 and you asked for 96, you know exactly how much of the board you are looking at. That number is Seek's, reported as given.

Use cases for Seek job data

Salary benchmarking. The subset of listings that state a real amount is a genuine sample of advertised pay by role, location and seniority. salary_period keeps hourly contract work from contaminating an annual average, and salary_is_stated keeps blank labels from being counted as zero.

Recruitment intelligence. advertiser_id and company across repeated runs show who is hiring, how fast, and which agencies dominate a category. New listings appearing under a competitor's name is a hiring-velocity series.

Market monitoring. Run a search on a schedule and keep the rows. listing_date and the disappearance of an id tell you how long a role stayed open, which is a fair proxy for how hard it was to fill.

Job aggregation. One search, one table, one shape, with the pay already separated into text and numbers so you do not have to write that parser.

Seek job scraper compared with the alternatives

The official SEEK API. SEEK's developer platform is built for recruitment software partners that post jobs and receive applications on behalf of employers. It is not a public search feed: you need a partner agreement, and it does not hand you the listings of the whole board.

A browser extension or copy-paste. Fine for one page. It does not run on a schedule, does not separate the pay into numbers, and stops being practical past a few dozen jobs.

Writing your own scraper. Possible, and then you own the pagination, the retries, the location formats of two countries and the salary parser described above, and you keep owning them when Seek changes its pages.

Other Seek actors. Several exist. What sets this one apart: the salary is part of every row at no extra charge rather than a separately billed event, the raw text is always kept next to the parsed numbers, and the pay period is corrected when the wording describes the pay cycle rather than the rate.

Pricing

Pay per event, with no monthly fee:

eventprice
Actor run started$0.002 per run
Job listing returned$0.0015 per job

Some examples:

  • 40 nursing jobs in Auckland: $0.002 + 40 × $0.0015 = $0.062
  • the default of 96 jobs: $0.002 + 96 × $0.0015 = $0.146
  • 320 accountant jobs in Melbourne: $0.002 + 320 × $0.0015 = $0.482

You only pay for jobs that are actually delivered. A search that finds nothing costs only the run start. Users on Apify's free plan get up to 10 jobs per run.

Notes

Only currently open listings appear. A filled or withdrawn role stops being published, which is what makes the run-on-a-schedule pattern above work.

A search that matches nothing is reported as exactly that, with the search spelled out, rather than as an empty result you would have to interpret. Occasionally a page needs a second attempt before it comes through; that is handled inside the run, and only a page that never arrives is reported.

FAQ

Is there an official Seek API for job listings? SEEK offers an API to recruitment software partners for posting jobs and handling applications. It is not open for searching the board. This Actor gives you the public search results as data instead.

Does the scraper return the salary for every job? It returns salary_label for every job that has one, exactly as written. The numbers in salary_min and salary_max are filled only when the text really states an amount, which is roughly a third of listings. salary_is_stated tells you which is which.

Can I search New Zealand and Australia in one run? No. They are separate job boards with separate listings, so you start one run with country set to au and one with nz.

Can I scrape every job in a city without a keyword? Yes. Leave Keywords empty and fill in Location; the run lists all jobs there, up to Maximum jobs.

What happens when my search finds nothing? The run still succeeds, the dataset stays empty, and the errors record says which search found nothing. You pay only the run start.

Does it return the full job description? No. It returns what Seek shows in the search results: the title, teaser, selling points, company, location, classification, work type and pay. The url of each row opens the full ad.