# Seek & Jobstreet Jobs Scraper (AU, NZ, MY, SG, ID, PH) (`praguedatalab/seek-jobstreet-scraper`) Actor

Scrape Seek and Jobstreet job ads from the public JSON API: title, company, salary, location, category, work type, description, company profile. No proxy needed. $0.40 per 1,000 jobs.

- **URL**: https://apify.com/praguedatalab/seek-jobstreet-scraper.md
- **Developed by:** [Prague Data Lab](https://apify.com/praguedatalab) (community)
- **Categories:** Jobs, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.40 / 1,000 job listings

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/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 & Jobstreet Jobs Scraper — Australia, New Zealand, Malaysia, Singapore and more

Scrape Seek and Jobstreet job ads (Australia, New Zealand, Malaysia, Singapore, Indonesia, Philippines, plus JobsDB Hong Kong and Thailand) and get one clean row per ad: title, company, salary parsed into min, max, currency and period, location, category, work type, work arrangement, full description (text, HTML and Markdown), expiry date and the company profile. **$0.40 per 1,000 jobs.** No browser, no login, no proxy needed.

### Quick start

Minimal input:

```json
{
    "query": "data engineer",
    "country": "AU",
    "location": "All Sydney NSW",
    "maxResults": 30
}
```

Several searches in one run (every query × country × place; jobs found twice are saved once, and `maxResults` is shared between the searches):

```json
{
    "queries": ["data engineer", "data analyst"],
    "countries": ["AU", "NZ", "MY"],
    "sortMode": "date",
    "postedWithinDays": "7",
    "workArrangement": "3",
    "maxResults": 300
}
```

Or paste a search URL (or a job URL) from the browser: `{"startUrls": ["https://www.seek.com.au/software-engineer-jobs/in-All-Sydney-NSW/full-time/hybrid?daterange=7"], "maxResults": 100}`.

**Compatible with the input of `blackfalcondata/seek-scraper`, `blackfalcondata/jobstreet-scraper` and `websift/seek-job-scraper`**, so you can switch by changing only the Actor ID:

- From the blackfalcondata Actors: `query`, `country` (AU, NZ, MY, SG, ID, PH), `location`, `startUrls`, `maxResults`, `maxPages`, `sortMode`, `dateRange`, `workType`, `workArrangement`, `classification`, `subClassification`, `salaryMin`, `salaryMax`, `includeKeywords`, `excludeKeywords`, the `keywordMatch…` switches, `fromDate`, `toDate`, `maxAgeMinutes`, `includeDetails`, `descriptionFormat`, `descriptionMaxLength`, `compact`, `excludeEmptyFields`.
- From websift: `searchTerm`, `searchUrl`, `maxResults`, `sortBy` (KeywordRelevance, ListedDate), `dateRange` (a number of days), `country` (`australia`, `new zealand`, `malaysia`, `singapore`, `indonesia`, `philippines`, `hongkong`, `thailand`), `location`, `radius`, `salaryType`, `salaryMin`, `salaryMax`, `workTypes` (fulltime, parttime, contract, casual), `workArrangements` (on-site, hybrid, remote), `suburbOrCity`, `state`, `postCode`, `includeOneInTitle` and the true/false category switches (`accounting`, `accounts-payable`, `construction-management`…: all 423 are mapped to SEEK categories).
- Their output field names are kept too (`seekJobId`, `jobId`, `id`, `title`, `company`, `advertiser`, `location`, `locationCountry`, `salaryText`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryType`, `employmentType`, `workTypes`, `workArrangement`, `category`, `subCategory`, `bulletPoints`, `teaser`, `description`, `descriptionHtml`, `descriptionMarkdown`, `postedDate`, `listedAt`, `validThrough`, `expiresAtUtc`, `canonicalUrl`, `jobLink`, `isFeatured`…).
- Not supported, ignored with a warning: notifications (Telegram, Slack, Discord, WhatsApp, webhooks), incremental mode, custom filters, applicant counts, salary estimation. Use Apify schedules and integrations instead. `requireContact`, `requireEmail` and `requirePhone` are ignored on purpose: this Actor never extracts e-mail addresses or phone numbers.

Two small differences: the Apify platform checks input types, and the two leaders disagree on `dateRange` (text for blackfalcondata, a number for websift), so this field is not declared in the form and accepts both. The form has `postedWithinDays` instead. The websift `content` object is not reproduced: use `descriptionHtml` or `description`.

### Sample output row

Real row from a run on 23 October 2026 (long texts shortened here):

```json
{
    "seekJobId": "95377914",
    "jobId": "95377914",
    "id": "95377914",
    "title": "Technical Lead, Data Engineering (Azure)",
    "company": "Indigenous Business Australia",
    "companyId": "795433",
    "companySlug": "indigenous-business-australia-795433",
    "companyUrl": "https://au.seek.com/companies/indigenous-business-australia-795433",
    "companyLogo": "https://image-service-cdn.seek.com.au/562e590ca9f235a8b04ec2da94f446cc2954db47/f3c5292cec0e05e4272d9bf9146f390d366481d0",
    "companyIndustry": "Non-Profit Organisations",
    "companySize": "101-1,000 employees",
    "companyWebsite": "http://www.iba.gov.au/",
    "companyDescription": "IBA is a commercially focused organisation. Economic independence for Aboriginal and Torres Strait Islander peoples is at the heart of what we do. Our programs …",
    "companyReviewRating": 3.1,
    "companyReviewCount": 13,
    "advertiserId": "24876952",
    "advertiser": {
        "id": "24876952",
        "name": "Indigenous Business Australia",
        "isVerified": true,
        "isPrivate": false,
        "registrationDate": "2009-06-03T04:19:56.000Z"
    },
    "isVerifiedAdvertiser": true,
    "isPrivateAdvertiser": false,
    "location": "Sydney NSW",
    "locations": [
        "Sydney NSW"
    ],
    "locationCountry": "AU",
    "salaryText": "$163682 - $191782 p.a.",
    "salaryMin": 163682,
    "salaryMax": 191782,
    "salaryCurrency": "AUD",
    "salaryType": "annual",
    "employmentType": "Full time",
    "workTypes": [
        "Full time"
    ],
    "workArrangement": "Hybrid",
    "category": "Government & Defence",
    "categoryId": "1210",
    "subCategory": "Government - Federal",
    "subCategoryId": "1409",
    "classifications": [
        {
            "categoryId": "1210",
            "category": "Government & Defence",
            "subCategoryId": "1409",
            "subCategory": "Government - Federal"
        }
    ],
    "roleId": "Data-Engineering-Lead",
    "bulletPoints": [],
    "teaser": "Work with an organisation that drives financial inclusion and economic empowerment with Aboriginal and Torres Strait Islander people.",
    "description": "As the Technical Lead, Data Engineering, you will:\n\n- Be responsible for designing scalable, efficient and reliable data pipelines and systems.\n- Work alongside the architecture function to make decisions about choiceof …",
    "descriptionHtml": "<p>As the Technical Lead, Data Engineering, you will:<br> </p><ul><li>Be responsible for designing scalable, efficient and reliable data pipelines and systems.</li><li>Work alongside the architecture function to make dec…",
    "descriptionMarkdown": "As the Technical Lead, Data Engineering, you will:\n\n- Be responsible for designing scalable, efficient and reliable data pipelines and systems.\n- Work alongside the architecture function to make decisions about choiceof …",
    "descriptionLength": 1501,
    "postedDate": "2026-10-20T06:00:23.933Z",
    "listedAt": "2026-10-20T06:00:23.933Z",
    "validThrough": "2026-11-19T06:00:22.000Z",
    "expiresAtUtc": "2026-11-19T06:00:22.000Z",
    "isFeatured": false,
    "isExpired": false,
    "listingStatus": "Active",
    "canonicalUrl": "https://www.seek.com.au/job/95377914",
    "jobLink": "https://www.seek.com.au/job/95377914",
    "site": "seek.com.au",
    "detailFetched": true,
    "scrapedAt": "2026-10-23T11:17:27.545Z"
}
```

### Input

| Field | Type | Description |
|---|---|---|
| `query` | string | Job title, skill or any words from the ad. Several searches: `["data engineer", "data analyst"]` (a JSON list) or use `queries`. Empty = all jobs. `searchTerm` is accepted too. |
| `country` | string | Which SEEK site to search. The lower-case names are the values used by websift/seek-job-scraper. Several countries: use `countries`. |
| `location` | string | City, region, suburb or postcode as SEEK writes it. Examples: `All Sydney NSW`, `Melbourne VIC`, `Auckland`, `Kuala Lumpur`, `Singapore`. Empty = the whole country. Several places: a JSON list or use `locations`. |
| `maxResults` | integer | Maximum number of jobs saved in total (you pay per job). 0 = as many as possible (capped at 5,000). SEEK serves at most 550 jobs per search; use several queries, locations or categories for more. `maxItems` is accepted too. |
| `queries` | array | Several search terms, one search each. Jobs found twice are saved once. |
| `countries` | array | Search several SEEK sites in one run. Added to `country`. |
| `locations` | array | Several places, one search each (for every query and country). |
| `startUrls` | array | SEEK, Jobstreet or JobsDB search URLs copied from the browser (`https://www.seek.com.au/software-jobs/in-All-Sydney-NSW/full-time?daterange=7`) or job URLs (`https://nz.seek.com/job/12345678`). When set, query, country and location are ignored. `searchUrl` is accepted too. |
| `maxPages` | integer | Safety bound per search, in pages of about 22 jobs (25 pages = the 550 jobs SEEK serves). |
| `sortMode` | string | Most relevant first, or newest first. `sortBy` (KeywordRelevance, ListedDate) is accepted too. |
| `postedWithinDays` | string | Only jobs posted in the last N days. The leaders' `dateRange` is accepted too, as text (`"7"`) or as a number (`7`, any number of days up to 365); it is not declared in this form because the two leaders disagree on its type. |
| `workType` | string | Employment type. `workTypes` (a list of fulltime, parttime, contract, casual) is accepted too. |
| `workArrangement` | string | On-site, hybrid or remote. `workArrangements` (a list of on-site, hybrid, remote) is accepted too. |
| `classification` | string | SEEK role family. The true/false category switches of websift/seek-job-scraper (`accounting`, `accounts-payable`…) are accepted too. |
| `subClassification` | string | SEEK sub-category id (`6286` = Database Development & Administration), name or slug (`developers-programmers`). Pair it with its category. |
| `salaryMin` | integer | SEEK's own salary filter, in the local currency. Annual on Seek, monthly on Jobstreet and JobsDB (`salaryType`: annual, monthly or hourly). 0 = no limit. |
| `salaryMax` | integer | Upper end of the salary filter. 0 = no limit. |
| `includeKeywords` | array | Keep a job only if it contains at least one of these words anywhere in the ad. |
| `excludeKeywords` | array | Drop a job if its title, company, teaser, bullet points or description contains any of these words. |
| `fromDate` | string | ISO date or date-time, for example `2026-10-01`. Empty = no limit. |
| `toDate` | string | ISO date or date-time. A bare date means that whole day. Empty = no limit. |
| `maxAgeMinutes` | integer | Only jobs posted within this many minutes before the run. 0 = no limit. |
| `includeDetails` | boolean | Read each ad for the full description (text, HTML, Markdown), expiry date and advertiser. Same price either way. |
| `includeCompanyProfile` | boolean | Add industry, size, website, description and review rating when the advertiser has a company profile. Needs full details. |
| `descriptionFormat` | string | `all` keeps description (text), descriptionHtml and descriptionMarkdown; the others keep only that one. |
| `descriptionMaxLength` | integer | Cut descriptions to this many characters. 0 = keep everything. |
| `compact` | boolean | Keep only the core fields: id, title, company, location, salary, category, work type, date, link. Good for AI agents. |
| `excludeEmptyFields` | boolean | Remove null, empty text and empty list fields from each row. |
| `proxyConfiguration` | object | Not needed: SEEK answers from Apify's datacenter servers. Set a proxy only if your runs get blocked. |

Also accepted, without a field in the form: `searchTerm`, `searchUrl`, `sortBy`, `dateRange`, `workTypes`, `workArrangements`, `salaryType` (annual, monthly or hourly), `radius` (km), `maxItems`, `includeOneInTitle`, `keywordMatchTitle`, `keywordMatchCompany`, `keywordMatchDescription`, `keywordMatchCategory`, `keywordMatchBulletPoints` and the websift category switches.

### Output fields

| Field | Description |
|---|---|
| `seekJobId` | SEEK job id (deduplication key). Also in `jobId` and `id`. |
| `jobId` | Same as `seekJobId` (field name of blackfalcondata/seek-scraper). |
| `id` | Same as `seekJobId` (field name of websift/seek-job-scraper). |
| `title` | Job title. |
| `company` | Company or advertiser name; "Private Advertiser" when the ad hides it. |
| `companyId` | SEEK company profile id (null when the advertiser has no company profile). |
| `companySlug` | Company profile slug, e.g. `harvey-norman-432314`. |
| `companyUrl` | Company profile page on SEEK, Jobstreet or JobsDB. |
| `companyLogo` | Logo URL of the advertiser. |
| `companyIndustry` | Industry from the company profile. |
| `companySize` | Company size band from the profile, e.g. `1,001-5,000 employees`. |
| `companyWebsite` | Company website from the profile. |
| `companyDescription` | Company overview text from the profile. |
| `companyReviewRating` | Average employee review rating (1-5) shown on the company profile. |
| `companyReviewCount` | Number of employee reviews behind the rating. |
| `advertiserId` | SEEK advertiser id (a recruitment agency or the employer itself). |
| `advertiser` | Advertiser of the ad (field shape of websift/seek-job-scraper). |
| `isVerifiedAdvertiser` | SEEK verified advertiser (needs job details). |
| `isPrivateAdvertiser` | The advertiser name is hidden ("Private Advertiser"). |
| `location` | Main location label as SEEK shows it, e.g. `Sydney NSW`, `Kuala Lumpur`. |
| `locations` | All locations of the ad. |
| `locationCountry` | Country code of the location (AU, NZ, MY, SG, ID, PH, HK, TH). |
| `salaryText` | Salary text exactly as the ad shows it (null when none). |
| `salaryMin` | Lower end of the salary parsed from `salaryText` (a single figure sets min and max). |
| `salaryMax` | Upper end of the salary parsed from `salaryText`. |
| `salaryCurrency` | Currency code (AUD, NZD, MYR, SGD, IDR, PHP, HKD, THB…) of the parsed salary. |
| `salaryType` | Pay period of the parsed salary: annual, monthly, weekly, daily or hourly (null when the ad does not say). |
| `employmentType` | Work type label: Full time, Part time, Contract/Temp, Casual/Vacation. |
| `workTypes` | Work type labels (list form of `employmentType`). |
| `workArrangement` | On-site, Hybrid or Remote (comma separated when the ad allows several). |
| `category` | Role family (classification), e.g. `Information & Communication Technology`. |
| `categoryId` | SEEK classification id of the role family. |
| `subCategory` | Sub-category, e.g. `Database Development & Administration`. |
| `subCategoryId` | SEEK sub-classification id. |
| `classifications` | Every category/sub-category pair of the ad. |
| `roleId` | SEEK role slug, e.g. `data-engineer`. |
| `bulletPoints` | The three highlight lines the advertiser wrote for the search result. |
| `teaser` | One-sentence summary shown in search results. |
| `description` | Full job description as plain text (needs job details; `descriptionFormat` all or text). |
| `descriptionHtml` | Full job description as HTML (needs job details; `descriptionFormat` all or html). |
| `descriptionMarkdown` | Full job description as Markdown (needs job details; `descriptionFormat` all or markdown). |
| `descriptionLength` | Length of the plain-text description in characters, before any `descriptionMaxLength` cut. |
| `postedDate` | When the ad was listed, ISO 8601 UTC. Also in `listedAt`. |
| `listedAt` | Same as `postedDate` (field name of websift/seek-job-scraper). |
| `validThrough` | When the ad expires, ISO 8601 UTC (needs job details). Also in `expiresAtUtc`. |
| `expiresAtUtc` | Same as `validThrough` (field name of websift/seek-job-scraper). |
| `isFeatured` | Promoted (featured) ad. |
| `isExpired` | The ad has expired (needs job details). |
| `listingStatus` | Ad status, e.g. `Active` (needs job details). |
| `canonicalUrl` | Link to the ad on SEEK, Jobstreet or JobsDB. Also in `jobLink`. |
| `jobLink` | Same as `canonicalUrl` (field name of websift/seek-job-scraper). |
| `site` | Site the ad comes from: seek.com.au, nz.seek.com, my.jobstreet.com, sg.jobstreet.com, id.jobstreet.com, ph.jobstreet.com, hk.jobsdb.com, th.jobsdb.com. |
| `detailFetched` | True when the job details (description, expiry, advertiser) were read. |
| `scrapedAt` | When the row was produced, ISO 8601 UTC. |

Fields that come from the job details (description, expiry, advertiser) or from the company profile are `null` when the details are off or when SEEK has no profile for the advertiser (recruitment agencies and private advertisers usually have none).

### Countries

| Country | Code | Site | Brand |
|---|---|---|---|
| Australia | AU | seek.com.au | Seek |
| New Zealand | NZ | nz.seek.com (seek.co.nz redirects there) | Seek |
| Malaysia | MY | my.jobstreet.com | Jobstreet |
| Singapore | SG | sg.jobstreet.com | Jobstreet |
| Indonesia | ID | id.jobstreet.com | Jobstreet |
| Philippines | PH | ph.jobstreet.com | Jobstreet |
| Hong Kong | HK | hk.jobsdb.com | JobsDB |
| Thailand | TH | th.jobsdb.com | JobsDB |

### Pricing

**$0.0004 per job saved ($0.40 per 1,000)**, charged as the `job` event. Job details and the company profile are included. There is no platform-usage charge on top, no start fee and no charge for runs that find nothing. Set a maximum cost on the run and it stops cleanly when the limit is reached.

### Limits and notes

- **550 jobs per search.** SEEK serves at most 550 results for one search, whatever the total shown. For more, add queries, places, categories or a date filter: searches are cheap and jobs found twice are saved once.
- **Places** are written as SEEK writes them: `All Sydney NSW`, `Melbourne VIC`, `Auckland`, `Kuala Lumpur`, `Singapore`, a suburb or a postcode. An unknown place finds nothing, and the run says so in its status message.
- **Salary** is parsed from the text of the ad (`$140,000 – $150,000 per year`, `RM 4,000 – RM 6,000 per month`, `Rp 13.200.000 – Rp 14.500.000 per month`, `$900-1000 per day`). `salaryText` is always the original text; `salaryType` stays null when the ad gives no period and the site is not Seek. The salary filter is SEEK's own: annual on Seek, monthly on Jobstreet and JobsDB.
- **Company data only.** The Actor never extracts recruiter names, photos, e-mail addresses or phone numbers, and never asks SEEK for them. The description is the ad text as the advertiser published it, so it can contain a contact line the advertiser wrote.
- **Polite by design.** One request at a time with a short pause, job details and company profiles batched ten at a time. About 30 requests for 250 jobs.
- **Runs on a small machine** (256 to 512 MB). In local tests 30 jobs took about 9 seconds, 250 jobs about 20 seconds and 549 jobs about 40 seconds. The prefill input returns 30 jobs.

# Actor input Schema

## `query` (type: `string`):

Job title, skill or any words from the ad. Several searches: <code>\["data engineer", "data analyst"]</code> (a JSON list) or use <code>queries</code>. Empty = all jobs. <code>searchTerm</code> is accepted too.

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

Which SEEK site to search. The lower-case names are the values used by websift/seek-job-scraper. Several countries: use <code>countries</code>.

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

City, region, suburb or postcode as SEEK writes it. Examples: <code>All Sydney NSW</code>, <code>Melbourne VIC</code>, <code>Auckland</code>, <code>Kuala Lumpur</code>, <code>Singapore</code>. Empty = the whole country. Several places: a JSON list or use <code>locations</code>.

## `maxResults` (type: `integer`):

Maximum number of jobs saved in total (you pay per job). 0 = as many as possible (capped at 5,000). SEEK serves at most 550 jobs per search; use several queries, locations or categories for more. <code>maxItems</code> is accepted too.

## `queries` (type: `array`):

Several search terms, one search each. Jobs found twice are saved once.

## `countries` (type: `array`):

Search several SEEK sites in one run. Added to <code>country</code>.

## `locations` (type: `array`):

Several places, one search each (for every query and country).

## `startUrls` (type: `array`):

SEEK, Jobstreet or JobsDB search URLs copied from the browser (<code>https://www.seek.com.au/software-jobs/in-All-Sydney-NSW/full-time?daterange=7</code>) or job URLs (<code>https://nz.seek.com/job/12345678</code>). When set, query, country and location are ignored. <code>searchUrl</code> is accepted too.

## `maxPages` (type: `integer`):

Safety bound per search, in pages of about 22 jobs (25 pages = the 550 jobs SEEK serves).

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

Most relevant first, or newest first. <code>sortBy</code> (KeywordRelevance, ListedDate) is accepted too.

## `postedWithinDays` (type: `string`):

Only jobs posted in the last N days. The leaders' <code>dateRange</code> is accepted too, as text (<code>"7"</code>) or as a number (<code>7</code>, any number of days up to 365); it is not declared in this form because the two leaders disagree on its type.

## `workType` (type: `string`):

Employment type. <code>workTypes</code> (a list of fulltime, parttime, contract, casual) is accepted too.

## `workArrangement` (type: `string`):

On-site, hybrid or remote. <code>workArrangements</code> (a list of on-site, hybrid, remote) is accepted too.

## `classification` (type: `string`):

SEEK role family. The true/false category switches of websift/seek-job-scraper (<code>accounting</code>, <code>accounts-payable</code>…) are accepted too.

## `subClassification` (type: `string`):

SEEK sub-category id (<code>6286</code> = Database Development & Administration), name or slug (<code>developers-programmers</code>). Pair it with its category.

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

SEEK's own salary filter, in the local currency. Annual on Seek, monthly on Jobstreet and JobsDB (<code>salaryType</code>: annual, monthly or hourly). 0 = no limit.

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

Upper end of the salary filter. 0 = no limit.

## `includeKeywords` (type: `array`):

Keep a job only if it contains at least one of these words anywhere in the ad.

## `excludeKeywords` (type: `array`):

Drop a job if its title, company, teaser, bullet points or description contains any of these words.

## `fromDate` (type: `string`):

ISO date or date-time, for example <code>2026-10-01</code>. Empty = no limit.

## `toDate` (type: `string`):

ISO date or date-time. A bare date means that whole day. Empty = no limit.

## `maxAgeMinutes` (type: `integer`):

Only jobs posted within this many minutes before the run. 0 = no limit.

## `includeDetails` (type: `boolean`):

Read each ad for the full description (text, HTML, Markdown), expiry date and advertiser. Same price either way.

## `includeCompanyProfile` (type: `boolean`):

Add industry, size, website, description and review rating when the advertiser has a company profile. Needs full details.

## `descriptionFormat` (type: `string`):

<code>all</code> keeps description (text), descriptionHtml and descriptionMarkdown; the others keep only that one.

## `descriptionMaxLength` (type: `integer`):

Cut descriptions to this many characters. 0 = keep everything.

## `compact` (type: `boolean`):

Keep only the core fields: id, title, company, location, salary, category, work type, date, link. Good for AI agents.

## `excludeEmptyFields` (type: `boolean`):

Remove null, empty text and empty list fields from each row.

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

Not needed: SEEK answers from Apify's datacenter servers. Set a proxy only if your runs get blocked.

## Actor input object example

```json
{
  "query": "data engineer",
  "country": "AU",
  "location": "All Sydney NSW",
  "maxResults": 30,
  "queries": [],
  "countries": [],
  "locations": [],
  "startUrls": [],
  "maxPages": 25,
  "sortMode": "relevance",
  "includeKeywords": [],
  "excludeKeywords": [],
  "includeDetails": true,
  "includeCompanyProfile": true,
  "descriptionFormat": "all",
  "descriptionMaxLength": 0,
  "compact": false,
  "excludeEmptyFields": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "query": "data engineer",
    "country": "AU",
    "location": "All Sydney NSW",
    "maxResults": 30,
    "queries": [],
    "countries": [],
    "locations": [],
    "startUrls": [],
    "sortMode": "relevance",
    "postedWithinDays": "",
    "workType": "",
    "workArrangement": "",
    "classification": "",
    "subClassification": "",
    "salaryMin": 0,
    "salaryMax": 0,
    "includeKeywords": [],
    "excludeKeywords": [],
    "fromDate": "",
    "toDate": "",
    "maxAgeMinutes": 0
};

// Run the Actor and wait for it to finish
const run = await client.actor("praguedatalab/seek-jobstreet-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 = {
    "query": "data engineer",
    "country": "AU",
    "location": "All Sydney NSW",
    "maxResults": 30,
    "queries": [],
    "countries": [],
    "locations": [],
    "startUrls": [],
    "sortMode": "relevance",
    "postedWithinDays": "",
    "workType": "",
    "workArrangement": "",
    "classification": "",
    "subClassification": "",
    "salaryMin": 0,
    "salaryMax": 0,
    "includeKeywords": [],
    "excludeKeywords": [],
    "fromDate": "",
    "toDate": "",
    "maxAgeMinutes": 0,
}

# Run the Actor and wait for it to finish
run = client.actor("praguedatalab/seek-jobstreet-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 '{
  "query": "data engineer",
  "country": "AU",
  "location": "All Sydney NSW",
  "maxResults": 30,
  "queries": [],
  "countries": [],
  "locations": [],
  "startUrls": [],
  "sortMode": "relevance",
  "postedWithinDays": "",
  "workType": "",
  "workArrangement": "",
  "classification": "",
  "subClassification": "",
  "salaryMin": 0,
  "salaryMax": 0,
  "includeKeywords": [],
  "excludeKeywords": [],
  "fromDate": "",
  "toDate": "",
  "maxAgeMinutes": 0
}' |
apify call praguedatalab/seek-jobstreet-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,praguedatalab/seek-jobstreet-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/K4IboCcMaUlm0tYtT/builds/8zFoteXsyHS1aKfCv/openapi.json
