SEEK Jobs Scraper (AU & NZ) avatar

SEEK Jobs Scraper (AU & NZ)

Pricing

from $1.33 / 1,000 results

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

SEEK Jobs Scraper (AU & NZ)

Scrape job listings from SEEK Australia and New Zealand: title, company, location, salary, work type, classification and the full ad body. No login, no browser.

Pricing

from $1.33 / 1,000 results

Rating

0.0

(0)

Developer

Farhan Febrian Nauval

Farhan Febrian Nauval

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

SEEK Jobs Scraper — Australia & New Zealand Listings with Full Ad Bodies

Scrape job listings from SEEK AU and NZ: title, company, location, salary label, work type, classification, listing date — and optionally the complete ad body, expiry date, status and advertiser contact. HTTP-only, no account, no browser.

Input

FieldTypeDefaultDescription
searchQueriesarrayrequiredOne search per entry, e.g. registered nurse
countrystringAUAU (seek.com.au) or NZ (seek.co.nz)
locationstring—Optional place filter, e.g. Sydney. Also the way past the result ceiling
maxItemsPerQueryinteger100Jobs per search
includeDescriptionbooleanfalseFetch the full ad body; one extra request per job

Output

{
"_input": "python developer",
"_source": "S1-jobsearch-api+S2-redux-island",
"_scrapedAt": "2026-09-09T10:58:11Z",
"jobId": "94305187",
"url": "https://www.seek.com.au/job/94305187",
"title": "Python Developer",
"teaser": "If you are a Python Developer looking for a change…",
"bulletPoints": ["…", "…"],
"companyName": "Just Digital People",
"advertiserId": "29028300", "advertiserName": "Just Digital People",
"employerId": "6368", "employerName": "…", "employerUrl": "https://au.seek.com/companies/…",
"location": "Brisbane QLD",
"locations": ["Brisbane QLD"],
"countryCode": "AU",
"salaryLabel": "$87,790 - $112,607 per annum (pro rata)",
"workTypes": ["Full time"],
"workArrangements": ["On-site"],
"classifications": [
{ "classification": "Information & Communication Technology",
"subClassification": "Developers/Programmers" }
],
"listingDate": "2026-08-31T04:33:55Z",
"listingDateDisplay": "9d ago",
"isFeatured": false,
"logoUrl": "…",
// only with includeDescription:
"abstract": "Join the … team, delivering vital virtual care around Australia",
"description": "At Amplar Health, we're transforming how healthcare is delivered…",
"descriptionHtml": "<p>…</p>",
"status": "Active", "isExpired": false, "isVerified": true, "isLinkOut": true,
"expiresAt": "2026-10-09T03:44:11.000Z",
"listedAtUtc": "2026-09-09T03:45:24.586Z",
"shareLink": "https://au.seek.com/job/94514328?tracking=…",
"contactMatches": [{ "type": "Phone", "value": "(03) 8622 5666" }]
}

Three things worth knowing

totalCount is not how many jobs you can get. A bare search reports 163,544 matches, but SEEK stops serving results after roughly 500 per search — pageSize=20 dies after page 27, pageSize=100 after page 5. The ceiling is on the result set, not the page size, so asking for bigger pages does not help. The actor logs a warning when a query matches more than it can reach; the fix is to narrow the search — add a location, or split one broad query into several specific ones.

The API names fields in the plural, and the singular forms are always null. locations, workTypes and classifications carry the data; location, workType and classification exist on the object and are permanently empty. This actor reads the plural ones and also emits a convenience location string holding the first label.

The ad body comes from GraphQL, not the job page. The page carries it in a window.SEEK_REDUX_DATA island, and that was the first implementation — but the HTML page sits behind an anti-bot layer that the API host does not: from Apify it answered 403 on every TLS profile through datacenter proxies, and roughly one request in six through residential, while /api/… and /graphql on the same host answered 200 throughout. The actor uses POST /graphql, which needs no proxy upgrade and moves ~7 KB instead of a 240 KB page. (The page also has no JobPosting JSON-LD — its only structured-data node is WebSite.)

Errors

_errorMeaning
invalid_inputEmpty search query
no_resultsThe search ran and SEEK returned nothing
blockedEvery TLS profile was refused by the server
network_errorThe ladder never reached the server — DNS, timeout, reset
unexpected_shape200 with a structure this actor was not written against

A job whose body could not be fetched still produces its full search-level row, with _detailError naming the cause — detail_not_found (GraphQL has no job for that id, so the listing was removed or expired), network_error, detail_blocked, or detail_unexpected_shape. Dropping a real job because one extra request failed would be the worse outcome. The ad-body fetch repeats the whole TLS ladder once before giving up, since a page that fails on a truncated body usually succeeds seconds later.

If every query fails, the run itself fails rather than reporting success over an empty dataset.