SEEK Job Scraper (AU & NZ) avatar

SEEK Job Scraper (AU & NZ)

Pricing

from $2.00 / 1,000 results

Go to Apify Store
SEEK Job Scraper (AU & NZ)

SEEK Job Scraper (AU & NZ)

Scrape job listings from SEEK (seek.com.au & seek.co.nz) by keyword, location, category and more.

Pricing

from $2.00 / 1,000 results

Rating

5.0

(1)

Developer

Corvuslab

Corvuslab

Maintained by Community

Actor stats

1

Bookmarked

10

Total users

4

Monthly active users

15 days ago

Last modified

Share

What does SEEK Job Scraper (AU & NZ) do?

Extract job listings from SEEK (seek.com.au and seek.co.nz) by keyword, location, category, work type, date or salary — with structured salary data, full descriptions, company profiles, incremental change tracking and built-in notifications.

Great for salary and market research, recruitment intelligence, competitor monitoring, and feeding structured job data into dashboards or AI agents.

📚 What data can you extract from SEEK?

Every record carries 44 fields, grouped like this:

GroupWhat you get
Core listingjobId, title, advertiserId, area, suburb, workType, workArrangement, roleId, category, subCategory, teaser, bulletPoints …and 8 more
Companycompany, companyUrl, companyLogo, companyDescription
Pay & budgetsalaryText, salaryMin, salaryMax, salaryCurrency, salaryType
Locationlocation, locationCountry, sourceCountry
Descriptiondescription, descriptionHtml, descriptionMarkdown
Dates & change trackingpostedDate, postedDateDisplay, expiresAt, changeType, firstSeenAt, lastSeenAt

Every field is nullable — missing values come back as null. Compact mode returns the core fields only for lean AI/MCP payloads, and excludeEmptyFields drops empties entirely.

✨ Key features

  • 🌏 Two-market coverage — one actor scrapes both SEEK Australia and New Zealand.
  • 🔍 Keyword & batch search — one query or many in a single run, deduplicated by job ID.
  • 🎯 Rich filters — location, classification/sub-classification, work type, work arrangement (on-site/hybrid/remote), "listed in last N days", salary range, and sort by relevance or date.
  • 💰 Structured salary — salaryText parsed into salaryMin / salaryMax / salaryCurrency / salaryType automatically.
  • 📄 Detail enrichment — full description as plain text, HTML and Markdown, plus the company profile.
  • 🔁 Incremental mode — on recurring runs, emit and charge for only NEW / UPDATED / REAPPEARED / EXPIRED jobs. Saves heavily on daily monitoring (see below).
  • ♻️ Repost detection — flag or drop jobs re-listed under a new ID.
  • 🧮 Post-filters — keyword include/exclude, date windows, and custom field rules.
  • 🔔 Notifications — push matching jobs to Telegram, Slack, Discord or a generic JSON webhook when a run finishes.
  • 🧰 AI-friendly output — compact mode and excludeEmptyFields for lean records.
  • 🔗 Start URLs — paste any SEEK search or job URL straight from your browser.

🚀 How to scrape SEEK

  1. Open the Actor and enter a search keyword (e.g. registered nurse) and a location, or paste a SEEK search URL straight from your browser.
  2. Pick the market — seek.com.au or seek.co.nz — and add the filters you need: classification, work type, salary range and date posted.
  3. Set Max results and choose whether to fetch full details for each job.
  4. (Optional) Turn on incremental mode and a notification channel, then schedule it from the Schedules tab.
  5. Click Start, then export as JSON, CSV or Excel — or pull the results from the API.

No login and no setup: it runs out of the box.


⚙️ Input

