# EmploymentHero Scraper - Jobs, Salaries & Company Profiles (`abotapi/employmenthero-jobs-employers-scraper`) Actor

Scrape Employment Hero's job marketplace: roles with pay ranges, full descriptions, locations and work types; employer profiles with websites and open roles; webinars and events; partner directory and customer case studies. Search with filters, paste links, or target employers directly.

- **URL**: https://apify.com/abotapi/employmenthero-jobs-employers-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result saveds

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/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

## Employment Hero Scraper: Jobs, Employers, Webinars & Partners

Employment Hero Scraper turns the Employment Hero job marketplace into a clean jobs data API. Get every open role with pay ranges, full descriptions, locations and work types, employer profiles with websites and open-role counts, plus webinars and events, the partner directory and customer case studies. Search with filters, target employers directly, paste links, or pull the resource library, then export to JSON, CSV or Excel, or pipe the results straight into your app.

### Why This Scraper?

- **Four ways in.** Search the marketplace by keyword and filters, scrape employers by slug, paste job or employer links, or pull webinars, partners and case studies from the resource library.
- **Everything on every role.** Pay range and rate, employment type and term, experience level, workplace type, city with region and postcode, sector, team, employer identity and the full description come on every row without extra reads.
- **Employer profiles, not just jobs.** Employer rows carry the company website, about text, logo and open-role count, so you can map the whole employer landscape.
- **Filters that actually narrow.** Country, sector, workplace type, employment type, experience level, posted-within days, city radius and sort are applied by the site's own search, and each one is covered by a test that proves it narrows.
- **Events and partners included.** Webinars and on-demand events, the partner directory with services and client size, customer case studies, news and quick demos come from the same run settings.
- **Built for schedules.** Incremental mode returns only new and changed roles on recurring runs, and a refused run fails loudly instead of returning an empty dataset.

### Use Cases

- **Recruiters and sourcing teams:** monitor one or many employer careers pages and get alerted to fresh roles the moment they appear.
- **Job boards and aggregators:** backfill a niche board with structured roles across Australia, Canada, the United Kingdom and New Zealand.
- **Market and salary researchers:** collect pay ranges by sector, location and experience level at scale.
- **Sales and GTM teams:** build employer lists by sector and region with websites and open-role counts for targeting.
- **HR content teams:** track webinars, events and partner directory entries for content planning and partnerships research.

### Data You Get

> Sample shape: values are illustrative placeholders, not from a live record.

| Field | Example |
| --- | --- |
| `kind` | `"job"` (also `"organisation"`, `"resource"`) |
| `id` | `"10000001"` |
| `title` | `"Sample Role Title"` |
| `url` | Link to the role on the marketplace |
| `organisationName` / `organisationSlug` | `"Sample Employer"` / `"sample-employer"` |
| `organisationUrl` | Link to the employer careers page |
| `employmentType` / `employmentTerm` | `"Full-time"` / `"Permanent"` |
| `experienceLevel` | `"mid_senior"` |
| `workplaceType` / `remote` | `"hybrid"` / `true` |
| `salaryMin` / `salaryMax` / `salaryCurrency` | `70000` / `90000` / `"AUD"` |
| `salaryRate` / `salaryDisplay` | `"Annum"` / `"AUD 70,000 - 90,000 Annum"` |
| `payHidden` | `false` |
| `location` | `"Sample Suburb, New South Wales 2000"` |
| `locationCity` / `locationRegion` / `locationPostcode` | `"Sample Suburb"` / `"New South Wales"` / `"2000"` |
| `countryCode` | `"AU"` (also `"CA"`, `"GB"`, `"NZ"`) |
| `sectorName` | `"Hospitality & Catering"` |
| `teamName` | `"Kitchen"` |
| `postedAt` | `"2026-10-08T22:14:30Z"` |
| `companyOverview` | Employer overview text from the role payload |
| `description` | The full role description |
| `organisationLogo` | Link to the employer logo |
| `employer website` / `about` | `"https://www.sample-employer.example"` / about text (with Add employer details) |
| `jobsCount` | `12` open roles on employer rows |
| `type` / `excerpt` / `featuredImage` | `"webinar"` / summary text / image link on resource rows |
| `changeType` / `changedFields` | `"NEW"` / `[]` (incremental mode) |

