# SEEK Job Scraper $2/1K - Australia & New Zealand Job Listings (`ahmed_jasarevic/seek-job-scraper`) Actor

Scrape job listings from SEEK (seek.com.au / seek.co.nz): job title, company, location, salary, employment type, full description, posted date and advertiser. Uses SEEK's public JSON search API + GraphQL detail API (no browser needed)

- **URL**: https://apify.com/ahmed\_jasarevic/seek-job-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## SEEK Job Scraper — Australia & New Zealand

Scrape job listings from **SEEK** ([seek.com.au](https://www.seek.com.au) / [seek.co.nz](https://www.seek.co.nz)), Australia and New Zealand's largest job boards. Extract **job title, company, location, salary, employment type, full description, posted date and advertiser** for any keyword search.

This Actor talks directly to SEEK's public JSON search API and GraphQL detail API — **no browser needed**, which makes it fast and cheap to run. It supports both countries, date filtering, relevance/date sorting, and optional full-description enrichment. Runs on the Apify platform with API access, scheduling, monitoring and proxy rotation built in.

### Why use this Actor?

- **Recruitment agencies** — monitor live job ads for your clients' competitors, or track hiring demand by keyword/location.
- **Job aggregators** — pull structured SEEK listings (title, company, salary, location, type) into your own feed.
- **HR & labor-market analytics** — build time-series datasets of job postings, salary bands and employer activity across AU/NZ.
- **Researchers** — collect full job descriptions and advertiser metadata at scale.

SEEK's HTML pages sit behind a Cloudflare challenge, but its underlying APIs return full structured JSON with a plain browser User-Agent. This Actor uses those APIs directly, so it avoids the browser overhead and the anti-bot friction entirely.

### How to use this Actor

1. Open the Actor in Apify Console and click **Start**.
2. Enter your **Keywords** (e.g. `software engineer`) — this is the only required field.
3. Optionally set **Location** (e.g. `All Sydney NSW`, `All Melbourne VIC`, `All Australia`, `All New Zealand`), **Country** (AU/NZ), **Max Items**, **Date Range** and **Sort Mode**.
4. Leave **Include Full Description** on to also fetch each job's full description, advertiser verification, status and expiry via SEEK's GraphQL API.
5. Click **Start** and download the results from the **Dataset** tab in JSON, CSV, Excel or HTML.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `keywords` | string | — | **Required.** Search keywords, e.g. `software engineer`. |
| `location` | string | `All Australia` | SEEK location string, e.g. `All Sydney NSW`, `All Melbourne VIC`, `All New Zealand`. |
| `country` | enum | `AU` | `AU` = seek.com.au, `NZ` = seek.co.nz. |
| `maxItems` | int | `50` | Max jobs to scrape (hard cap 1000). |
| `includeFullDescription` | bool | `true` | Fetch full description + advertiser/status/expiry via GraphQL. |
| `dateRange` | int | `0` | Only jobs posted in the last N days (`0` = no filter). |
| `sortMode` | enum | `KeywordRelevance` | `KeywordRelevance` or `ListedDate` (newest first). |
| `proxy` | proxy | Residential | Apify Proxy configuration. |

### Output

Each dataset item is a flat JSON object. Example:

```json
{
  "jobId": "93953663",
  "url": "https://www.seek.com.au/job/93953663",
  "title": "Software Engineer (Developer)",
  "company": "Coadys Personnel Consultants",
  "advertiserId": "62736356",
  "advertiserName": "Coadys Personnel Consultants P/L",
  "advertiserVerified": true,
  "location": "Sydney NSW",
  "salary": "$85K - $95K + Super",
  "employmentType": "Full time",
  "workArrangement": "Hybrid",
  "postedDate": "2026-08-13T05:36:28Z",
  "postedDateDisplay": "3d ago",
  "teaser": "This is a superb opportunity for a Developer to join an award-winning technology company...",
  "bulletPoints": ["...", "..."],
  "classification": "Information & Communication Technology",
  "abstract": "This is a superb opportunity for a Developer...",
  "fullDescription": "This is a superb opportunity for a Developer to join an award-winning technology company who develop superior solutions...",
  "status": "Active",
  "isExpired": false,
  "expiresAt": "2026-09-12T05:36:28Z",
  "recruiterPhone": "",
  "country": "AU",
  "query": "software engineer"
}
```

You can download the dataset in various formats such as **JSON, HTML, CSV, or Excel**.

### Data table

| Field | Description |
|---|---|
| `jobId` | SEEK job ID |
| `url` | Direct link to the job ad |
| `title` | Job title |
| `company` | Company name (from search result) |
| `advertiserId` / `advertiserName` / `advertiserVerified` | Advertiser (recruiter/employer) details |
| `location` | Job location label |
| `salary` | Salary label (only when the advertiser published one) |
| `employmentType` | e.g. Full time, Part time, Contract |
| `workArrangement` | Remote / Hybrid / On-site |
| `postedDate` / `postedDateDisplay` | ISO date and human-readable "X ago" |
| `teaser` / `bulletPoints` | Search-result summary |
| `classification` | SEEK category, e.g. Information & Communication Technology |
| `abstract` / `fullDescription` | Job summary and full description (plain text) |
| `status` / `isExpired` / `expiresAt` | Listing status and expiry |
| `recruiterPhone` | Recruiter phone number when published |
| `country` / `query` | Which site was scraped and the keyword used |

### How much does it cost to scrape SEEK?

The Actor uses plain HTTP (no browser), so runs are cheap. A 50-job run with full descriptions makes roughly **53 requests** and typically finishes in under a minute. Free Apify users get a capped preview of **10 jobs** per run; paid users can scrape up to 1000 jobs per run. Residential proxy usage is included in Apify paid plans.

### Tips & advanced options

- **Speed vs. detail**: set `includeFullDescription: false` to halve the request count when you only need search-level data (title, company, salary, location, date).
- **Fresh data**: combine `sortMode: ListedDate` with `dateRange: 7` to track only the last week's postings.
- **Whole-country scans**: use `All Australia` or `All New Zealand` as the location.
- **Scale**: raise `maxItems` up to 1000 for larger datasets; the Actor paginates automatically.

### FAQ, disclaimers & support

- **Is scraping SEEK legal?** Scraping publicly available job listings may be subject to SEEK's Terms of Service. You are responsible for complying with applicable laws and SEEK's terms when using this data.
- **Why no browser?** SEEK's HTML pages are Cloudflare-protected, but its public JSON/GraphQL APIs return the same data without a browser. This Actor uses those APIs, which keeps it fast, cheap and reliable.
- **Known limitations**: salary is only present when the advertiser published it (many AU ads hide it); the GraphQL detail endpoint can occasionally rate-limit under heavy use (the Actor retries automatically); SEEK's unofficial API endpoints may change — if that happens, the Actor will be updated.
- **Support**: open an issue on the Actor's Issues tab, or contact the author for custom solutions (e.g. scheduled runs, company tracking, or integration with your analytics pipeline).

# Actor input Schema

## `keywords` (type: `string`):

Search keywords, e.g. "software engineer", "data analyst", "nurse".

## `location` (type: `string`):

SEEK location string, e.g. "All Sydney NSW", "All Melbourne VIC", "All Australia", "All New Zealand". Leave empty for the whole country.

## `country` (type: `string`):

Which SEEK site to scrape.

## `maxItems` (type: `integer`):

Maximum number of jobs to scrape (hard cap 1000).

## `includeFullDescription` (type: `boolean`):

Fetch each job's full description, advertiser details, status and expiry via SEEK's GraphQL API. Disable for a faster, cheaper run that only returns search-result data.

## `dateRange` (type: `integer`):

Only scrape jobs posted in the last N days. 0 = no date filter.

## `sortMode` (type: `string`):

How to sort results.

## `proxy` (type: `object`):

Apify Proxy with Residential IPs is recommended to avoid blocking.

## Actor input object example

```json
{
  "keywords": "software engineer",
  "location": "All Australia",
  "country": "AU",
  "maxItems": 50,
  "includeFullDescription": true,
  "dateRange": 0,
  "sortMode": "KeywordRelevance",
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": "software engineer",
    "location": "All Australia",
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/seek-job-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": "software engineer",
    "location": "All Australia",
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/seek-job-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": "software engineer",
  "location": "All Australia",
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call ahmed_jasarevic/seek-job-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ahmed_jasarevic/seek-job-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/uKaK4aTWZRNuy0dP7/builds/EwkSdLvDmuK2eZrNq/openapi.json
