SEEK Scraper avatar

SEEK Scraper

Pricing

$1.60 / 1,000 results

Go to Apify Store
SEEK Scraper

SEEK Scraper

Scrape Australia and New Zealand job listings by keyword, location, or URL. Export titles, employers, salary, dates, work arrangements, and optional full descriptions.

Pricing

$1.60 / 1,000 results

Rating

0.0

(0)

Developer

MLG Data

MLG Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

9 days ago

Last modified

Categories

Share

Scrape SEEK jobs across Australia and New Zealand by keywords, location, or a direct search URL. Export SEEK job listings to CSV or JSON with salary text, work arrangements, posting dates, employer details, and optional full descriptions. This scraper offers a repeatable SEEK API alternative for collecting public job advertisements without manually paging through search results.

Each dataset row represents one distinct job ID. A run can combine several keyword and location searches, add pasted search URLs, and stop at a chosen result limit. Full details add the complete description, structured location, and verification status.

What data can you extract from SEEK?

Every output field has a stable name. Optional values are null when a job advertisement does not expose them. Salary, location, and advertiser detail coverage depends on what the advertiser publishes. Array fields are empty arrays when there are no points to report.

FieldDescriptionExample
jobIdListing ID used for deduplication94483533
seekJobIdListing ID as displayed by the site94483533
titleAdvertised job titleGraduate Software Engineer
canonicalUrlDirect link to the advertisementhttps://au.seek.com/job/94483533
companyAdvertiser name, when publishedText or null
advertiserIdPublic advertiser identifierNumeric string
companyUrlAdvertiser profile URL, if presentURL or null
locationLocation displayed on the listingMacquarie Park, Sydney NSW
locationCountryJob marketAU or NZ
locationStateStructured state or region from the detail pageNew South Wales
locationSuburbStructured suburb from the detail pageMacquarie Park
locationPostcodeStructured postal code2113
salaryTextPay wording shown in the advertisement$95,000 – $110,000 per year
salaryMinParsed lower amount if an amount is shown95000
salaryMaxParsed upper amount if a range is shown110000
salaryCurrencyCurrency inferred from the marketAUD or NZD
salaryTypeParsed pay period when statedyear, day, or hour
employmentTypeAdvertised work typeFull time
workArrangementWorkplace arrangementOn-site, Hybrid, or Remote
categoryBroad job classificationInformation & Communication Technology
subCategoryNarrow classificationEngineering - Software
roleIdRole label used by the sitesoftware-engineer
postedDateListing timestampISO timestamp
validThroughExpiration timestamp if exposedISO timestamp or null
teaserBrief ad summaryShort text
bulletPointsHighlight points from search resultsString array
descriptionFull description as readable textText or null
descriptionHtmlOriginal formatted job descriptionHTML or null
descriptionMarkdownPlain Markdown descriptionText or null
screeningQuestionsPublic screening questionsString array
phoneNumberPhone published in the adText or null
applyEmailApplication email when exposedText or null
contactNamePublic contact name when exposedText or null
extractedEmailsEmails in the public descriptionString array
extractedPhonesPhones in the public descriptionString array
extractedUrlsLinks in the public descriptionString array
socialProfilesPublic social links when exposedString array
companyLogoLogo image URL when presentURL or null
companyCoverImageUrlCover image URL when presentURL or null
companyDescriptionPublic advertiser profile text when exposedText or null
companyIndustryAdvertiser industry when exposedText or null
companySizeAdvertiser size when exposedText or null
companyWebsiteAdvertiser website when exposedURL or null
companyPerksPublic advertiser perksString array
companyReviewRatingPublic advertiser rating when exposedNumber or null
companyReviewCountPublic advertiser review countNumber or null
companySearchUrlSearch page for jobs from the advertiserURL or null
isVerifiedAdvertiserVerification flag on the job pageBoolean or null
applyUrlExternal application link if exposedURL or null
isExpiredExpiration status from the detail pageBoolean or null
isFeaturedFeatured flag from the search resultBoolean or null
applicantCountApplicant count when publicNumber or null
applicantVolumeLabelApplicant volume label when publicText or null
coverLetterPercentageCover-letter share when publicNumber or null
searchQueryKeyword source that found the rowsoftware engineer
scrapedAtExtraction timeISO timestamp

The search card may show a salary label without a clean amount. Then salaryText retains the wording and numeric fields remain null. Hourly pay is not converted to annual pay.

How to scrape SEEK

  1. Enter job keywords in query, choose AU or NZ, and add a location if you want to focus on a city or region. For a broader search, leave location empty.
  2. Set maxResults to the number of distinct jobs you need. Set maxPages to control how far each search source can paginate. A pasted search URL can be added in startUrls.
  3. Keep includeDetails enabled when you need the full ad text or structured location. Turn it off for a faster search-card dataset.
  4. Run the scraper. The dataset fills as listings are found and stops at the result cap.
  5. Download the dataset as JSON or CSV, or access it through the dataset API for scheduled processing.

