# SEEK Jobs Scraper (`rjmacarthy/seek-jobs-scraper`) Actor

Scrape jobs from SEEK Australia and New Zealand (seek.com.au, seek.co.nz): title, company, salary (parsed), classification, work type, work arrangement, bullet points and full descriptions. Search by keywords and filters or paste SEEK URLs. Incremental mode outputs only new jobs.

- **URL**: https://apify.com/rjmacarthy/seek-jobs-scraper.md
- **Developed by:** [rj](https://apify.com/rjmacarthy) (community)
- **Categories:** Jobs, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 job scrapeds

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 Jobs Scraper: Extract Jobs from seek.com.au and seek.co.nz (Australia & New Zealand)

**SEEK Jobs Scraper** pulls job listings from **SEEK**, the largest job board in Australia and New Zealand, and returns clean, structured job data: title, company, location, salary (as listed **and** parsed into min / max / currency / per hour or year), classification and sub-classification, work type, work arrangement (on-site / hybrid / remote), bullet points, listing date and, optionally, the full description.

It reads the same JSON search API that SEEK's own website uses, so it is **fast and cheap**: no login and no browser. 550 jobs without descriptions take about 6 requests and a few seconds. You **only pay for the jobs you get**.

### What can this SEEK scraper do?

- 🔎 **Search like on SEEK.** Keywords, location (suburb, city, region, state or postcode), classification, work type, work arrangement, date listed (today / 3 / 7 / 14 / 31 days) and salary range (annual, monthly or hourly). Filters run on SEEK's side, so you only pay for matching jobs.
- 🔗 **Or paste SEEK URLs.** Copy any search results URL from your browser (`/developer-jobs-in-information-communication-technology/in-All-Melbourne-VIC?daterange=7&worktype=242`) and the filters in it are used as-is. Single job links (`/job/12345678`) work too.
- 🇦🇺 🇳🇿 **Australia and New Zealand.** seek.com.au and seek.co.nz, with salaries in AUD or NZD.
- 💰 **Salaries you can sort and filter.** SEEK's free-text salary (`"$150-$170K+ superannuation"`, `"$35.73 – $38.53 per hour"`, `"ASO5 ($92,122 - $102,456) plus 12% superannuation"`) is parsed into `min`, `max`, `currency` and `interval`. When the ad hides its salary and you fetch descriptions, a salary stated in the description is used instead (marked `source: "description"`).
- 📄 **Full descriptions.** One extra request per job adds the description as HTML and plain text, the expiry date, whether you apply on SEEK or an external site, a verified-advertiser flag and the company profile (industry, size, website).
- 🔁 **Incremental monitoring.** Turn on **Only new jobs** and schedule the Actor. Each run outputs, and charges for, only jobs that were not seen before. A repeat run with nothing new costs one request and no jobs.
- 🧩 **Same schema as our other jobs Actors.** `id`, `company`, `title`, `location`, `isRemote`, `workplaceType`, `employmentType`, `salary{min,max,currency,interval,text,source}`, `postedAt`, `jobUrl`, `applyUrl`, `descriptionText` / `descriptionHtml` match our ATS Jobs Scraper and Workday Jobs Scraper, plus SEEK-specific fields.
- 💸 **Pay per job.** No start fee and no compute charges to worry about.

### Why this scraper instead of the alternatives?

| | **SEEK Jobs Scraper** | The two most-used SEEK Actors (Nov 2026) |
|---|---|---|
| Price per job | **$0.0015**, no start fee | $0.002–$0.0025; one also charges $0.01 per run |
| Shown salary parsed into min / max / currency / interval | ✅ Included, with a fallback to a salary stated in the description | Text only at one, parsed at the other |
| Estimates of hidden salaries | ❌ Not offered | One sells this as a $0.003-per-result add-on |
| Incremental "only new jobs" mode | ✅ One request when nothing is new | One of the two |
| Paste search URLs from the browser | ✅ Path and query filters | Both |
| Same output schema as our ATS / Workday scrapers | ✅ | ❌ |

### How to scrape SEEK jobs

1. Click **Try for free** or **Start**.
2. Type your **keywords** and **location**, choose **Australia** or **New Zealand**, and add filters if you like. Or paste SEEK search URLs into **SEEK search URLs**.
3. Set **Max jobs per search** and choose whether to **include full job descriptions**.
4. Click **Start**. Then download the jobs as JSON, CSV, Excel or HTML, or get them through the API.

### Input example

```json
{
    "keywords": "data engineer",
    "location": "All Sydney NSW",
    "country": "AU",
    "classifications": ["information-communication-technology"],
    "workTypes": ["full-time", "contract-temp"],
    "workArrangements": ["hybrid", "remote"],
    "dateRange": "7",
    "salaryMin": 120000,
    "salaryType": "annual",
    "sortBy": "date",
    "maxJobs": 100,
    "includeDescription": true,
    "onlyNewJobs": false
}
```

Or with URLs copied from SEEK:

```json
{
    "startUrls": [
        { "url": "https://www.seek.com.au/developer-jobs-in-information-communication-technology/in-All-Melbourne-VIC?daterange=7&worktype=242" },
        { "url": "https://www.seek.co.nz/nurse-jobs/in-Auckland" },
        { "url": "https://www.seek.com.au/job/95576249" }
    ],
    "maxJobs": 200
}
```

| Field | Description |
|---|---|
| `keywords` | What you would type into SEEK's "What" box. |
| `location` | SEEK's "Where" box: suburb, city, region, state or postcode. The log shows which location SEEK matched. Empty = whole country. |
| `country` | `AU` (seek.com.au) or `NZ` (seek.co.nz). |
| `classifications` | SEEK classifications, e.g. `information-communication-technology`, `healthcare-medical`. Names (`"Healthcare & Medical"`) and SEEK IDs (`"1211"`) work too. |
| `workTypes` | `full-time`, `part-time`, `contract-temp`, `casual-vacation`. |
| `workArrangements` | `on-site`, `hybrid`, `remote`. |
| `dateRange` | `any`, `1` (today), `3`, `7`, `14`, `31` days. |
| `salaryMin` / `salaryMax` / `salaryType` | SEEK's salary filter (`annual`, `monthly`, `hourly`). SEEK also matches on salaries that advertisers hide, so some results show no salary. |
| `sortBy` | `date` (newest first, default) or `relevance`. |
| `startUrls` | SEEK search or job URLs. When present, the form fields above are ignored and each URL keeps its own filters. |
| `maxJobs` | Limit per search (the form search, or each URL). Default `100`. `0` = all SEEK returns (at most 550). |
| `includeDescription` | Fetch each job's full details (default `true`). Turn off for a much faster listing-only scrape. |
| `onlyNewJobs` | Incremental mode: only output jobs not seen in previous runs of the same search. |
| `stateKey` | Name of the monitor (separate monitors keep separate memories). |
| `proxyConfiguration` | Off by default. See "Blocking and proxies" below. |

### Output example

Every job is one dataset item (description shortened):

```json
{
    "id": "seek:au:95639309",
    "jobId": "95639309",
    "site": "AU",
    "title": "Management Accountant",
    "company": "Careermode Consulting Group",
    "advertiserId": "62019353",
    "advertiserName": "CareerMode Consulting Group",
    "isPrivateAdvertiser": false,
    "isVerifiedAdvertiser": true,
    "location": "Brisbane QLD",
    "locations": ["Brisbane QLD"],
    "area": "CBD & Inner Suburbs",
    "state": "QLD",
    "postcode": null,
    "countryCode": "AU",
    "country": "Australia",
    "isRemote": false,
    "workplaceType": "onsite",
    "workArrangement": "On-site",
    "employmentType": "FULL_TIME",
    "workType": "Full time",
    "classification": "Accounting",
    "classificationId": "1200",
    "subClassification": "Management Accounting & Budgeting",
    "subClassificationId": "6157",
    "salary": {
        "min": 110000,
        "max": 130000,
        "currency": "AUD",
        "interval": "year",
        "text": "$110,000 to $130,000 + Super",
        "source": "listing"
    },
    "postedAt": "2026-11-02T07:27:53.000Z",
    "postedAtText": "3h ago",
    "expiresAt": "2026-12-02T12:59:59.999Z",
    "jobUrl": "https://www.seek.com.au/job/95639309",
    "applyUrl": "https://www.seek.com.au/job/95639309/apply",
    "isExternalApply": false,
    "teaser": "You’ll own budgeting, forecasting and analysis as the business moves through its next stage of growth and acquisition.",
    "bulletPoints": [
        "Move away from month-end processes and shape real business decisions",
        "Focus on operational analysis and commercial insight",
        "Work from home 2 days a week"
    ],
    "descriptionText": "The Company\n\nCareerMode has been exclusively engaged by one of Australia’s fastest-growing ...",
    "descriptionHtml": "<p><strong>The Company</strong></p><p>CareerMode has been exclusively engaged by ...",
    "roleId": "management-accountant",
    "badges": [],
    "isFeatured": false,
    "logoUrl": "https://bx-branding-gateway.cloud.seek.com.au/b5e2dffd-e37a-4bc3-b1a4-2e72d5a5c30d.1/jdpLogo",
    "companyProfile": null,
    "sourceUrl": "https://www.seek.com.au/jobs?where=Brisbane&keywords=accountant&sortmode=ListedDate",
    "scrapedAt": "2026-11-02T11:15:39.246Z"
}
```

More real items are in [`samples/sample-output.json`](samples/sample-output.json) (contact details in the descriptions are redacted there; the Actor outputs descriptions as published).

Notes on the fields:

- `id` is stable across runs. Use it to de-duplicate.
- `company` is the name shown on the ad. `advertiserName` is the advertiser account, often the legal name or a recruitment agency. Private advertisers show `"Private Advertiser"` with `isPrivateAdvertiser: true`.
- `salary` is `null` when the ad shows no salary. When the text has no numbers (`"Competitive salary + super"`), `min` and `max` are `null` and `text` keeps the wording. A bare `$` is read as AUD on seek.com.au and NZD on seek.co.nz.
- `employmentType` maps SEEK's work type: Full time → `FULL_TIME`, Part time → `PART_TIME`, Contract/Temp → `CONTRACT`, Casual/Vacation → `TEMPORARY`. `workType` keeps SEEK's wording.
- `workplaceType` is `onsite`, `hybrid` or `remote` from the advertiser's work arrangement; `isRemote` is true only for remote.
- `expiresAt`, `isExternalApply`, `isVerifiedAdvertiser`, `area`, `companyProfile` and the descriptions need **Include full job description**.
- Recruiter phone numbers and other contact fields that SEEK holds separately are **not** collected. Descriptions are output as the advertiser published them.

A `RUN_SUMMARY` record in the run's key-value store lists, for every search: jobs output, jobs listed, the total SEEK reported, already-seen and duplicate jobs, requests, and any warnings or errors.

### How much does it cost to scrape SEEK jobs?

This Actor uses **pay-per-event** pricing. You pay **$1.50 per 1,000 jobs** ($0.0015 per job) for jobs that appear in your dataset. There is no start fee. Already-seen jobs in incremental mode, duplicates and failed searches cost nothing.

| Jobs | Price |
|---|---|
| 100 | $0.15 |
| 1,000 | $1.50 |
| 10,000 | $15.00 |

Your Apify plan's free monthly credit applies. To cap spending, set **Maximum cost per run** in the run options. The scraper stops cleanly when the budget is reached and tells you so in the status message.

### Scheduling and incremental monitoring of new jobs

Use this to get **alerts for new jobs** on SEEK, or to keep a job board in sync:

1. Set up your search (form or URLs) and turn on **Only new jobs**. Give the monitor a name in **Monitor name** (e.g. `nurses-auckland`).
2. Save the configuration as a **Task** and add a **Schedule** (e.g. every morning).
3. The first run outputs all current matching jobs and saves them as the baseline.
4. Every later run outputs **only jobs listed since**. Results are sorted newest first, and paging stops at the first page that was entirely seen before, so a run with nothing new makes one request and outputs nothing.

The memory is kept per search in a named key-value store (`seek-jobs-scraper-state` by default), under the key you choose. Changing a search's keywords, location or filters starts a new memory for it (changing only the date range or sort order does not). If you also set **Max jobs per search**, jobs beyond the limit are not remembered, so older ones can show up in a later run; for a clean "new since yesterday" feed, leave the limit at 0. Don't run two runs with the same monitor name at the same time.

### SEEK's 550-result limit

SEEK's search returns at most **550 jobs for any one search**, both on the website and in its API. When a search matches more, the log and `RUN_SUMMARY` say so. To get more jobs, split the search into narrower ones, for example by location, classification, work type or date listed, and add each as a separate start URL. Jobs that appear in several of your searches in one run are output (and charged) only once.

### Blocking and proxies

SEEK is protected by Cloudflare. In testing (November 2026, from a home connection), every SEEK HTML page was challenged for non-browser clients, while SEEK's JSON API answered normally to this scraper's browser-like HTTP client. How Cloudflare treats a request depends on the IP address and the client, and **Apify's datacenter IPs may be treated differently** from the IPs we tested from.

- The scraper runs **without a proxy** by default.
- If SEEK answers with a challenge, the run **stops at once** (no hammering, no retries from the same IP), keeps any jobs already scraped, and the status message says so. You are not charged for jobs that weren't output.
- If that happens, enable **Proxy configuration** with Apify Proxy, the **RESIDENTIAL** group and country **AU** (or NZ), and run again. With a proxy, the scraper also rotates to a new IP a few times before giving up.

### Integrations and API

- **API.** Start runs and fetch results with the [Apify API](https://docs.apify.com/api/v2), or the JavaScript and Python clients:

  ```bash
  curl -X POST "https://api.apify.com/v2/acts/rjmacarthy~seek-jobs-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{"keywords":"nurse","location":"Auckland","country":"NZ","maxJobs":50,"includeDescription":false}'
  ```

- **Webhooks.** Get notified (or trigger your pipeline) when a run finishes.

- **Zapier, Make, n8n.** Send new jobs to Google Sheets, Airtable, Slack, email or your CRM with no code.

- **Google Sheets, Slack, Airbyte, Keboola and more** through Apify integrations.

- **AI agents.** Use the Actor as a tool through the Apify MCP server.

### FAQ

**Do I need a SEEK account, cookies or a proxy?**
No account or cookies. A proxy is off by default and only needed if SEEK blocks the run (see "Blocking and proxies").

**How fast is it?**
Without descriptions, 550 jobs take about 6 requests and a few seconds. With descriptions, each job needs one more request; at the default polite rate of 3 requests per second that is roughly 2–3 jobs per second.

**Does it get more than 550 jobs per search?**
No. That's SEEK's own limit. Split large searches into narrower ones (see above).

**Why does a job show no salary even though I filtered by salary?**
SEEK filters on the salary range the advertiser entered, even when the advertiser chose to hide it on the ad.

**What does `salary.source: "description"` mean?**
The ad's salary field had no numbers, so the salary was taken from the description text (only with full descriptions on, and only when a dollar amount appears next to pay wording).

**What happens with a URL that isn't a SEEK search or job?**
It's skipped with a clear warning in the log, and the other URLs continue.

**Is it legal to scrape SEEK?**
The scraper collects job ads that employers publish to attract applicants, at a polite request rate, and doesn't collect contact fields beyond the published ad. SEEK's terms of use and its robots.txt restrict automated access to parts of the site, including the search API this Actor uses. Check that your use complies with SEEK's terms and the laws that apply to you, especially if you store or republish the data.

### Limits

- At most 550 jobs per search (SEEK's limit).
- Descriptions need one request per job; large runs with descriptions are slower than listing-only runs.
- Location is free text matched by SEEK. Check the log line "SEEK matched location ..." if results look off.
- SEEK can change its private API at any time. The job-details query falls back to a minimal version (description only) if SEEK changes its schema, and the log says so.
- Incremental state lives in a named key-value store in your account, created by the Actor itself. Deleting that store resets the monitor.

### Ready-to-run examples

- [Scrape registered nurse jobs in Melbourne from SEEK](https://apify.com/rjmacarthy/seek-jobs-scraper/examples/registered-nurse-jobs-melbourne)
- [Scrape data analyst jobs in Auckland from SEEK NZ](https://apify.com/rjmacarthy/seek-jobs-scraper/examples/data-analyst-jobs-auckland-nz)

### More scrapers by the same developer

- [ATS Jobs Scraper: Greenhouse, Lever, Ashby & Workday](https://apify.com/rjmacarthy/ats-jobs-scraper)
- [Dice Jobs Scraper](https://apify.com/rjmacarthy/dice-jobs-scraper)
- [Workday Jobs Scraper](https://apify.com/rjmacarthy/workday-jobs-scraper)
- [Google Ads Transparency Scraper](https://apify.com/rjmacarthy/google-ads-transparency-scraper)
- [Substack Scraper](https://apify.com/rjmacarthy/substack-scraper)
- [Telegram Channel Scraper](https://apify.com/rjmacarthy/telegram-channel-scraper)

Browse all my Actors on [my Apify Store profile](https://apify.com/rjmacarthy).

### Support

Found a search that doesn't work, or need an extra field? Open an issue on the **Issues** tab with the input or URL. Fixes are usually quick.

# Actor input Schema

## `keywords` (type: `string`):

What you would type into SEEK's "What" box: a job title, skill or company (e.g. "data engineer", "registered nurse"). Leave empty for all jobs.

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

SEEK's "Where" box: a suburb, city, region, state or postcode (e.g. "Sydney", "All Melbourne VIC", "Auckland", "2000"). Leave empty for the whole country. The run log shows which location SEEK matched.

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

Which SEEK site to search: seek.com.au (Australia) or seek.co.nz (New Zealand). Start URLs use the site in their own address.

## `maxJobs` (type: `integer`):

Stop after this many jobs from each search (the form search, or each start URL). Default 100. Set 0 for all jobs SEEK returns, which is at most 550 per search.

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

Fetch each job's details for the full description (HTML and plain text), expiry date, external-apply flag and company profile. This is one extra request per job. Turn off for a faster scrape of the listing data only (title, company, salary, classification, work type, bullet points, teaser).

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

Instead of the form, paste SEEK URLs copied from the browser, e.g. https://www.seek.com.au/developer-jobs-in-information-communication-technology/in-All-Melbourne-VIC?daterange=7\&worktype=242 or https://www.seek.co.nz/nurse-jobs/in-Auckland. Single job links (https://www.seek.com.au/job/12345678) work too. When you add URLs, the search form fields above and the filters below are ignored; each URL keeps its own filters.

## `classifications` (type: `array`):

SEEK job classifications (industries). Several are OR-ed.

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

Full time, part time, contract/temp or casual/vacation. Several are OR-ed.

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

On-site, hybrid or remote, as set by the advertiser. Several are OR-ed.

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

Only jobs listed within this many days.

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

Minimum pay, in the unit chosen under "Salary type" (e.g. 100000 annual, or 40 hourly). SEEK also filters on salary ranges that advertisers hide, so some matching jobs show no salary.

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

Maximum pay, in the same unit. Leave empty for no upper limit.

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

Unit for the salary filter.

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

Newest first (date) or SEEK's relevance ranking. Matters when you set "Max jobs per search". Incremental mode always sorts by date.

## `onlyNewJobs` (type: `boolean`):

Remember which jobs were already output and only output (and charge for) jobs that are new since the previous run. The first run outputs all matching jobs and saves them as the baseline. Ideal for scheduled monitoring.

## `stateKey` (type: `string`):

Name of this monitor's memory. Runs with the same name share the list of already-seen jobs (kept separately for each search). Use different names for independent monitors.

## `stateStoreName` (type: `string`):

Named key-value store in your account where incremental state is kept (letters, digits and dashes).

## `maxConcurrency` (type: `integer`):

Maximum parallel requests (job details are fetched in parallel). The default is polite; there is rarely a reason to raise it.

## `maxRequestsPerSecond` (type: `integer`):

Upper limit on how fast requests are sent to SEEK.

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

Off by default. If SEEK's Cloudflare protection blocks the run (the log and status say so), enable Apify Proxy with the RESIDENTIAL group and country AU or NZ.

## Actor input object example

```json
{
  "keywords": "software engineer",
  "location": "All Sydney NSW",
  "country": "AU",
  "maxJobs": 50,
  "includeDescription": true,
  "dateRange": "any",
  "salaryType": "annual",
  "sortBy": "date",
  "onlyNewJobs": false,
  "stateKey": "default",
  "stateStoreName": "seek-jobs-scraper-state",
  "maxConcurrency": 3,
  "maxRequestsPerSecond": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One item per job: title, company, location, work type, classification, salary and job URL.

## `jobsFull` (type: `string`):

Every field for each job, including bullet points, parsed salary and the full description in HTML and plain text.

## `summary` (type: `string`):

Per-search status, counts and any warnings (e.g. SEEK's 550-result cap or a Cloudflare block).

# 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 = {
    "keywords": "software engineer",
    "location": "All Sydney NSW",
    "maxJobs": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("rjmacarthy/seek-jobs-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 = {
    "keywords": "software engineer",
    "location": "All Sydney NSW",
    "maxJobs": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("rjmacarthy/seek-jobs-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 '{
  "keywords": "software engineer",
  "location": "All Sydney NSW",
  "maxJobs": 50
}' |
apify call rjmacarthy/seek-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,rjmacarthy/seek-jobs-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/hNazN28yyAkbA8J2I/builds/rzEw2YMmFype6wVoD/openapi.json