### How to Use

1. Pick a **mode**: `search` (keywords and filters), `organisation` (employers), `url` (paste links) or `resources` (webinars, partners, case studies).
2. Fill in the fields for that mode.
3. Set **Max items** to control run size and cost, then click **Start**.
4. Download the dataset as JSON, CSV or Excel, or read it through the API.

**Search with filters:**

```json
{
  "mode": "search",
  "query": "registered nurse",
  "countries": ["AU"],
  "workplaceTypes": ["remote"],
  "datePostedDays": "7",
  "sortBy": "date_posted",
  "maxItems": 50
}
```

**Scrape employers with their open roles:**

```json
{
  "mode": "organisation",
  "organisationSlugs": ["el-jannah-stores", "4wd-supacentre-pjilq"],
  "fetchOrgDetails": true,
  "maxItems": 100
}
```

**Pull webinars and events:**

```json
{
  "mode": "resources",
  "resourceTypes": ["webinars", "case_studies"],
  "maxItems": 50
}
```

**Paste links (job pages, employer careers pages or both):**

```json
{
  "mode": "url",
  "urls": [
    "https://employmenthero.com/jobs/organisations/el-jannah-stores/",
    "https://employmenthero.com/jobs/position/sample-employer-sample-role-abc12/"
  ]
}
```

Employer slugs come from careers page addresses: `employmenthero.com/jobs/organisations/el-jannah-stores/` has the slug `el-jannah-stores`. Job links copied from the marketplace work as-is.

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/employmenthero-jobs-employers-scraper").call(run_input={
    "mode": "search", "query": "chef", "countries": ["AU"], "maxItems": 50,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], job["organisationName"], job["salaryDisplay"])