FieldTypeDescription
querystringKeywords, e.g. "python". Leave blank to browse all jobs.
queriesarrayMultiple keyword searches in one run.
countryenumAU (default) or NZ.
startUrlsarraySEEK search-results or /job/<id> URLs.
locationstringe.g. "Sydney NSW", "Auckland".
classification / subClassificationstringSEEK category IDs (e.g. 6281 = ICT).
workTypearrayfullTime, partTime, contract, casual.
workArrangementarrayonsite, hybrid, remote.
dateRangeenum1, 3, 7, 14, 31 days.
sortModeenumrelevance (default) or date.
salaryMin / salaryMaxintegerSalary range in local currency (set both).
includeKeywords / excludeKeywordsarrayKeep jobs matching an include term; drop jobs matching an exclude term.
keywordMatch*booleanLimit keyword matching to title/company/description/category/bulletPoints. None on = all fields.
fromDate / toDatestringKeep jobs posted within this date window (YYYY-MM-DD; toDate inclusive).
maxAgeMinutesintegerKeep only jobs posted within N minutes before the run.
customFiltersarrayRule-based filters on any output field, e.g. [{"field":"salaryMin","operator":"gte","value":100000}]. Operators: includes, notIncludes, equals, notEquals, gt, gte, lt, lte.
maxResultsintegerMax jobs per query (0 = unlimited, capped at 5000). Default 50.
maxPagesintegerMax search pages per query. Default 25.
includeDetailsbooleanFetch each job's detail page. Default true.
descriptionMaxLengthintegerTruncate description text (0 = no limit).
descriptionFormatenumall, text, html, markdown.
incrementalModebooleanTrack changes across runs; emit only NEW/UPDATED/REAPPEARED by default.
stateKeystringStable name for the tracking state (auto-derived if blank).
emitUnchanged / emitExpiredbooleanAlso emit UNCHANGED / EXPIRED jobs.
skipRepostsbooleanDetect and drop reposts; kept jobs are tagged isRepost/repostOfId.
telegramToken + telegramChatIdstringNotify Telegram (BotFather token + chat ID).
slackWebhookUrl / discordWebhookUrlstringNotify a Slack / Discord incoming webhook.
webhookUrl + webhookHeadersstring / objectPOST structured JSON to any endpoint, with optional custom headers.
notificationLimitintegerMax jobs listed per message (default 5; total is still reported).
notifyOnlyChangesbooleanOnly notify about NEW/UPDATED/REAPPEARED jobs (needs incremental mode).
includeRunSummarybooleanPrepend a one-line summary to each notification (default true).
compactbooleanCore fields only.
excludeEmptyFieldsbooleanDrop null/empty fields.

Example input

{
"query": "registered nurse",
"country": "NZ",
"location": "Auckland",
"dateRange": "7",
"sortMode": "date",
"maxResults": 100,
"includeDetails": true
}

📤 Output

Each job is pushed to the run's default dataset. Example record (abridged):

{
"jobId": "92981016",
"title": "Registered Nurse - Dermatology and Skin Cancer",
"company": "Skintel Limited",
"location": "Rosedale, Auckland",
"locationCountry": "NZ",
"salaryText": "$40 – $50 per hour",
"salaryMin": 40,
"salaryMax": 50,
"salaryCurrency": "NZD",
"salaryType": "hourly",
"workType": "Full time",
"workArrangement": "On-site",
"category": "Healthcare & Medical",
"subCategory": "Nursing - General Medical & Surgical",
"teaser": "Join a leading skin cancer and dermatology clinic!",
"url": "https://www.seek.co.nz/job/92981016",
"isSponsored": false,
"postedDate": "2026-06-26T22:46:48.331Z",
"searchQuery": "registered nurse",
"sourceCountry": "NZ",
"scrapedAt": "2026-06-30T13:00:00+00:00",
"description": "…",
"descriptionMarkdown": "…"
}

In compact mode only jobId, title, company, location, salaryText, workType, postedDate, url, applyUrl and searchQuery are returned.

Incremental fields

When incrementalMode is on, every record also carries:

  • changeType — NEW, UPDATED, UNCHANGED, REAPPEARED or EXPIRED
  • firstSeenAt / lastSeenAt — when the job was first and most recently seen
  • isRepost / repostOfId — set when repost detection matches an earlier listing

