SEEK Jobs Scraper (AU & NZ)
Pricing
from $1.33 / 1,000 results
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
Maintained by CommunityActor 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
| Field | Type | Default | Description |
|---|---|---|---|
searchQueries | array | required | One search per entry, e.g. registered nurse |
country | string | AU | AU (seek.com.au) or NZ (seek.co.nz) |
location | string | — | Optional place filter, e.g. Sydney. Also the way past the result ceiling |
maxItemsPerQuery | integer | 100 | Jobs per search |
includeDescription | boolean | false | Fetch 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
_error | Meaning |
|---|---|
invalid_input | Empty search query |
no_results | The search ran and SEEK returned nothing |
blocked | Every TLS profile was refused by the server |
network_error | The ladder never reached the server — DNS, timeout, reset |
unexpected_shape | 200 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.