SEEK Jobs Scraper: AU & NZ, Salary & Full Description avatar

SEEK Jobs Scraper: AU & NZ, Salary & Full Description

Pricing

from $1.00 / 1,000 jobs

Go to Apify Store
SEEK Jobs Scraper: AU & NZ, Salary & Full Description

SEEK Jobs Scraper: AU & NZ, Salary & Full Description

Search SEEK Australia and New Zealand by keyword, location, work type and date. Get title, company, salary, work arrangement, listing date, bullet points and optionally the full description. Pay per job returned.

Pricing

from $1.00 / 1,000 jobs

Rating

0.0

(0)

Developer

Nekruz Kasimov

Nekruz Kasimov

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

Search seek.com.au and seek.co.nz by keyword, location and work type, and get clean job data: title, company, location, salary label, work type, remote or hybrid arrangement, classification, listing date, teaser, bullet points, URL, and optionally the full description.

Fast and cheap: it uses SEEK's own search API, no browser needed.

Use cases

  • Build a niche job board or alert for Australia and New Zealand.
  • Track hiring trends, salaries and demand by role or city.
  • Feed recruiting tools, CRMs or AI agents with fresh listings.
  • Monitor competitors' open roles.

Input

FieldDescription
keywordsSearch terms, e.g. python developer, registered nurse.
locationSydney, Melbourne VIC, Auckland, All Australia, etc.
countryAU or NZ. Default AU.
workTypesAny of full-time, part-time, contract, casual.
sortModeListedDate (newest first, the default) or KeywordRelevance.
maxJobsStop after this many jobs. Default 100, maximum 5000.
postedAfterISO date; keep only jobs listed on or after it. Good for daily incremental runs.
includeDescriptionFetch the full description per job (one extra request each). Off by default.

Output

{
"jobId": "95172980",
"title": "Tech Savvy Finance and Operations Manager",
"company": "SuperEd Pty Ltd",
"location": "Sydney NSW",
"countryCode": "AU",
"salary": "$110,000 – $155,000 per year",
"workType": "Full time",
"workArrangement": "Remote",
"isRemote": true,
"classification": "Accounting",
"subClassification": "Financial Managers & Controllers",
"listedAt": "2026-10-09T08:07:31Z",
"teaser": "Are you ready to be a cornerstone of a company ...",
"bulletPoints": ["Join Australia's leading Retirement Advice provider", "..."],
"url": "https://www.seek.com.au/job/95172980",
"scrapedAt": "2026-10-13T00:00:00.000Z"
}

With includeDescription, each job also has descriptionPlain and descriptionHtml. If the description could not be fetched, both are null and a descriptionError field says why (for example HTTP 503). Jobs also carry advertiserId and isFeatured.

The key-value store OUTPUT record has the total number of matching jobs on SEEK, pages fetched, jobs pushed and description failures. It contains:

  • site, keywords, location: what was searched.
  • totalOnSite: the number of matching jobs SEEK reports. With a postedAfter in the last 30 days it is SEEK's count for that date window, not all-time.
  • pagesFetched, jobsPushed: search pages read and jobs saved to the dataset.
  • jobsCharged: jobs billed under pay-per-event pricing, otherwise null.
  • descriptionFailures: jobs saved without a description. descriptionsRecovered: descriptions that failed once and succeeded on the automatic retry. descriptionsStopped: true if the Actor stopped requesting descriptions because SEEK kept failing (see Pricing).
  • chargeLimitReached: true if the run stopped at your maximum charge per run.
  • partial, failedPage, error: partial is false on a complete run. If a search page after the first one failed after retries, it is true, failedPage is that page number and error says what failed and how many jobs were kept.
  • filteredOut: { postedAfter, duplicates }, the jobs SEEK returned that the Actor dropped. postedAfter counts jobs listed before your postedAfter date (or without a listing date), duplicates counts jobs already seen earlier in the run. Present on every run; dropped jobs are free.

Pricing

You pay per job returned. Filtered-out jobs are free. Set a maximum charge per run to cap spend; the Actor stops cleanly when it is reached (chargeLimitReached is true in OUTPUT).

With includeDescription, a job whose description could not be fetched is not charged. Failed requests are retried (rate limits and server errors get one more try after a short pause); if the description is still missing, the job is returned with descriptionError set and counted in descriptionFailures. It still counts toward maxJobs. If SEEK's job-details requests keep failing (5 descriptions in a row, then a failed retry), the Actor stops requesting descriptions for the rest of the run: the remaining jobs are returned uncharged with a descriptionError starting "not requested", and descriptionsStopped is true in OUTPUT.

Notes

  • SEEK returns at most 100 jobs per page; very broad searches are capped by SEEK itself at a few thousand results.
  • isRemote reflects SEEK's own "Remote" work arrangement label.
  • If a search page after the first one fails after retries, the jobs already collected are kept and the run is marked partial in OUTPUT. The status message then reads "Done: N jobs of T matching (incomplete, see OUTPUT)". If the first page fails, the run fails.
  • Input is checked before any request is made. maxJobs must be a whole number of at least 1, country must be AU or NZ (case and spaces ignored), and every workTypes entry must be one of full-time, part-time, contract, casual. Otherwise the run fails with an error that names the field and the value it got, instead of searching with a different setting. null for keywords, location, maxJobs, country or workTypes means the default.
  • A run that saves no jobs ends with "Done: 0 jobs.
  • A postedAfter within the last 30 days is also sent to SEEK as a date range, so SEEK filters server-side; the exact date check still runs on each job.
  • Rate limits (HTTP 429), server errors (5xx) and network errors are tried up to 3 times. The Actor waits for the Retry-After the server sends (at most 60 s), otherwise 1.5 s, then 3 s.