Seek Australia Jobs Scraper icon

Jobs

Seek Australia Jobs Scraper

Search Seek.com.au by keyword and Australian location and get back normalized job rows — classification/subclassification taxonomy, flattened location hierarchy, work type and arrangement, salary label, listing date, and teaser — at ~$1.80/1,000 results, priced mid-pack above the observed $1-flat competitor floor and below premium enrichment offerings.

Free Apify credit covers a first run. No credit card to try.

What this Actor scrapes

Seek.com.au (au.seek.com) is Australia's largest job board, listing postings across every industry from thousands of employers. This Actor searches Seek's own listings by job title/keyword and/or a free-text Australian location and writes one normalized row per posting: title, company, classification and subclassification using Seek's own taxonomy, a flattened location hierarchy (suburb → state → country), work type and work arrangement, salary label, listing date, and a teaser summary. It's built for recruiters and staffing agencies sourcing candidates on Seek, AU job-aggregator operators backfilling listings, and HR-tech builders who need structured Australian job-market data without hand-rolling their own Seek integration. Everything is sourced from Seek's own public job-search index — no login, no API key.

What we handle for you

  • 🛡️ We rotate browser fingerprintscurl-cffi impersonation (Chrome / Firefox / Safari) so Seek sees real-browser TLS, not Python.
  • 🌐 We rotate residential proxies through Apify Proxy on every block — fresh session ID, fresh AU exit IP, pinned to the Australian market.
  • 🔁 We retry with exponential backoff on 408 / 429 / 503 and honour Retry-After — up to 5 attempts per page.
  • 🌏 We verify the market on every response — before any row ships, we check Seek's own market signal and each job's country code. A mismatch rotates the session and retries instead of quietly shipping the wrong country's jobs.
  • 🧱 We fail loud, not silent — a hard block surfaces a clear status message naming pages fetched vs. blocked, instead of a quietly empty dataset.
  • 🧊 We keep the dataset clean — Pydantic-validated rows, ISO-8601 timestamps, deduplicated job IDs, JSON / CSV / Excel export straight from the Apify Console.
  • 💰 Pay-Per-Event pricing — you only pay for rows that land in your dataset, plus one small flat warm-up fee per run.

Use cases

  • Recruiting pipelines — pull fresh Seek postings matching a role profile straight into your ATS or sourcing sheet.
  • AU job-aggregator feeds — normalize Seek listings into a consistent schema alongside other job boards.
  • Market and hiring-trend research — track classification, location, and work-type distribution across Australia over time.
  • Competitive intelligence — monitor which employers are actively hiring for a role or in a region on Seek.

Input

Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.

FieldTypeRequiredWhat it does
keywords string no Job title/keyword search, e.g. "python developer". Leave empty to browse all postings for the chosen location.
where string no Free-text Australian location (suburb, city, or state) resolved server-side by Seek's own location graph.
classificationFilter string no Optional case-insensitive substring match against a job's classification or subclassification description. Applied client-side after fetch — Seek's server-side classification query-param name is unconfirmed. Leave…
maxResults integer no Hard cap on dataset rows emitted per run.
{
  "keywords": "developer",
  "where": "Sydney NSW",
  "maxResults": 5
}

Output

One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.

job_idtitlecompany_nameclassification_descriptionsubclassification_descriptionlocation_labellocation_hierarchywork_typeswork_arrangementsalary_labellisting_dateteaseris_featuredurlscraped_at

{
  "job_id": "78234561",
  "title": "Senior Python Developer",
  "company_name": "Acme Digital",
  "advertiser_id": "30442112",
  "advertiser_description": "Acme Digital",
  "classification_id": "6281",
  "classification_description": "Information & Communication Technology",
  "subclassification_id": "6287",
  "subclassification_description": "Developers/Programmers",
  "location_label": "Sydney NSW",
  "location_country_code": "AU",
  "location_hierarchy": [
    "Sydney",
    "NSW",
    "Australia"
  ],
  "work_types": [
    "Full time"
  ],
  "work_arrangement": "Hybrid",
  "salary_label": "$120,000 \u2013 $140,000 + super",
  "listing_date": "2026-08-16T22:11:00Z",
  "listing_date_display": "1h ago",
  "teaser": "Join our platform team building distributed systems at scale...",
  "is_featured": false,
  "display_type": "standout",
  "role_id": "python-developer",
  "url": "https://au.seek.com/job/78234561",
  "scraped_at": "2026-08-17T09:00:00Z"
}

Pricing

EventPriceWhen
Actor start$0.20Once per run, covers warm-up and proxy session setup.
Result row$0.0018Per result written to the dataset.

You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.

Limitations

  • Teaser-only, not the full job description. The full posting body lives behind Seek's Cloudflare-walled /job/{id} detail page; only the search index's teaser text is captured in v1. This is a deliberate scope decision, not a silent gap.
  • salaryLabel is free text only. Seek's search API returns salary as a display string, not structured numbers — no min/max fields are emitted or inferred. Expect salary_label to be null on the many postings where an employer doesn't publish a figure.
  • One location per job. When a posting lists more than one location, only the primary (locations[0]) entry is emitted — there's no multi-location row breakout in v1.
  • Australia only. This Actor targets au.seek.com exclusively. Seek's other country domains (nz.seek.com and siblings) aren't in scope.
  • classificationFilter is a client-side filter, not a server-side search parameter. It matches Seek's own classification/subclassification names against rows already fetched for your keywords/where — it narrows what gets emitted, it doesn't change what gets requested from Seek.

FAQ

Do I need a Seek account or API key?
No. This Actor reads Seek's own public job-search index — no login, no API key, no credentials of any kind.
Why is `salary_label` sometimes null?
Seek doesn't require employers to publish a salary. We surface exactly what's published as free text — never an estimated or invented range.
Can I get the full job description text?
Not in v1 — see Limitations. The detail page carrying the full description sits behind a Cloudflare challenge; the teaser field is the description-like text this Actor sources in v1.
Does this cover NZ or other Seek country sites?
No. This Actor is scoped to au.seek.com only.
What happens if Seek blocks the run?
We rotate browser fingerprints, proxies, and sessions automatically, and re-verify the market on every response. If a run still gets blocked after retries, it fails loudly with a clear status message naming pages fetched vs. blocked — never a silent empty dataset.
What does `classificationFilter` match against?
Seek's own classification and subclassification names (e.g. "Information & Communication Technology", "Developers/Programmers"), matched case-insensitively as a substring, applied after your keywords/where search runs.

Ready to run it?

Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.

Related Actors

Teams that run this also run