♻️ How to monitor SEEK with incremental mode

Running on a schedule? Turn on incrementalMode. The first run builds a baseline; every run after that emits — and charges for — only the jobs that changed. Unchanged jobs are recognised before their detail page is even fetched, so you skip both the work and the cost.

Because this actor is pay-per-result, your cost after the baseline scales with how much the market actually changes ("churn"), not with the total number of listings you monitor:

Daily churnRecords emitted per run (after baseline)Approx. saving vs a full re-scrape
5% (stable niche)~5%~90%
15% (moderate)~15%~80%
30% (fast-moving)~30%~65%

These figures apply to the per-result portion of the cost over a month of daily runs; the exact amount depends on the price configured for this actor. Set emitExpired to also receive listings that have dropped off, and emitUnchanged if you want the full set every run.

Keep maxResults / maxPages consistent between scheduled runs — they define the set of jobs being tracked.

🔔 How to set up SEEK alerts

Get alerted the moment matching jobs appear. Fill in only the channels you want; each fires independently when a run finishes and there are matching jobs.

  • ✈️ Telegram — telegramToken (from @BotFather) + telegramChatId.
  • 💬 Slack — slackWebhookUrl (Incoming Webhook).
  • 🎮 Discord — discordWebhookUrl (channel webhook).
  • 🪝 Generic webhook — webhookUrl receives a structured JSON payload (run metadata + a jobs array) with optional webhookHeaders. Ideal for n8n / Make / Zapier.

Pair with incrementalMode + notifyOnlyChanges to be alerted only about NEW/UPDATED/REAPPEARED jobs on scheduled runs. Credentials are stored encrypted.

💡 What can you do with SEEK data?

  • Salary and market research across AU & NZ.
  • Track salary trends and hiring demand over time.
  • Monitor new and changed listings on a schedule without re-processing everything.
  • Build recruitment and outreach lists from company and role data.
  • Feed structured job data into dashboards, data warehouses or AI agents.

💰 How much does it cost to scrape SEEK?

This actor uses pay-per-event pricing: a small per-run start fee plus a small fee per job record. You only pay for the jobs you actually receive — and with incremental mode on, only for the ones that changed.

🔌 Integrations & export

Export to JSON, CSV, Excel or an HTML table, or pull from the REST API and the JavaScript / Python clients. Runs on a schedule, connects to Google Sheets, Slack, Make, Zapier and n8n, and works as an MCP tool for AI agents — compact mode keeps token usage small.

🔗 Using the API

Run this Actor from your own code. Example with the Apify Python client:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("corvuslab/seek-scraper").call(run_input={
"query": "example",
"maxResults": 50,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

It also works with the JavaScript/TypeScript client, the Apify CLI and the REST API.

❓ FAQ

Do I need a SEEK account or login? No. The actor reads SEEK's public job listings; no credentials are required.

Can I scrape both Australia and New Zealand? Yes — set country to AU or NZ (run once per market, or use startUrls from either site).

Why are some company fields empty? companyUrl and companyDescription are only available for advertisers that have a SEEK company profile.

Is it legal to scrape seek.com.au / seek.co.nz? This actor extracts publicly available data from SEEK. Web scraping of public information is generally considered legal, but you should always review the target site's terms of service and ensure your use case complies with applicable laws and regulations, including GDPR where relevant.


This is an unofficial actor and is not affiliated with, endorsed by, or connected to SEEK. "SEEK" is a trademark of its respective owner and is used here only to describe the site this actor works with.


Keywords: seek scraper · seek.com.au scraper · seek.co.nz scraper · seek jobs api · australia jobs scraper · new zealand jobs scraper · australian job board · salary data australia · recruitment sourcing · lead generation · job market research · job monitoring · export to CSV/Excel/JSON · no-code job scraper · MCP tool for AI agents