For repeat searches, keep inputs consistent and compare jobId across runs. Overlapping sources emit each ID once per run.

Input

ParameterTypeDefaultDescription
queryStringEmptyKeywords; a JSON-encoded list runs multiple keyword searches.
countryStringAUAU for Australia or NZ for New Zealand.
locationStringEmptyCity, state, or region; a JSON-encoded list runs several location searches.
startUrlsString arrayEmptyDirect search or individual job URLs from either market.
maxResultsInteger50Total distinct jobs to output; 0 removes this cap.
maxPagesInteger25Maximum pages visited for each search.
sortModeStringrelevanceRelevance or newest listed first.
dateRangeStringEmptyPosting window: 1, 3, 7, 14, or 31 days.
workTypeStringEmptyOptional site work type code.
workArrangementStringEmptyOptional site workplace arrangement code.
classificationStringEmptyOptional broad classification code.
subClassificationStringEmptyOptional narrow classification code.
includeDetailsBooleantrueAdd the full job page data.
includeKeywordsString arrayEmptyKeep jobs containing at least one listed term.
excludeKeywordsString arrayEmptyDrop jobs containing any listed term.
proxyConfigurationObjectAutomaticOverride the proxy settings when needed.

A typical search for current jobs in one city is:

{
"query": "software engineer",
"country": "AU",
"location": "Sydney",
"sortMode": "date",
"maxResults": 35,
"maxPages": 3,
"includeDetails": true
}

To search several phrases in one run, put a JSON list inside the string field: "[\"data analyst\", \"business analyst\"]". The same pattern works for locations. Each keyword and location combination becomes a separate search source. Jobs are merged by listing ID, so overlapping combinations do not duplicate rows. Direct URLs add further sources; they do not replace keyword searches.

startUrls accepts search pages such as https://au.seek.com/jobs?keywords=accountant and individual job pages such as https://nz.seek.com/job/94818442. A direct job URL returns a row only when its public page has a readable title and is not marked expired. A search URL retains its own path and query filters while the scraper advances its page number. A bare homepage is not a search source.

For filtering after collection, includeKeywords checks title, advertiser, location, teaser, and full description. excludeKeywords checks title, advertiser, teaser, and full description. If a filter depends on description text, leave includeDetails on. The result cap applies to rows emitted after filtering, so a narrow filter may cause the scraper to visit more listings than the final count suggests.

Output example

This trimmed record came from a successful Australia search with details enabled. The complete dataset row also contains the remaining fields listed above. The original description and image URL are omitted here to keep the example readable.

{
"jobId": "94483533",
"seekJobId": "94483533",
"title": "Graduate Software Engineer",
"canonicalUrl": "https://au.seek.com/job/94483533",
"location": "Macquarie Park, Sydney NSW",
"locationCountry": "AU",
"locationState": "New South Wales",
"locationSuburb": "Macquarie Park",
"locationPostcode": "2113",
"salaryText": null,
"salaryMin": null,
"salaryMax": null,
"salaryCurrency": "AUD",
"employmentType": "Full time",
"workArrangement": "On-site",
"category": "Information & Communication Technology",
"subCategory": "Engineering - Software",
"postedDate": "2026-09-08T03:09:03.858Z",
"isVerifiedAdvertiser": true
}

Import jobId as text in spreadsheets. Timestamps use UTC. A null optional field means unavailable, not a negative finding; salaryText: null does not imply unpaid work.

Use cases

  • Recruiting research: Review public openings by role, place, work arrangement, and posting date to prioritize a market segment.
  • Salary benchmarking: Collect disclosed pay labels with the original text and parsed numeric amounts, then compare like pay periods and currencies.
  • Regional hiring trends: Compare AU and NZ job volumes, classifications, and newly listed roles across repeat runs.
  • Career discovery: Build a filtered feed for several keywords and nearby locations without revisiting overlapping listings.
  • Employer monitoring: Track the public job IDs and posting dates associated with a set of targeted searches.
  • Job-board analysis: Measure how often advertisers publish location, salary, and remote-work information in selected categories.

These uses rely on public advertisements. Job availability and pay wording can change between visits. For monitoring, retain collection times and compare IDs as well as posting dates.

How much does it cost to scrape SEEK?

The configured result charge is $1.60 per 1,000 emitted jobs, or $0.0016 per output row. This charge applies to rows delivered to the dataset. Platform resource usage and proxy traffic may add cost, especially when full details require a page visit for each job. The amount paid for a run therefore depends on both the emitted count and the traffic needed to obtain it.

Emitted jobsResult charge calculationResult charge
100100 × $0.0016$0.16
1,0001,000 × $0.0016$1.60
5,0005,000 × $0.0016$8.00

Start with 30–50 results to assess field coverage. Disable includeDetails when only search-card columns are needed. A low limit cannot guarantee that many results if a search returns fewer distinct jobs.

Tips for best results

Use a specific keyword and a location when you want a manageable, relevant dataset. A broad term in a large metro area may span many result pages. For wider coverage, run several role or location slices rather than expecting one very broad search to expose every matching advertisement. The scraper deduplicates IDs within each run but does not preserve a history between runs; compare exported datasets for longitudinal tracking.

