# Australia Hiring Intelligence Scraper (`coregent/australia-hiring-intelligence-scraper`) Actor

Scrape public Australian job listings from supported sources such as SEEK and Jora. Extract titles, companies, locations, salaries, job types, remote/hybrid signals, skills, and hiring-signal scores - no login or cookies required.

- **URL**: https://apify.com/coregent/australia-hiring-intelligence-scraper.md
- **Developed by:** [Delowar Munna](https://apify.com/coregent) (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 $1.80 / 1,000 job-results

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

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Australia Hiring Intelligence Scraper

![Australia Hiring Intelligence Scraper](https://raw.githubusercontent.com/coregentdevspace/australia-hiring-intelligence-scraper-assets/main/thumbnail-australia-hiring-intelligence-scraper.png)

Scrape **public Australian job listings** from supported sources such as **SEEK** and **Jora** — by **keyword + location** or by **direct search/listing/career URL** — and turn them into clean, flat, CSV-friendly rows with **Australia-first normalization** (state, city, salary range, work arrangement, seniority, skills, occupation tags) and a transparent **hiring-signal score**. Built for **recruiters, staffing agencies, B2B sales teams, lead-gen, and market researchers**.

**No login, no cookies, no Apify Residential proxy, no expensive paid APIs.** The actor uses public HTTP over Crawlee `CheerioCrawler` + Cheerio, preferring embedded structured data (JSON-LD `JobPosting`) and falling back to visible HTML. You pay one flat event per unique job row that passes your filters.

### ✨ Why this scraper

- **Australia-first, not a generic global scraper** — every row carries normalized `state`, `city`, parsed AUD salary, work arrangement, seniority, and occupation/skill tags.
- **Three input modes** — keyword + location search, direct source URLs, or public career/ATS pages.
- **31 flat fields** — job identity, company, AU-normalized location, salary parsing, posting details, and hiring signals. No nested objects; drops straight into Sheets/Excel/CRMs.
- **Streaming output** — rows are written to the dataset as soon as they're ready, so you see results early instead of waiting for the whole run.
- **Pay-Per-Event** — one flat `job-result` event per saved unique job. Duplicates, filtered-out rows, and unsupported URLs are never charged.
- **Transparent hiring-signal score** — rule-based (no AI), explained below.

---

### 🚀 Quick start — sample inputs

#### Example 1 — keyword + location across SEEK and Jora

```json
{
    "searchTerms": ["data analyst", "registered nurse"],
    "locations": ["Sydney NSW", "Melbourne VIC", "Brisbane QLD"],
    "sources": ["seek", "jora"],
    "maxResults": 500,
    "postedWithinDays": 14,
    "workArrangements": ["remote", "hybrid", "onsite"],
    "jobTypes": ["full_time", "part_time", "contract"],
    "states": ["NSW", "VIC", "QLD"],
    "includeDescription": true,
    "includeSalaryParsing": true,
    "deduplicate": true,
    "proxyConfiguration": { "useApifyProxy": true }
}
````

#### Example 2 — direct source URLs + custom residential proxy via your own provider

```json
{
    "sourceUrls": [
        "https://au.jora.com/j?q=software+engineer&l=Perth+WA",
        "https://www.seek.com.au/aged-care-jobs/in-Adelaide-SA"
    ],
    "maxResults": 250,
    "postedWithinDays": 30,
    "includeDescription": true,
    "deduplicate": true,
    "proxyConfiguration": {
        "useApifyProxy": false,
        "proxyUrls": ["http://user:pass@proxy.iproyal.com:12321"]
    }
}
```

> Provide **at least one** of `searchTerms` (with optional `locations`) or `sourceUrls`. If you provide both, the actor runs both and deduplicates across the whole run. Search-mode queries run on `seek` / `jora`; `public_ats` is parsed only from directly-supplied `sourceUrls`.

> The actor blocks Apify Residential proxy; if you need residential routing, supply your own provider via `proxyConfiguration.proxyUrls` as shown. See **🚦 Proxy policy** below.

***

### 📦 Output

The dataset has one view: **Jobs & hiring signals** — a 31-column flat table.

![Australia Hiring Intelligence Scraper — Jobs & hiring signals (all fields, table view)](https://raw.githubusercontent.com/coregentdevspace/australia-hiring-intelligence-scraper-assets/main/australia-hiring-intelligence-scraper-output-all-fields-table-view.png)

#### Output fields (31)

`job_id`, `job_url`, `source`, `source_input`, `title`, `company_name`, `company_profile_url`, `location_text`, `city`, `state`, `country`, `work_arrangement`, `job_type`, `salary_text`, `salary_min_aud`, `salary_max_aud`, `salary_period`, `posted_date`, `days_old`, `classification`, `seniority`, `skills_detected`, `occupation_tags`, `description_text`, `description_length`, `application_url`, `is_agency_posted`, `hiring_signal_score`, `hiring_signal_label`, `reason_tags`, `scraped_at`.

#### Sample record — Jobs & hiring signals

A real row from a live run (`description_text` truncated here for readability):

```json
{
    "job_id": "92509614",
    "job_url": "https://au.seek.com/job/92509614",
    "source": "seek",
    "source_input": "data analyst | Sydney NSW",
    "title": "Senior Data Analyst, TRELLiS",
    "company_name": "Royal Australasian College of Physicians (RACP)",
    "company_profile_url": null,
    "location_text": "Sydney NSW",
    "city": "Sydney",
    "state": "NSW",
    "country": "Australia",
    "work_arrangement": "hybrid",
    "job_type": "full_time",
    "salary_text": null,
    "salary_min_aud": null,
    "salary_max_aud": null,
    "salary_period": "unknown",
    "posted_date": "2026-06-04",
    "days_old": 2,
    "classification": "(Information & Communication Technology)",
    "seniority": "senior",
    "skills_detected": "power bi",
    "occupation_tags": "data",
    "description_text": "About the RACP\n\nThe Royal Australasian College of Physicians (RACP) connects, represents, and trains physicians... The Senior Data Analyst is responsible for performing data analysis across multiple systems, including gathering and documenting data requirements, defining business rules, and developing complex data mappings and specifications...",
    "description_length": 4187,
    "application_url": "https://au.seek.com/job/92509614/apply",
    "is_agency_posted": false,
    "hiring_signal_score": 80,
    "hiring_signal_label": "high",
    "reason_tags": "company_visible|recent_post|job_type_visible|work_arrangement_visible|application_url_visible|rich_description|skills_detected|hybrid_signal",
    "scraped_at": "2026-06-06T04:56:22.640Z"
}
```

***

### 🎯 Hiring-signal score

Transparent rule-based score (0–100) computed from extracted fields — no AI, no external enrichment.

| Signal                                 | Points |
| -------------------------------------- | -----: |
| Salary visible                         |    +20 |
| Company name visible                   |    +15 |
| Posted within `postedWithinDays`       |    +15 |
| Job type known (not `unknown`)         |    +10 |
| Work arrangement known (not `unknown`) |    +10 |
| Application URL visible                |    +10 |
| Description length ≥ 500 chars         |    +10 |
| Skills or occupation tags detected     |    +10 |

Score is capped at 100.

**Labels**: `high` (70–100) · `medium` (40–69) · `low` (0–39).

`reason_tags` is a pipe-separated list explaining the row — e.g. `salary_visible`, `company_visible`, `recent_post`, `job_type_visible`, `work_arrangement_visible`, `application_url_visible`, `rich_description`, `skills_detected`, plus `agency_posted`, `remote_signal`, `hybrid_signal`.

***

### 💰 Pricing

**Pay-Per-Event**. One flat event per saved row (final per-event price is configured on the Apify console):

| Event        | Charged when                                                                                 |
| ------------ | -------------------------------------------------------------------------------------------- |
| `job-result` | Once per unique job row that passed all filters and was successfully written to the dataset. |

So your bill is simply `results_saved × price_per_event`. The actor honors the user-configured per-run spending cap (Apify `eventChargeLimitReached`): it both caps how many results it collects up-front to what the limit can pay for, and stops cleanly the moment the cap is reached during charging.

Not charged:

- Duplicates (deduplicated by `source + job_id`, canonical `job_url`, and title+company keys).
- Rows filtered out by `postedWithinDays` / `workArrangements` / `jobTypes` / `states`.
- Rows missing a minimum valid set (`title`, `job_url`, `source`, and one of `company_name` / `location_text`).
- Unsupported URLs, failed, or blocked requests.

#### 🚦 Proxy policy

Use **Apify Datacenter** proxy or **no proxy** for normal runs — both work for public Australian job sources at this actor's conservative concurrency.

**Apify Residential proxy is not supported.** The actor will fail at startup if `proxyConfiguration.apifyProxyGroups` includes `RESIDENTIAL`. Reason: in pay-per-event actors, residential bandwidth (~/GB) is billed to the developer, not the run user, so a single bandwidth-heavy run could exceed the per-result event revenue.

If you genuinely need residential routing, supply your own residential provider via the proxy editor's **Custom proxy URLs** field — that traffic goes through your provider, not Apify, and is unaffected:

```
http://user:pass@proxy.iproyal.com:12321
http://user:pass@proxy.brightdata.com:22225
http://user:pass@proxy.oxylabs.io:7777
```

***

### 📊 Run summary

After each run, a `RUN_SUMMARY` entry is written to the key-value store:

```json
{
    "inputs_total": 6,
    "successful_inputs": 6,
    "failed_inputs": 0,
    "source_urls_total": 0,
    "searches_generated": 6,
    "raw_results_found": 420,
    "results_saved": 280,
    "duplicates_removed": 95,
    "filtered_out": 45,
    "charged_events": 280,
    "blocked_requests": 2,
    "retry_count": 8,
    "unsupported_urls": 0,
    "source_breakdown": { "seek": 160, "jora": 120, "public_ats": 0, "unknown": 0 },
    "search_pages_fetched": 22,
    "detail_pages_visited": 140,
    "detail_skipped": 160,
    "time_to_first_result_seconds": 3,
    "runtime_seconds": 312,
    "scraped_at": "2026-06-02T00:00:00.000Z"
}
```

`charged_events` equals the number of successfully saved unique rows. `time_to_first_result_seconds`, `detail_pages_visited`, and `detail_skipped` are timing/throughput counters: rows stream to the dataset as soon as they are ready (not in one batch at the end), and a detail-page fetch is skipped whenever the listing already carries the full description.

***

### ⚙️ Filters

| Filter             | Effect                                                                                       |
| ------------------ | -------------------------------------------------------------------------------------------- |
| `postedWithinDays` | Keep rows posted within N days where date is known; rows with unknown date are kept.         |
| `workArrangements` | Keep `remote` / `hybrid` / `onsite` / `unknown`. Missing matches only if `unknown` included. |
| `jobTypes`         | Keep full\_time / part\_time / contract / casual / temporary / internship / unknown.           |
| `states`           | Keep `ACT`/`NSW`/`NT`/`QLD`/`SA`/`TAS`/`VIC`/`WA`/`UNKNOWN` after location normalization.    |
| `deduplicate`      | Drop duplicates across sources/queries; the richer of two duplicate rows is kept.            |

Filters are applied **before** any dataset push or event charge.

***

### 🚧 Limitations (V1)

- **Public data only**: no login, cookies, or member-only content. Some fields (full description, application URL) come from the job detail page and only populate when `includeDescription` is on.
- **SEEK is heavily bot-protected.** The actor uses an HTTP-first strategy (no browser): it parses SEEK's embedded structured data where reachable and degrades gracefully — logging blocks, returning partial results, and relying on Jora — rather than failing the run. Jora is the most reliable HTTP source.
- **`salary_*`** parsing is best-effort and AUD-only (no currency conversion in V1); fields stay `null`/`unknown` when salary is missing or unparseable.
- **`public_ats`** is a best-effort, vendor-agnostic JSON-LD `JobPosting` parser for directly-supplied career/ATS URLs.
- **No** recruiter/contact extraction, email enrichment, company-website crawling, or AI scoring.
- `maxResults` caps **saved unique** rows across the whole run (not per query).

***

### ❓ FAQ

**Do I need an account or cookies?**
No. The actor only uses public job listings over HTTP.

**Why are some rows missing description / application URL?**
Those come from the job detail page. They populate when `includeDescription: true` (default). With it off, runs are faster but return listing-card fields only.

**How is `state` determined?**
From the listing's location text via Australian heuristics (state abbreviations, full names, and major-city → state mapping such as Sydney → NSW, Melbourne → VIC). Unresolvable locations get `UNKNOWN`.

**Can I paste a SEEK or Jora search URL?**
Yes — put it in `sourceUrls`. The actor classifies it, preserves its filters, and paginates it for you.

**Can I export to CSV?**
Yes — every field is flat (no nested objects). Use Apify's CSV / Excel export, or call the dataset API with `format=csv`.

***

### 🛠️ Technical notes

- **Stack**: Node.js 22 · Apify SDK 3 · Crawlee `CheerioCrawler` · Cheerio. No browser.
- **Extraction**: prefers embedded JSON-LD `JobPosting` / `__NEXT_DATA__`; falls back to visible HTML cards per source.
- **Sources**: SEEK (`seek.com.au`), Jora (`au.jora.com`), and best-effort public ATS / career pages.
- **Streaming**: rows are pushed + charged the moment they're ready (during the crawl), not in a batch at the end — low time-to-first-result.
- **Detail-skip**: the per-job detail page is fetched only when the listing card lacks a full description (≥500 chars), cutting redundant requests on SEEK.
- **Concurrency**: `min=1`, `max=8`; `maxRequestRetries=3` (tune after real runs).
- **Memory**: 1 GB min · 2 GB default · 4 GB max.
- **Proxy**: Apify Proxy enabled by default; custom configs accepted; Apify Residential rejected at startup.

# Actor input Schema

## `searchTerms` (type: `array`):

Job keywords to search, for example "data analyst", "registered nurse", "aged care". Each keyword is combined with every location below. Provide at least one of Search keywords or Source URLs.

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

Search locations within Australia, for example "Sydney NSW", "Melbourne VIC", "Australia". Each keyword is paired with each location. Leave default to search Australia-wide.

## `sourceUrls` (type: `array`):

Paste public SEEK or Jora search/listing URLs, or a public career/ATS job page URL, directly. The actor classifies and paginates them for you. Login/private URLs are rejected.

## `sources` (type: `array`):

Which source families to search for keyword + location queries. Direct Source URLs are always crawled regardless of this setting.

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

Maximum number of saved unique jobs across the whole run (not per query). Range 1-10000.

## `postedWithinDays` (type: `integer`):

Keep only listings posted within this many days, where the source exposes a date/age. Rows with an unknown posting date are kept. Range 1-365.

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

Keep only jobs whose detected work arrangement is in this list. Leave empty for all. Include "unknown" to keep rows where it could not be detected.

## `jobTypes` (type: `array`):

Keep only jobs whose normalized employment type is in this list. Leave empty for all. Include "unknown" to keep rows where it could not be detected.

## `states` (type: `array`):

Keep only jobs in these Australian states/territories (after location normalization). Leave empty for all. Include "UNKNOWN" to keep rows where the state could not be determined.

## `includeDescription` (type: `boolean`):

Visit each job's detail page to extract the full description plus application URL and refined fields. Turning this off makes runs faster (listing cards only) but returns fewer fields.

## `includeSalaryParsing` (type: `boolean`):

Parse the visible salary text into numeric salary\_min\_aud / salary\_max\_aud / salary\_period. No extra page visits and no currency conversion in V1.

## `deduplicate` (type: `boolean`):

Remove duplicate jobs across sources and inputs so you are not charged for duplicates. The richer of two duplicate rows is kept.

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

Apify Proxy configuration. Defaults to Apify Proxy enabled. Apify Residential is NOT supported and will fail the run at startup; if you need residential routing, supply your own provider via Custom proxy URLs (proxyUrls).

## Actor input object example

```json
{
  "searchTerms": [
    "data analyst",
    "registered nurse"
  ],
  "locations": [
    "Sydney NSW",
    "Melbourne VIC"
  ],
  "sourceUrls": [],
  "sources": [
    "seek",
    "jora"
  ],
  "maxResults": 500,
  "postedWithinDays": 30,
  "workArrangements": [],
  "jobTypes": [],
  "states": [],
  "includeDescription": true,
  "includeSalaryParsing": true,
  "deduplicate": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Flat, CSV-friendly table of every Australian job row pushed to the dataset, including job identity, company, AU-normalized location, salary parsing, posting details, skills/occupation tags, and derived hiring-signal fields.

# 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 = {
    "searchTerms": [
        "data analyst",
        "registered nurse"
    ],
    "locations": [
        "Sydney NSW",
        "Melbourne VIC"
    ],
    "sourceUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("coregent/australia-hiring-intelligence-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 = {
    "searchTerms": [
        "data analyst",
        "registered nurse",
    ],
    "locations": [
        "Sydney NSW",
        "Melbourne VIC",
    ],
    "sourceUrls": [],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("coregent/australia-hiring-intelligence-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "data analyst",
    "registered nurse"
  ],
  "locations": [
    "Sydney NSW",
    "Melbourne VIC"
  ],
  "sourceUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call coregent/australia-hiring-intelligence-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=coregent/australia-hiring-intelligence-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Australia Hiring Intelligence Scraper",
        "description": "Scrape public Australian job listings from supported sources such as SEEK and Jora. Extract titles, companies, locations, salaries, job types, remote/hybrid signals, skills, and hiring-signal scores - no login or cookies required.",
        "version": "1.0",
        "x-build-id": "BGKF1MyyMcfqyh71W"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/coregent~australia-hiring-intelligence-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-coregent-australia-hiring-intelligence-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/coregent~australia-hiring-intelligence-scraper/runs": {
            "post": {
                "operationId": "runs-sync-coregent-australia-hiring-intelligence-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/coregent~australia-hiring-intelligence-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-coregent-australia-hiring-intelligence-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchTerms": {
                        "title": "Search keywords",
                        "type": "array",
                        "description": "Job keywords to search, for example \"data analyst\", \"registered nurse\", \"aged care\". Each keyword is combined with every location below. Provide at least one of Search keywords or Source URLs.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "locations": {
                        "title": "Locations",
                        "type": "array",
                        "description": "Search locations within Australia, for example \"Sydney NSW\", \"Melbourne VIC\", \"Australia\". Each keyword is paired with each location. Leave default to search Australia-wide.",
                        "default": [
                            "Australia"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "sourceUrls": {
                        "title": "Source URLs",
                        "type": "array",
                        "description": "Paste public SEEK or Jora search/listing URLs, or a public career/ATS job page URL, directly. The actor classifies and paginates them for you. Login/private URLs are rejected.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "sources": {
                        "title": "Sources",
                        "type": "array",
                        "description": "Which source families to search for keyword + location queries. Direct Source URLs are always crawled regardless of this setting.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "seek",
                                "jora",
                                "public_ats"
                            ],
                            "enumTitles": [
                                "SEEK",
                                "Jora",
                                "Public ATS / career pages"
                            ]
                        },
                        "default": [
                            "seek",
                            "jora"
                        ]
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of saved unique jobs across the whole run (not per query). Range 1-10000.",
                        "default": 500
                    },
                    "postedWithinDays": {
                        "title": "Posted within days",
                        "minimum": 1,
                        "maximum": 365,
                        "type": "integer",
                        "description": "Keep only listings posted within this many days, where the source exposes a date/age. Rows with an unknown posting date are kept. Range 1-365.",
                        "default": 30
                    },
                    "workArrangements": {
                        "title": "Work arrangements",
                        "type": "array",
                        "description": "Keep only jobs whose detected work arrangement is in this list. Leave empty for all. Include \"unknown\" to keep rows where it could not be detected.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "remote",
                                "hybrid",
                                "onsite",
                                "unknown"
                            ],
                            "enumTitles": [
                                "Remote",
                                "Hybrid",
                                "On-site",
                                "Unknown"
                            ]
                        },
                        "default": []
                    },
                    "jobTypes": {
                        "title": "Job types",
                        "type": "array",
                        "description": "Keep only jobs whose normalized employment type is in this list. Leave empty for all. Include \"unknown\" to keep rows where it could not be detected.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "full_time",
                                "part_time",
                                "contract",
                                "casual",
                                "temporary",
                                "internship",
                                "unknown"
                            ],
                            "enumTitles": [
                                "Full-time",
                                "Part-time",
                                "Contract",
                                "Casual",
                                "Temporary",
                                "Internship",
                                "Unknown"
                            ]
                        },
                        "default": []
                    },
                    "states": {
                        "title": "States / territories",
                        "type": "array",
                        "description": "Keep only jobs in these Australian states/territories (after location normalization). Leave empty for all. Include \"UNKNOWN\" to keep rows where the state could not be determined.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "ACT",
                                "NSW",
                                "NT",
                                "QLD",
                                "SA",
                                "TAS",
                                "VIC",
                                "WA",
                                "UNKNOWN"
                            ],
                            "enumTitles": [
                                "ACT",
                                "NSW",
                                "NT",
                                "QLD",
                                "SA",
                                "TAS",
                                "VIC",
                                "WA",
                                "Unknown"
                            ]
                        },
                        "default": []
                    },
                    "includeDescription": {
                        "title": "Include job descriptions",
                        "type": "boolean",
                        "description": "Visit each job's detail page to extract the full description plus application URL and refined fields. Turning this off makes runs faster (listing cards only) but returns fewer fields.",
                        "default": true
                    },
                    "includeSalaryParsing": {
                        "title": "Parse salary into AUD range",
                        "type": "boolean",
                        "description": "Parse the visible salary text into numeric salary_min_aud / salary_max_aud / salary_period. No extra page visits and no currency conversion in V1.",
                        "default": true
                    },
                    "deduplicate": {
                        "title": "Deduplicate jobs",
                        "type": "boolean",
                        "description": "Remove duplicate jobs across sources and inputs so you are not charged for duplicates. The richer of two duplicate rows is kept.",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify Proxy configuration. Defaults to Apify Proxy enabled. Apify Residential is NOT supported and will fail the run at startup; if you need residential routing, supply your own provider via Custom proxy URLs (proxyUrls).",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
