How to use Seek Jobs Scraper
Step by step: in the Apify Store, over the API, from JavaScript or Python, in n8n, and from AI agents through MCP or LangChain.
$1.80 per 1,000 jobs (live Apify price on 2026-10-31).
1. In the Apify Store (no code)
- Open arcadium/seek-jobs and sign in to Apify (a free account works).
- Fill in the input form. The fields below are the ones the example uses.
- Set a maximum cost per run in the run options if you want a hard cap.
- Start the run. Rows appear in the Output tab as they arrive.
- Export the dataset as JSON, CSV or Excel, or connect an integration.
| Input field | Type | Description |
|---|---|---|
keywords | array | What to search for, e.g. ["data analyst", "registered nurse", "electrician"]. Each keyword is searched in every location below. |
locations | array | Places as you would type them on Seek, e.g. ["Sydney NSW", "Melbourne VIC", "Brisbane", "Auckland"]. The place Seek matched is returned in searchLocation. Empty = the whole country. |
startUrls | array | Seek search pages, e.g. https://www.seek.com.au/data-analyst-jobs/in-Sydney-NSW?daterange=3 or https://www.seek.co.nz/jobs/in-Auckland. Keywords, place and Seek's own filters are read from the URL. |
maxJobsPerSearch | integer | Jobs per keyword and location or URL, 1 to 550 (default 100). Seek shows at most 550 jobs per search; split big searches by place or filters. |
Example input:
{
"keywords": [
"data analyst"
],
"locations": [
"Sydney NSW"
],
"startUrls": [],
"maxJobsPerSearch": 50
}
2. Over the Apify API
The synchronous endpoint runs the actor and returns its rows in one call (for runs up to about five minutes; use the asynchronous run endpoint for longer ones).
curl -X POST "https://api.apify.com/v2/acts/arcadium~seek-jobs/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords":["data analyst"],"locations":["Sydney NSW"],"startUrls":[],"maxJobsPerSearch":50}'
3. From JavaScript
// npm install apify-client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('arcadium/seek-jobs').call({
"keywords": [
"data analyst"
],
"locations": [
"Sydney NSW"
],
"startUrls": [],
"maxJobsPerSearch": 50
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
4. From Python
# pip install apify-client
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("arcadium/seek-jobs").call(run_input={
"keywords": ["data analyst"],
"locations": ["Sydney NSW"],
"startUrls": [],
"maxJobsPerSearch": 50,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
5. In n8n
Paste this node into a workflow (it is a plain HTTP Request node). Create a Header Auth credential with name Authorization and value Bearer <APIFY_TOKEN>; each returned row becomes one item for the next node.
{
"nodes": [
{
"name": "Run arcadium/seek-jobs",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [
0,
0
],
"parameters": {
"method": "POST",
"url": "https://api.apify.com/v2/acts/arcadium~seek-jobs/run-sync-get-dataset-items",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "{\"keywords\":[\"data analyst\"],\"locations\":[\"Sydney NSW\"],\"startUrls\":[],\"maxJobsPerSearch\":50}",
"options": {
"timeout": 300000
}
}
}
],
"connections": {}
}
6. From an AI assistant (MCP)
Add Apify’s MCP server to Claude Desktop, Cursor, VS Code or any MCP client, limited to this actor:
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com/?tools=arcadium/seek-jobs",
"headers": {
"Authorization": "Bearer <APIFY_TOKEN>"
}
}
}
}
More on the MCP page.
7. From LangChain
# pip install langchain-apify (reads APIFY_API_TOKEN from the environment)
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("arcadium/seek-jobs")
rows = tool.invoke({"run_input": {
"keywords": ["data analyst"],
"locations": ["Sydney NSW"],
"startUrls": [],
"maxJobsPerSearch": 50,
}})
# or give `tool` to an agent: create_react_agent(llm, [tool])
Sample output
One row, from the example in the actor’s README. Long text is shortened and lists are cut to two items.
{
"rowType": "job",
"platform": "seek",
"jobId": "95426731",
"url": "https://www.seek.com.au/job/95426731",
"title": "Data Analysis Officer",
"companyName": "Macquarie University",
"advertiserName": "Macquarie University",
"advertiserId": "28800385",
"companyProfileUrl": "https://au.seek.com/companies/macquarie-university-432440",
"location": "Sydney NSW",
"area": "Ryde & Macquarie Park",
"suburb": "North Ryde",
"state": "New South Wales",
"postcode": "2113",
"country": "AU",
"classification": "Information & Communication Technology",
"subClassification": "Other",
"workTypes": [
"Full time"
],
"workArrangements": [
"Hybrid"
],
"salaryLabel": null,
"salary": null,
"listedAt": "2026-10-22T03:18:06Z",
"listedAgo": "8h ago",
"expiresAt": "2026-11-21T03:18:04.000Z",
"teaser": "We are hiring an enthusiastic Data Analysis Officer to join our team!",
"bulletPoints": [],
"description": "$102,136 - 112,741 per annum (HEW Level 6), plus 17% employer's superannuation and annual leave loading\nFull-time, 16-month fixed-term contract ...",
"normalizedTitle": "Data Analytics Officer",
"applyOnSeek": false,
"featured": false,
"companyWebsite": "http://mq.edu.au/",
"companySize": "1,001-5,000 employees",
"companyIndustry": "Education, Training & Professional Development",
"companyRating": 3.4,
"companyReviewCount": 85,
"detailsIncluded": true,
"source": "data analyst in Sydney NSW (AU)",
"sourceType": "search",
"searchKeyword": "data analyst",
"searchLocation": "Sydney NSW 2000",
"position": 11,
"scrapedAt": "2026-10-22T12:00:00.000Z"
}
| Field | What it holds |
|---|---|
rowType | Kind of row. Filter on this first. Values: 'job': one job listing (charged). 'error': a search, place or URL gave no jobs; see code and message (free). |
platform | Always 'seek'. |
jobId | Seek job id (digits), stable across runs. Use it to deduplicate. |
url | Job page on Seek, e.g. https://www.seek.com.au/job/95399131. |
title | Job title as posted. |
companyName | Hiring company as the ad shows it. Null for 'Private Advertiser' ads and posters that could be a private person. |
advertiserName | Account that placed the ad (the employer or a recruitment agency). Null when it could be a private person. |
advertiserId | Seek advertiser id; null when advertiserName is withheld. |
companyProfileUrl | The company's Seek profile page, when it has one. |
location | Location as shown, e.g. 'Sydney NSW' or 'North Ryde, Sydney NSW'. |
area | Seek's area of the location, e.g. 'CBD, Inner & Western Suburbs' (job details). |
suburb | Suburb or city (job details), e.g. 'North Ryde'. |
state | State (job details), e.g. 'New South Wales'. Null in New Zealand. |
postcode | Postcode (job details), e.g. '2113'. |
country | Country of the job: AU or NZ. |
classification | Seek classification, e.g. 'Information & Communication Technology'. |
subClassification | Seek sub-classification, e.g. 'Business/Systems Analysts'. |
workTypes | Values: 'Full time', 'Part time', 'Contract/Temp', 'Casual/Vacation'. |
workArrangements | Values: 'On-site', 'Hybrid', 'Remote'. |
salaryLabel | Pay text as the advertiser wrote it, e.g. '$140k-$170k+Super'. Null when hidden. |
salary | Pay parsed from salaryLabel {min, max, currency, period, source}; currency is AUD or NZD. Null when unsure. |
listedAt | When the job was listed, ISO 8601. |
listedAgo | Listing age as Seek shows it, e.g. '1d ago'. |
expiresAt | When the ad closes, ISO 8601 (job details). |
teaser | The short summary shown in search results. |
bulletPoints | Up to three selling points of the ad, e.g. 'Flexible working'. |
description | Full job description (job details) as plain text or cleaned HTML; emails, phone numbers and greeting names removed. |
normalizedTitle | Seek's normalised role title, e.g. 'Data Analyst' (job details). |
applyOnSeek | True when you apply on Seek, false when the ad sends you to the employer's site (job details). |
featured | True for a featured (paid) placement in the search. |
companyWebsite | Company website from its Seek profile (job details). Null without a profile. |
companySize | Company size from its Seek profile, e.g. '1,001-5,000 employees'. |
companyIndustry | Industry from the company's Seek profile. |
companyRating | Average employee rating on Seek, 1 to 5. Null when not rated. |
companyReviewCount | Number of employee reviews behind companyRating. |
detailsIncluded | True when the job details were read for this row. |
source | The search this job came from, e.g. 'data analyst in Sydney NSW (AU)' or a URL. |
sourceType | Values: 'search' (keyword and place), 'url' (a Seek search URL). |
searchKeyword | Keyword of the search; null for place-only searches. |
searchLocation | Place Seek matched for the search, e.g. 'Sydney NSW 2000'. Null for the whole country. |
position | 1-based rank of the job in its search. |
jobsDb | Only with jobsDbExport: {companyDomain, fingerprint} for merging with other job sources. |
scrapedAt | When the row was read, ISO 8601. |
input | Error rows only: the search or URL that gave no jobs. |
code | Error rows only. Values: not_found, no_match, unavailable, blocked, invalid_input. |
message | Error rows only: what went wrong, in plain words. |
Schedule it
In Apify Console, create a Task from your input and add a Schedule (for example daily). Each run writes a new dataset; integrations can push the rows to Google Sheets, Slack, a webhook or your database.