Date sorting is useful for frequent monitoring. Keep a consistent dateRange and store the scrapedAt value so you can separate jobs newly posted since the previous run from old jobs that moved in search rankings. Relevance sorting may include promoted jobs at the top; it should not be interpreted as strict posting order.

Prefer full details when you need the description, structured suburb, state, postal code, verification flag, or the job page's more complete salary wording. The search-card mode is faster and adequate for titles, employers, locations, dates, categories, and teasers. Some cards already contain work arrangement and salary data, but detail pages can refine them. The maxPages limit applies separately to each query, location combination, or pasted search URL.

For NZ searches, the scraper reads structured data embedded in the public search page. For AU keyword searches, it uses the public JSON search response. Both are public sources and both can change as the site changes. Direct URLs are useful for matching an exact search configured in the site's interface, particularly when it has filters you prefer to set there first.

Limits

The scraper only returns public job pages. It does not sign in, apply, or access private applicant statistics. Broad search counts may exceed reachable pages. A high maxPages value cannot overcome a search result cap. Split broad searches by location, keyword, or classification when you need broader coverage, and deduplicate across runs by jobId.

Search pages may include promoted jobs or repeated IDs. The actor emits each ID once. An advertisement can disappear or expire between the search request and the detail request; in that case the search-card fields may remain while detail fields are empty. Some employers do not provide pay ranges, logos, profile descriptions, phone numbers, or external application links. Those fields stay null rather than receiving guessed values.

Applicant counts, screening questions, and application contact details are not exposed by the current public source and remain empty. Public pages have access controls. Datacenter requests were blocked during verification, while residential requests returned structured data. The fetch layer rotates its session and escalates its proxy when blocked. This can increase runtime and traffic cost. If access controls change, a run may yield fewer rows or fail until the extraction path is adjusted. Very broad searches can also be slower because full details add one request for each distinct job considered.

Pay parsing is conservative. It extracts visible numbers and recognizes common hourly, daily, and yearly wording. It does not normalize currencies, estimate undisclosed compensation, or infer whether an amount is base salary plus benefits. For compensation analysis, retain salaryText alongside the parsed amounts and filter to comparable salaryType values. The market sets salaryCurrency; it is not an exchange conversion.

Automated workflows

Schedule the same input, then compare jobId with prior datasets. Filters can route selected roles into a review queue. Treat optional fields as nullable.

For example: “Collect up to 50 software engineer jobs in Sydney, including descriptions, and keep roles mentioning a selected skill.” Or: “Collect New Zealand analyst jobs in Auckland, sorted by listing date, and show title, location, work arrangement, and posting date.” The actor's input can be reused in a schedule or an API call, and its dataset URL can feed the next processing step.

FAQ

The scraper collects publicly visible job advertisements. You are responsible for respecting the site's terms, applicable privacy law, and any limits on reuse. Avoid personal-data misuse and collect only the fields your workflow needs. Public availability does not by itself grant unlimited republication rights.

Do I need to configure proxies?

The default proxy settings are intended for normal runs. Public pages blocked datacenter traffic during verification, so the fetch layer may escalate to a residential session. You can provide your own proxy configuration if your account and workload require it. Changes to site access controls may still affect results.

How fast is a run?

Search-card runs need relatively few requests because each page carries multiple jobs. Full-detail runs fetch a job page for every distinct listing that reaches enrichment, so they take longer. Runtime also varies with the number of search sources, filtering, page depth, and access-control retries. A verified 35-job AU run with details completed successfully; treat that as a functional check, not a fixed speed guarantee.

Yes. Reuse the same input on a schedule, export each dataset, and compare jobId across runs. A posting date helps order the results, while scrapedAt records when the row was collected. This actor does not maintain a built-in change history between runs.

Can I export to a spreadsheet?

Yes. Download CSV for a spreadsheet or JSON for a programmatic pipeline. Import the ID as text to preserve it exactly. The overview table surfaces common columns, while the downloaded row includes the complete field set.

Why is salary or advertiser information empty?

Advertisers choose what to publish. Salary, profile, logo, phone, and some structured location fields are not universal. Detail enrichment can add fields missing from the search card, but it cannot create values that the public page does not expose. An empty value is represented as null or an empty array.

Can I scrape an individual job URL?

Yes. Put a supported AU or NZ /job/<id> URL in startUrls. The scraper reads its public structured detail data and emits a row if the job is readable and not marked expired. Search pages can be supplied in the same input and will paginate until the relevant cap is reached.

Integrations

Use the dataset API or download a file to move rows into a database, spreadsheet, dashboard, or notification workflow. Webhooks and scheduled runs can hand the dataset URL to downstream services. Keep the exported schema stable by reading field names rather than table column positions, and account for null in optional fields. For monitoring, store prior IDs and timestamps outside the actor so each run can be compared with earlier collections.

Support

Open an issue on the Issues tab; we reply within 24h and add fields on request.