Arcadium Data Scrapers
Home / Guides / Seek Jobs Scraper

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)

  1. Open arcadium/seek-jobs and sign in to Apify (a free account works).
  2. Fill in the input form. The fields below are the ones the example uses.
  3. Set a maximum cost per run in the run options if you want a hard cap.
  4. Start the run. Rows appear in the Output tab as they arrive.
  5. Export the dataset as JSON, CSV or Excel, or connect an integration.
Input fieldTypeDescription
keywordsarrayWhat to search for, e.g. ["data analyst", "registered nurse", "electrician"]. Each keyword is searched in every location below.
locationsarrayPlaces 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.
startUrlsarraySeek 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.
maxJobsPerSearchintegerJobs 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"
}
FieldWhat it holds
rowTypeKind 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).
platformAlways 'seek'.
jobIdSeek job id (digits), stable across runs. Use it to deduplicate.
urlJob page on Seek, e.g. https://www.seek.com.au/job/95399131.
titleJob title as posted.
companyNameHiring company as the ad shows it. Null for 'Private Advertiser' ads and posters that could be a private person.
advertiserNameAccount that placed the ad (the employer or a recruitment agency). Null when it could be a private person.
advertiserIdSeek advertiser id; null when advertiserName is withheld.
companyProfileUrlThe company's Seek profile page, when it has one.
locationLocation as shown, e.g. 'Sydney NSW' or 'North Ryde, Sydney NSW'.
areaSeek's area of the location, e.g. 'CBD, Inner & Western Suburbs' (job details).
suburbSuburb or city (job details), e.g. 'North Ryde'.
stateState (job details), e.g. 'New South Wales'. Null in New Zealand.
postcodePostcode (job details), e.g. '2113'.
countryCountry of the job: AU or NZ.
classificationSeek classification, e.g. 'Information & Communication Technology'.
subClassificationSeek sub-classification, e.g. 'Business/Systems Analysts'.
workTypesValues: 'Full time', 'Part time', 'Contract/Temp', 'Casual/Vacation'.
workArrangementsValues: 'On-site', 'Hybrid', 'Remote'.
salaryLabelPay text as the advertiser wrote it, e.g. '$140k-$170k+Super'. Null when hidden.
salaryPay parsed from salaryLabel {min, max, currency, period, source}; currency is AUD or NZD. Null when unsure.
listedAtWhen the job was listed, ISO 8601.
listedAgoListing age as Seek shows it, e.g. '1d ago'.
expiresAtWhen the ad closes, ISO 8601 (job details).
teaserThe short summary shown in search results.
bulletPointsUp to three selling points of the ad, e.g. 'Flexible working'.
descriptionFull job description (job details) as plain text or cleaned HTML; emails, phone numbers and greeting names removed.
normalizedTitleSeek's normalised role title, e.g. 'Data Analyst' (job details).
applyOnSeekTrue when you apply on Seek, false when the ad sends you to the employer's site (job details).
featuredTrue for a featured (paid) placement in the search.
companyWebsiteCompany website from its Seek profile (job details). Null without a profile.
companySizeCompany size from its Seek profile, e.g. '1,001-5,000 employees'.
companyIndustryIndustry from the company's Seek profile.
companyRatingAverage employee rating on Seek, 1 to 5. Null when not rated.
companyReviewCountNumber of employee reviews behind companyRating.
detailsIncludedTrue when the job details were read for this row.
sourceThe search this job came from, e.g. 'data analyst in Sydney NSW (AU)' or a URL.
sourceTypeValues: 'search' (keyword and place), 'url' (a Seek search URL).
searchKeywordKeyword of the search; null for place-only searches.
searchLocationPlace Seek matched for the search, e.g. 'Sydney NSW 2000'. Null for the whole country.
position1-based rank of the job in its search.
jobsDbOnly with jobsDbExport: {companyDomain, fingerprint} for merging with other job sources.
scrapedAtWhen the row was read, ISO 8601.
inputError rows only: the search or URL that gave no jobs.
codeError rows only. Values: not_found, no_match, unavailable, blocked, invalid_input.
messageError 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.