# Seek.com.au Job Search with Salary & Work-Type Filters (`nimbryxo-studio/seek-com-au-job-search-with-salary-and-work-type`) Actor

Search Seek.com.au by keyword and location, or fetch specific job URLs, with work-type, work-arrangement, salary and posting-date filters, and get back title, company, salary, classification and the full description per job.

- **URL**: https://apify.com/nimbryxo-studio/seek-com-au-job-search-with-salary-and-work-type.md
- **Developed by:** [Nimbryxo-studio](https://apify.com/nimbryxo-studio) (community)
- **Categories:** Jobs, Automation, Lead generation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Seek.com.au Job Search with Salary & Work-Type Filters

Seek.com.au job pages embed their full listing data right inside the page, which this actor reads directly — no login, no cookies. Give it search URLs, or a keyword and location to build one, and it returns each matching job with company, salary, classification and the complete description, narrowed by work type, work arrangement, salary band and posting date.

### What this actor does

- Scrapes job listings from one or more Seek search URLs, or builds a search URL from a keyword, location, state and postcode
- Accepts a direct job URL as well as a search URL
- Fetches each job's own detail page for the full description and apply link, when enabled
- Filters results client-side by work type, work arrangement, posting date, salary range, subclassification and title keywords
- Can require that the job description contain an email address, a phone number, or both
- Omits a field from the record when Seek's own listing doesn't provide it

### Output per job

| Field | Description |
|---|---|
| `type` | `"job_seek"` for a normal record, or `"job_seek_blocked"` if a search matched zero jobs |
| `id` | Seek job ID |
| `url` / `jobLink` | Job page URL |
| `title` | Job title |
| `company` | Advertiser or company name |
| `companyLogo` | Company logo image URL |
| `location` | `{ city, state, postCode, country }` |
| `locationDescription` | Human-readable location label |
| `locationArea` | Seek's named area for the listing |
| `broaderLocationName` | Parent region name |
| `workType` | e.g. `Full Time`, `Contract/Temp` |
| `workTypeLabels` | Raw work-type enum values |
| `workArrangement` | e.g. `On-site`, `Hybrid`, `Remote` |
| `workArrangementTypes` | Raw work-arrangement enum values |
| `salary` | Salary as displayed on the listing |
| `salaryDetails` | `{ min, max, currency, type }` when Seek provides a parsed range |
| `postedAt` / `postedAtLabel` | Posting date, machine and display form |
| `expiresAt` | Listing expiry date |
| `classification` / `subClassification` | Seek's job category and subcategory |
| `normalisedRoleTitle` / `normalisedOrganisationName` | Seek's normalized title/company fields |
| `descriptionHtml` / `descriptionText` | Full job description, HTML and plain text |
| `teaser` | Short one-line summary |
| `bulletPoints` | Highlight bullet points from the listing |
| `questionnaire` | Screening questions, when the listing has any |
| `recruiterName` / `recruiterAgency` / `recruiterProfile` | Recruiter details, when posted by an agency |
| `advertiserId` / `advertiserName` / `advertiserVerified` | Advertiser identity and verification flag |
| `isPrivateAdvertiser` | True when the advertiser posts without a company identity |
| `isLinkOut` | True when applying sends the candidate to an external site |
| `isVerified` / `isExpired` | Listing status flags |
| `status` / `sourceZone` | Seek's internal listing status and zone |
| `isFeatured` / `isPremium` / `isStandout` / `isBranded` | Listing promotion flags |
| `displayType` | Seek's display-tier label for the listing |
| `applyUrl` / `applyLink` | Apply link |
| `directApplyUrl` | External apply target, when applying leaves Seek |
| `phoneNumber` | Recruiter phone number, when listed |
| `videoUrl` / `videoPosition` | Advertiser video, when the listing includes one |
| `branding` | `{ logoUrl, coverImageUrl, thumbnailCoverImageUrl, id }` |
| `companyId` / `companySlug` | Company profile identifiers |
| `companyIndustry` / `companySize` / `companyWebsite` | Company profile details |
| `companyDescription` / `companyRating` / `companyReviewCount` / `companyPerks` | Company profile content, when Seek has one |
| `companyProfile` | Raw nested company profile object, when returned |
| `numApplicants` | Number of applicants shown on the listing |
| `emails` / `phoneNumbers` | Contact details extracted from the job description text |
| `scrapedAt` | UTC timestamp of when the record was captured |

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `searchUrls` | array | `["https://www.seek.com.au/python-jobs"]` | Seek search or direct job URLs (required) |
| `searchTerm` | string | – | Keywords used to build a search URL when `searchUrls` isn't enough on its own |
| `location` | string | – | Location text, e.g. `Sydney NSW`, combined with `searchTerm` |
| `state` | string (select) | – (none) | Australian state: `NSW`, `VIC`, `QLD`, `WA`, `SA`, `TAS`, `ACT`, `NT` |
| `postCode` | string | – | Australian 4-digit postcode, appended to the location |
| `radius` | integer | – | Search radius in kilometres around the location (0–100) |
| `salaryType` | string (select) | `any` | `any`, `AnnualPackage`, `HourlyRate`, `MonthlyPackage`, `YearlyPackage` |
| `workTypes` | array | – | Keep only `Full Time`, `Part Time`, `Contract/Temp`, and/or `Casual/Vacation` jobs |
| `workArrangements` | array | – | Keep only `On-site`, `Hybrid`, and/or `Remote` jobs |
| `dateRange` | string (select) | `any` | Keep only jobs posted within `1`, `3`, `7`, `14`, or `30` days, or `any` time |
| `salaryMin` | integer | – | Keep only jobs whose parsed salary range reaches at least this value (AUD) |
| `salaryMax` | integer | – | Keep only jobs whose parsed salary range stays at or below this value (AUD) |
| `subclassifications` | array | – | Keep only jobs whose subclassification name matches one of these values |
| `includeOneInTitle` | array | – | Keep only jobs whose title contains at least one of these substrings |
| `requireEmail` | boolean | false | Keep only jobs whose description contains an email address |
| `requirePhone` | boolean | false | Keep only jobs whose description contains a phone number |
| `requireEmailPhone` | boolean | false | Keep only jobs whose description contains both an email address and a phone number |
| `sortBy` | string (select) | `KeywordRelevance` | `KeywordRelevance` or `ListedDate`, applied when a search URL is built from keywords |
| `maxItems` | integer | 3 | Maximum job listings to return (1–300) |
| `scrapeJobDetails` | boolean | true | Fetch each job's own page for the full description and metadata; off returns only listing-card fields |
| `proxyConfiguration` | object (proxy) | `{ "useApifyProxy": true }` | Apify proxy configuration |

#### Example: keyword and location search

```json
{
  "searchUrls": [],
  "searchTerm": "python developer",
  "location": "Sydney NSW",
  "workTypes": ["Full Time"],
  "dateRange": "7",
  "maxItems": 50
}
```

#### Example: remote jobs with a salary floor

```json
{
  "searchUrls": ["https://www.seek.com.au/jobs?keywords=data%20analyst"],
  "workArrangements": ["Remote"],
  "salaryMin": 90000,
  "sortBy": "ListedDate",
  "maxItems": 40
}
```

#### Example: a specific job URL

```json
{
  "searchUrls": ["https://www.seek.com.au/job/91572959"],
  "scrapeJobDetails": true
}
```

### Use cases

- **Recruitment sourcing** — pull fresh listings for a role and location before shortlisting candidates
- **Salary benchmarking** — collect disclosed salary ranges across a classification to gauge market rates
- **Competitive hiring intelligence** — track which companies are actively hiring in a region or field
- **Job-alert pipelines** — run on a schedule with `dateRange` set to surface only newly posted roles
- **Lead generation for recruiters** — use `requireEmail`/`requirePhone` to find listings with direct contact details

### FAQ

**Is this affiliated with Seek?**
No. This is an independent data extraction tool and has no connection to Seek Limited.

**Do I need to log in or use cookies?**
No — job listings are publicly accessible without an account.

**Does this need a proxy?**
A proxy input is included and enabled by default, since direct requests from some networks get blocked; leave the default `proxyConfiguration` in place rather than removing it.

**What happens if my search matches no jobs?**
The run still emits one record with `type: "job_seek_blocked"` so downstream pipelines never receive a completely empty dataset.

**Why is `salary` or `salaryDetails` missing from some jobs?**
Many advertisers don't disclose a salary on Seek at all; when that's the case the actor leaves those fields out rather than guessing a value.

**What's the difference between `workTypes` and `workArrangements`?**
`workTypes` filters on employment basis (full time, part time, contract, casual); `workArrangements` filters on where the work happens (on-site, hybrid, remote). They can be combined.

**What does turning off `scrapeJobDetails` change?**
With it off, you get only the fields already present on the search-results page (title, company, location, salary label, posting date); turning it on adds a second fetch per job for the full description, apply link and extra metadata.

**Does this cover New Zealand listings on seek.co.nz?**
No — this actor reads seek.com.au only.

# Actor input Schema

## `searchUrls` (type: `array`):

Seek search URLs. Examples: https://www.seek.com.au/python-jobs, https://www.seek.com.au/jobs?keywords=python\&where=Sydney, https://www.seek.com.au/job/91572959 (direct job URL also supported).

## `searchTerm` (type: `string`):

Optional keyword filter. Used to build a search URL when no searchUrls are supplied.

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

Optional location filter, e.g. "Sydney NSW" or "Melbourne VIC". Combined with searchTerm to build a /jobs?keywords=\&where= URL.

## `state` (type: `string`):

Optional Australian state filter (e.g. NSW, VIC, QLD). Appended to the location when constructing the search URL.

## `postCode` (type: `string`):

Optional Australian 4-digit postcode. Appended to the location when constructing the search URL.

## `radius` (type: `integer`):

Distance in kilometres around the location. Passed as Seek's distance parameter when building a search URL.

## `salaryType` (type: `string`):

Seek salarytype parameter. Controls how the salary range is interpreted on Seek's side.

## `workTypes` (type: `array`):

Client-side filter. Only emit jobs whose workType matches one of the selected values.

## `workArrangements` (type: `array`):

Client-side filter. Only emit jobs whose work arrangement matches one of the selected values.

## `dateRange` (type: `string`):

Client-side filter on postedAt. "any" keeps all; otherwise only emit jobs posted within the last N days.

## `salaryMin` (type: `integer`):

Client-side filter. Only emit jobs whose parsed salary max is at least this value.

## `salaryMax` (type: `integer`):

Client-side filter. Only emit jobs whose parsed salary min is at most this value.

## `subclassifications` (type: `array`):

Client-side filter. Only emit jobs whose subClassification name matches one of these values (case-insensitive).

## `includeOneInTitle` (type: `array`):

Client-side filter. Only emit jobs whose title contains at least one of the given substrings (case-insensitive).

## `requireEmail` (type: `boolean`):

Client-side filter. Only emit jobs whose description contains at least one email address.

## `requirePhone` (type: `boolean`):

Client-side filter. Only emit jobs whose description contains at least one phone number.

## `requireEmailPhone` (type: `boolean`):

Client-side filter. Only emit jobs whose description contains BOTH an email address AND a phone number.

## `sortBy` (type: `string`):

Seek sort order applied to the search URL when constructed from keywords/location.

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

Maximum job listings to return.

## `scrapeJobDetails` (type: `boolean`):

Fetch each job's detail page for the full description + extra metadata. Off = listing-card fields only.

## `proxyConfiguration` (type: `object`):

Apify proxy. Seek 403s bare datacenter IPs on Apify, so the default enables Apify's free datacenter proxy pool.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.seek.com.au/python-jobs"
  ],
  "state": "",
  "salaryType": "any",
  "dateRange": "any",
  "requireEmail": false,
  "requirePhone": false,
  "requireEmailPhone": false,
  "sortBy": "KeywordRelevance",
  "maxItems": 3,
  "scrapeJobDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `jobs` (type: `string`):

Dataset containing all scraped Seek.com.au job records.

# 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 = {
    "searchUrls": [
        "https://www.seek.com.au/python-jobs"
    ],
    "maxItems": 3,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("nimbryxo-studio/seek-com-au-job-search-with-salary-and-work-type").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 = {
    "searchUrls": ["https://www.seek.com.au/python-jobs"],
    "maxItems": 3,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("nimbryxo-studio/seek-com-au-job-search-with-salary-and-work-type").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 '{
  "searchUrls": [
    "https://www.seek.com.au/python-jobs"
  ],
  "maxItems": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call nimbryxo-studio/seek-com-au-job-search-with-salary-and-work-type --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nimbryxo-studio/seek-com-au-job-search-with-salary-and-work-type"
        }
    }
}
```

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/lgc6wlOapAcfOR1qa/builds/a1f2Qb273mF6NzMT8/openapi.json