```

JavaScript:

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/employmenthero-jobs-employers-scraper').call({
    mode: 'search', query: 'chef', countries: ['AU'], maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the **Integrations** tab.

#### How `maxItems` shapes a run

Each search, employer or resource type is a unit, and a run walks units in order and stops once `maxItems` delivered rows is reached. Rows are taken whole per page, so a run can return slightly more than `maxItems`. To collect everything a search can reach, set `maxItems` to `0`.

#### Resume and recurring updates

- **Resume** (`resumeFromRunId`) continues one interrupted run: paste its run or dataset ID and the actor skips everything already collected there, so you don't pay twice.
- **Incremental mode** (`incrementalMode`) is for scheduled runs over the same scope. Each record is classified `NEW`, `UPDATED` (with `changedFields`), `UNCHANGED` (suppressed and not billed unless `emitUnchanged` is on), `REAPPEARED` or `EXPIRED` (only after a run that scanned the whole scope, and only with `emitExpired`). `stateKey` names or shares the stored state. Employer logo and attachment links change on every fetch and never mark a record `UPDATED`. With incremental mode off, output is exactly as before.

### Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step **after** the scrape: the Apify dataset is never changed.

**What gets written to the connector:** a condensed, human-readable **summary** of each record, not the full JSON. Each item becomes one entry with a **title** and its key fields flattened to plain text. The **complete record always stays in the Apify dataset**.

1. Authorize a connector once under **Apify → Settings → Integrations** (Notion, Linear, Airtable, or Apify).
2. Select it in the **"Pipe results into your apps"** input field. (If the picker is empty, you haven't authorized a connector yet.)
3. For **Notion**, also set `notionParentPageUrl` to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

### Input Parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `search` | `search`, `organisation`, `url`, or `resources`. |
| `query` | string | (none) | Keywords for search mode. |
| `locations` | array | `[]` | City names; each becomes a radius search via the site's location index. |
| `locationRadiusKm` | string | `25` | Radius around each location. |
| `countries` | multi-select | `AU`, `CA`, `GB`, `NZ` | Country filter with all 95 markets the site's search offers (Australia, Canada, United Kingdom, New Zealand by default; smaller markets may hold no roles today). Untick everything to search all countries everywhere. |
| `sectors` | array | `[]` | Job sectors to keep. |
| `workplaceTypes` | array | `[]` | `onsite`, `remote`, `hybrid`. |
| `employmentTypes` | array | `[]` | `full_time`, `part_time`, `casual`. |
| `experienceLevels` | array | `[]` | `entry_level` through `executive`. |
| `datePostedDays` | string | (none) | Only roles posted within `1`, `7` or `30` days. |
| `sortBy` | string | `relevance` | `relevance` or `date_posted` (newest first). |
| `organisationSlugs` | array | `[]` | Employer slugs or employer page links (organisation mode). |
| `resourceTypes` | array | `["webinars"]` | `webinars`, `resources`, `case_studies`, `partners`, `news`, `quick_demos` (resources mode). |
| `resourceSearch` | string | (none) | Keyword filter for the resource library. |
| `urls` | array | sample | Job or employer page links (url mode). |
| `fetchOrgDetails` | boolean | `true` | Read each employer's careers page for website and about text. |
| `maxItems` | integer | `20` | Stop after this many delivered rows (`0` = no limit). |
| `maxPages` | integer | (none) | Cap result pages per search; empty walks as far as `maxItems` requires. |
| `proxyConfiguration` | object | Apify Proxy | Connection settings. |
| `resumeFromRunId` | string | (none) | Continue one interrupted run. |
| `incrementalMode` | boolean | `false` | Return only new and changed records on scheduled runs. |
| `stateKey` | string | (none) | Name or share an incremental-mode state. |
| `emitUnchanged` | boolean | `false` | Also return (and bill) unchanged records. |
| `emitExpired` | boolean | `false` | Also return (and bill) expired records. |
| `ignoreFieldsForChanges` | array | `[]` | Extra fields that never mark a record `UPDATED`. |
| `mcpConnectors` | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
| `notionParentPageUrl` | string | (none) | Notion connector only: page under which records are created. |
| `maxNotifyListings` | integer | `50` | Cap on items written to each connector per run. |

### Output Example

> Sample shape: values are illustrative placeholders, not from a live record.

```json
{
  "kind": "job",
  "id": "10000001",
  "jobId": "aa000000-0000-4000-8000-000000000001",
  "friendlyId": "sample-employer-sample-role-abc12",
  "url": "https://employmenthero.com/jobs/position/sample-employer-sample-role-abc12/",
  "title": "Sample Role Title",
  "organisationName": "Sample Employer",
  "organisationSlug": "sample-employer",
  "organisationUrl": "https://employmenthero.com/jobs/organisations/sample-employer/",
  "employmentType": "Full-time",
  "employmentTerm": "Permanent",
  "experienceLevel": "mid_senior",
  "workplaceType": "hybrid",
  "remote": false,
  "salaryMin": 70000,
  "salaryMax": 90000,
  "salaryCurrency": "AUD",
  "salaryRate": "Annum",
  "salaryDisplay": "AUD 70,000 - 90,000 Annum",
  "payHidden": false,
  "location": "Sample Suburb, New South Wales 2000",
  "locationCity": "Sample Suburb",
  "locationRegion": "New South Wales",
  "locationPostcode": "2000",
  "countryCode": "AU",
  "sectorName": "Hospitality & Catering",
  "sectorId": 16,
  "teamName": "Kitchen",
  "postedAt": "2026-10-08T22:14:30Z",
  "eoi": false,
  "organisationId": "aa000000-0000-4000-8000-000000000002",
  "organisationLogo": "https://employmenthero.com/wp-content/uploads/sample-logo.png",
  "isDemoJob": false,
  "companyOverview": "Sample Employer overview text.",
  "description": "<p>The full role description.</p>"
}
```

### Plan Requirement

The default proxy setting works out of the box, and the actor rotates connections automatically when one is refused. For large or frequent runs, the residential proxy group gives more headroom; pick it under Connection. If your Apify plan does not include proxy access, the run fails with a clear message instead of returning an empty result; a paid plan with proxy access is required.

### FAQ

#### How much does it cost?

You pay per record returned, with employer details billed only when you switch them on. The **Pricing** tab shows the current rates. Use **Max items** to cap the cost of any run.

#### Is it legal to scrape Employment Hero?

This actor collects only publicly available job marketplace data: roles employers have chosen to publish, employer careers pages, and the site's public resource library. You are responsible for how you use it: follow Employment Hero's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution.

#### Can I get only new or changed roles on a schedule?

Yes. Schedule the actor from the **Schedules** tab and turn on **Incremental mode**. Each run then returns only new and updated records, and unchanged ones are not billed.

#### Why did an employer return no rows?

Check the slug: it is the part after `/jobs/organisations/` in the employer's careers page address. An employer with no open roles still returns its profile row, with `jobsCount` at zero.

#### Why did my run fail instead of returning an empty dataset?

If the site refuses every request, the run stops with a clear message so "no roles today" is never confused with "nothing could be read". Run it again in a few minutes. If only part of the search could be read, you still get what was found.

#### Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

### 🔗 More scrapers you might like

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>💼 <a href="https://apify.com/abotapi/irishjobs-ie"><b>IrishJobs.ie Scraper</b></a><br>Scrape job listings from IrishJobs.ie by keyword, location, job type, salary, recency, or...</td><td>💼 <a href="https://apify.com/abotapi/hh-ru-jobs-scraper"><b>HH.ru Jobs Scraper</b></a><br>From $1/1K. Scrape HH.ru job listings with 50+ structured fields. Search by filters or...</td></tr>
<tr><td>💼 <a href="https://apify.com/abotapi/stepstone-de"><b>StepStone.de</b></a><br>Scrape StepStone.de jobs by keyword, location, filters, or URL. Extract 35+ fields...</td><td>💼 <a href="https://apify.com/abotapi/totaljobs-com-scraper"><b>Totaljobs Scraper</b></a><br>Scrape UK job listings from Totaljobs.com by keyword, location, filters, or URL. Extract...</td></tr>
<tr><td>💼 <a href="https://apify.com/abotapi/dice-com-scraper"><b>Dice.com Scraper</b></a><br>Scrape tech job listings from Dice.com by keyword, filters, or URL. Extract job titles...</td><td>💼 <a href="https://apify.com/abotapi/monster-com"><b>Monster Jobs Scraper</b></a><br>Scrape Monster.com job listings from search and direct job URLs. Extract full...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support & custom scrapers

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/employmenthero-jobs-employers-scraper/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com> or message [Telegram @abotapi](https://t.me/abotapi).
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

## `mode` (type: `string`):

Search finds jobs across the marketplace. Employers scrapes company profiles plus every open role they list. URL scrapes the job or employer pages you paste. Resources pulls webinars and events, partner directory entries, customer case studies, news and quick demos.

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

Free-text job search, matching how the site's own search box works (e.g. chef, registered nurse, warehouse).

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

City names, one per line. Each city is matched against the site's own location index and searched with a radius around it. Leave empty to search everywhere.

## `locationRadiusKm` (type: `string`):

Radius in kilometres applied around each location when Locations is set.

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

Country filter as a multi-select with every country the site's own search offers (95 markets; only the larger ones carry listings today — a market with no roles returns nothing rather than an error). Default: the four largest markets (Australia, Canada, United Kingdom, New Zealand). Untick everything to search all countries everywhere.

## `sectors` (type: `array`):

Optional job sectors (industries) to keep. Leave empty for all sectors.

## `workplaceTypes` (type: `array`):

Optional filter: onsite, remote or hybrid roles.

## `employmentTypes` (type: `array`):

Optional filter: full time, part time or casual.

## `experienceLevels` (type: `array`):

Optional seniority filter.

## `datePostedDays` (type: `string`):

Optional recency filter: only roles posted in the last 1, 7 or 30 days. Empty means any age.

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

Order of results within each search.

## `organisationSlugs` (type: `array`):

Employer slugs from careers page addresses like employmenthero.com/jobs/organisations/el-jannah-stores/ (Employer mode), or full employer page links. Each employer gets a profile row plus one row per open role.

## `resourceTypes` (type: `array`):

Which library sections to pull. Webinars includes live events and on-demand webinars.

## `resourceSearch` (type: `string`):

Optional keyword filter applied to the resource library.

## `urls` (type: `array`):

Job pages, employer careers pages or both, one per line. Filter fields are ignored in this mode; pagination walks forward from list pages. The prefill above shows one of each working shape.

## `fetchOrgDetails` (type: `boolean`):

Read each employer's own careers page once to add the company website and about text to employer rows. Off keeps rows lighter and skips that read.

## `maxItems` (type: `integer`):

Ends the run after this many delivered rows in total across all modes. 0 means unlimited.

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

Caps result pages per search or employer. Leave empty or 0 to walk as many pages as Max items requires; Max items always decides the final stop.

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

Apify proxy is on by default and is enough for this site. For the most reliable long scheduled runs, point the proxy at Residential with the country your target listings are in (AU, CA, GB or NZ).

## `resumeFromRunId` (type: `string`):

Continue an interrupted run: paste its run or dataset ID and this run delivers only rows that run had not collected yet.

## `incrementalMode` (type: `boolean`):

Schedule this actor against the SAME search and it delivers only what changed since the last run: NEW, UPDATED, REAPPEARED or EXPIRED, each tagged in changeType. Unchanged records are neither written nor charged.

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

Names the incremental baseline. Leave empty to derive it from the search itself. Use a distinct key to run several independent monitoring campaigns.

## `emitUnchanged` (type: `boolean`):

Incremental mode: also write records that did not change (tagged UNCHANGED, still charged as rows).

## `emitExpired` (type: `boolean`):

Incremental mode: after a complete scan, also write rows for records that disappeared since the last run (tagged EXPIRED).

## `ignoreFieldsForChanges` (type: `array`):

Extra row fields that should never mark a record UPDATED in incremental mode (employer logo links are already handled by default).

## `mcpConnectors` (type: `array`):

Connector IDs that receive the first rows of every run (for example an Notion or Google Docs connector from the Apify MCP Connector gallery).

## `notionParentPageUrl` (type: `string`):

When your connector writes to Notion, the parent page the results land under.

## `maxNotifyListings` (type: `integer`):

How many rows each run hands to the connectors, at most.

## Actor input object example

```json
{
  "mode": "search",
  "locations": [],
  "locationRadiusKm": "25",
  "countries": [
    "AU",
    "CA",
    "GB",
    "NZ"
  ],
  "sectors": [],
  "workplaceTypes": [],
  "employmentTypes": [],
  "experienceLevels": [],
  "datePostedDays": "",
  "sortBy": "relevance",
  "organisationSlugs": [],
  "resourceTypes": [
    "webinars"
  ],
  "urls": [
    {
      "url": "https://employmenthero.com/jobs/position/el-jannah-stores-shift-leader-rbpon/"
    },
    {
      "url": "https://employmenthero.com/jobs/organisations/el-jannah-stores/"
    }
  ],
  "fetchOrgDetails": true,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "maxNotifyListings": 50
}
```

# Actor output Schema

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

No description

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

No description

## `organisations` (type: `string`):

No description

## `resources` (type: `string`):

No description

## `changes` (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 = {
    "urls": [
        {
            "url": "https://employmenthero.com/jobs/position/el-jannah-stores-shift-leader-rbpon/"
        },
        {
            "url": "https://employmenthero.com/jobs/organisations/el-jannah-stores/"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/employmenthero-jobs-employers-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 = {
    "urls": [
        { "url": "https://employmenthero.com/jobs/position/el-jannah-stores-shift-leader-rbpon/" },
        { "url": "https://employmenthero.com/jobs/organisations/el-jannah-stores/" },
    ],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/employmenthero-jobs-employers-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 '{
  "urls": [
    {
      "url": "https://employmenthero.com/jobs/position/el-jannah-stores-shift-leader-rbpon/"
    },
    {
      "url": "https://employmenthero.com/jobs/organisations/el-jannah-stores/"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call abotapi/employmenthero-jobs-employers-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,abotapi/employmenthero-jobs-employers-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/pcbBFzGlLCu87GpHi/builds/qyGXTVOqPvguEzt9n/openapi.json
