# IrishJobs.ie Scraper - Jobs, Salaries, Employers & Locations (`abotapi/irishjobs-ie`) Actor

Scrape job listings from IrishJobs.ie by keyword, location, job type, salary, recency, or search URL. Extract titles, employers, GPS locations, parsed EUR salary ranges, employment type, full descriptions, and posting dates.

- **URL**: https://apify.com/abotapi/irishjobs-ie.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 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.
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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## IrishJobs.ie Jobs Scraper

Scrape job postings from [IrishJobs.ie](https://www.irishjobs.ie) - the leading job board in Ireland. Returns structured job data with rich fields in a flat, one-row-per-job dataset.

### Features

- **Keyword search** with location, job type, salary range, and date-posted filters
- **URL paste mode** - paste any IrishJobs.ie SERP URL and the actor paginates it automatically
- **Rich output** - title, employer (with logo), location with GPS coordinates, parsed salary bands (EUR), skills, employment type, full description, posting date, and apply link
- **Detail-page enrichment** (optional surcharge) - full job description, employer profile, benefits, and GPS coordinates
- **Incremental / recurring monitoring** - run the same search on a schedule and receive only NEW, UPDATED, REAPPEARED, and EXPIRED change rows
- **Resume support** - continue an interrupted crawl without re-collecting or re-charging jobs already in the previous dataset

### Input

#### Search mode

| Field | Type | Description |
|---|---|---|
| `mode` | string | `search` (build URLs from filters) or `url` (paginate pasted URLs) |
| `keywords` | string\[] | Job title or keyword (e.g. "software engineer", "nurse") |
| `locations` | string\[] | Town, city, or county (e.g. "Dublin", "Cork", "Galway") |
| `jobType` | string | Employment type: `permanent`, `contract`, `temporary`, `part-time`, `graduate` |
| `minSalary` | integer | Minimum annual salary in EUR |
| `salaryType` | enum (string) | Salary period: "0"=Any, "1"=Per annum, "4"=Per hour, "5"=Per day |
| `postedWithin` | enum (string) | Days since posting: "0"=Any, "1", "3", "7", "14", "30" |
| `sortBy` | enum (string) | "1"=Most relevant, "2"=Most recent, "3"=Salary (high to low) |

#### URL mode

| Field | Type | Description |
|---|---|---|
| `urls` | string\[] | IrishJobs.ie SERP URLs to paginate |

#### Output and limits

| Field | Type | Description |
|---|---|---|
| `maxPages` | integer | Max SERP pages per search URL (empty/0 = unlimited) |
| `maxListings` | integer | Max jobs to return (default 20; 0 = unlimited) |

#### Resume and recurring updates

| Field | Type | Description |
|---|---|---|
| `resumeFromRunId` | string | Previous run ID to skip already-collected jobs |
| `incrementalMode` | boolean | Enable recurring monitoring with change detection |
| `stateKey` | string | Stable key for the monitoring campaign's saved state |
| `emitUnchanged` | boolean | Also return UNCHANGED rows (bills extra) |
| `emitExpired` | boolean | Also return EXPIRED rows (bills extra, needs full scan) |

#### Detail enrichment

| Field | Type | Description |
|---|---|---|
| `fetchDetails` | boolean | Fetch each job's detail page for the full description, employer profile, and GPS coordinates. Adds a per-job detail-enrichment surcharge. |

#### MCP export

| Field | Type | Description |
|---|---|---|
| `mcpConnectors` | string\[] | MCP connector IDs to forward items to (e.g. Notion, Airtable) |
| `notionParentPageUrl` | string | Parent page URL for the Notion connector database |
| `maxNotifyListings` | integer | Max jobs to forward to MCP connectors (default 50) |

#### Connection

Leave the default proxy settings unless you have a specific setup. Residential (Ireland) is recommended.

### Output

Each dataset item is a flat job record with these key fields:

| Field | Type | Description |
|---|---|---|
| `jobId` | string | Unique job identifier |
| `jobUrl` | string | Canonical job URL |
| `title` | string | Job title |
| `description` | string | Full job description (detail enrichment only) |
| `employerName` | string | Employer / company name |
| `employerUrl` | string | Employer page on IrishJobs.ie |
| `employerLogoUrl` | string | Employer logo image URL |
| `employerId` | integer | Internal employer ID |
| `locationText` | string | Full location string (e.g. "Dublin, County Dublin, IE") |
| `locationLocality` | string | City or town |
| `locationRegion` | string | County or region |
| `locationCountry` | string | Country code (IE) |
| `locationLat` | number | GPS latitude (detail enrichment) |
| `locationLng` | number | GPS longitude (detail enrichment) |
| `salaryRaw` | string | Salary as displayed |
| `salaryMin` | number | Parsed minimum salary (EUR) |
| `salaryMax` | number | Parsed maximum salary (EUR) |
| `salaryCurrency` | string | ISO 4217 code (EUR) |
| `salaryPeriod` | string | hour, day, month, year |
| `employmentType` | string | FULL\_TIME, PART\_TIME, CONTRACT, etc. |
| `skills` | string\[] | Skills mentioned in the posting |
| `datePosted` | string | Date posted (ISO 8601) |
| `applyUrl` | string | URL to apply |
| `applyType` | string | internal or external |
| `sourceSearchUrl` | string | The search URL that found this job |
| `isSponsored` | boolean | Whether the listing was a sponsored placement at scrape time |
| `isHighlighted` | boolean | Whether the listing was visually highlighted at scrape time |
| `isTopJob` | boolean | Whether the listing was a featured "top job" placement |
| `isTrafficFromPartner` | boolean | Whether the listing was surfaced via a partner traffic placement |
| `crossPostedCount` | integer | 1 if cross-posted from a partner site, else 0 |
| `scrapedAt` | string | When this record was collected (ISO 8601) |

In incremental mode, `changeType`, `changedFields`, `firstSeenAt`, and `lastSeenAt` are also present.

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

Set `mcpConnectors` to a list of connector IDs (e.g. Notion, Airtable, Linear) and the actor forwards each scraped job to them as it runs, in addition to the dataset. Use `notionParentPageUrl` to pick where a Notion database is created, and `maxNotifyListings` to cap how many jobs are forwarded per run.

### Proxy

This actor requires Apify Residential (Ireland or GB) proxy. IrishJobs.ie serves its listing and job pages reliably only to Irish or UK residential connections -- other connection types see much lower success rates. Leave the default proxy settings unless you have a specific setup.

### Example run

```json
{
  "mode": "search",
  "keywords": ["software engineer"],
  "locations": ["Dublin"],
  "maxListings": 20,
  "fetchDetails": true
}
```

# Actor input Schema

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

Search mode builds SERP URLs from your keyword, location, and filter selections. URL mode paginates the exact SERP URLs you paste.

## `keywords` (type: `array`):

Job title or keyword to search for (e.g. 'software engineer', 'nurse', 'chef'). Leave empty to browse all jobs.

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

Town, city, or county to search in (e.g. 'Dublin', 'Cork', 'Galway'). One search URL per location. Leave empty to search all of Ireland.

## `jobType` (type: `string`):

Filter by employment type. All types are searched when empty.

## `minSalary` (type: `integer`):

Minimum annual salary in EUR (e.g. 40000). Leave empty for no salary filter.

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

Salary period to filter by. Use with Minimum salary above.

## `postedWithin` (type: `string`):

Show jobs posted within this many days. Leave at 0 for any date.

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

Sort order for the search results.

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

Paste IrishJobs.ie SERP URLs here (one per line). The actor paginates each URL until Max pages or Max jobs is reached. Example: 'https://www.irishjobs.ie/jobs/software-engineer/in-dublin'

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

Maximum number of SERP pages to walk per search URL. Each page returns up to 25 jobs. Leave empty or set to 0 for no page limit - the run stops at Max jobs instead.

## `maxListings` (type: `integer`):

Maximum number of jobs to return. 20 is a reasonable default for a quick sample. Set to 0 for unlimited (stops at Max pages if set, or walks the full catalogue).

## `fetchDetails` (type: `boolean`):

Open each job's detail page for the full description, employer profile, benefits, GPS coordinates, and employment type. Adds a detail-enrichment surcharge per enriched job. Requires Residential proxy - free-tier users see listing fields only.

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

Paste a previous run ID (or dataset ID) to collect only jobs NOT already in that run. Use this to continue an interrupted crawl without re-collecting and re-charging the same jobs.

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

Enable recurring monitoring. On the first run the actor saves a snapshot of every job found. On each subsequent run with the same search, it returns only change rows: NEW jobs, UPDATED jobs (with the changed fields listed), REAPPEARED jobs, and (on a complete scan) EXPIRED jobs no longer found. UNCHANGED rows are suppressed by default. Use the emit toggles below to return them.

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

A stable key that identifies this monitoring campaign's saved state. Defaults to a hash of your search (mode + keywords + location + filters), so the same search automatically picks up its own baseline. Set a custom key only when you need multiple campaigns on the same search.

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

When ON, incremental mode also returns jobs that haven’t changed since the last run. Each UNCHANGED row bills a dataset-item event, same as a new result. Use only when your downstream pipeline needs the full corpus every run.

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

When ON, incremental mode returns EXPIRED rows for jobs present in the saved baseline but no longer found on the site. Each EXPIRED row bills a dataset-item event. Requires a complete, uncapped scan of the full search - a run interrupted by Max jobs or Max pages will not detect expired jobs.

## `proxy` (type: `object`):

Proxy settings for accessing IrishJobs.ie. Residential (Ireland) is required - other connection types are not served reliably.

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

List of MCP connector IDs to export scraped items to (e.g. Notion, Airtable, Linear). Items are pushed to the configured connectors as the actor runs. Leave empty to disable.

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

When using a Notion connector, the parent page where the actor's database should live. Leave empty for the connector's default workspace root.

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

Maximum number of jobs to forward to MCP connectors. Acts as a safety cap to avoid overloading your Notion/Airtable base. Default 50.

## Actor input object example

```json
{
  "mode": "search",
  "keywords": [],
  "locations": [],
  "jobType": "",
  "minSalary": 0,
  "salaryType": "0",
  "postedWithin": "0",
  "sortBy": "1",
  "urls": [
    "https://www.irishjobs.ie/jobs/software-engineer/in-dublin"
  ],
  "maxListings": 20,
  "fetchDetails": false,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "mcpConnectors": [],
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (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 = {
    "mode": "search",
    "keywords": [],
    "locations": [],
    "jobType": "",
    "minSalary": 0,
    "salaryType": "0",
    "postedWithin": "0",
    "sortBy": "1",
    "urls": [
        "https://www.irishjobs.ie/jobs/software-engineer/in-dublin"
    ],
    "maxListings": 20,
    "fetchDetails": false,
    "incrementalMode": false,
    "emitUnchanged": false,
    "emitExpired": false,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    },
    "mcpConnectors": [],
    "maxNotifyListings": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/irishjobs-ie").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 = {
    "mode": "search",
    "keywords": [],
    "locations": [],
    "jobType": "",
    "minSalary": 0,
    "salaryType": "0",
    "postedWithin": "0",
    "sortBy": "1",
    "urls": ["https://www.irishjobs.ie/jobs/software-engineer/in-dublin"],
    "maxListings": 20,
    "fetchDetails": False,
    "incrementalMode": False,
    "emitUnchanged": False,
    "emitExpired": False,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
    "mcpConnectors": [],
    "maxNotifyListings": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/irishjobs-ie").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 '{
  "mode": "search",
  "keywords": [],
  "locations": [],
  "jobType": "",
  "minSalary": 0,
  "salaryType": "0",
  "postedWithin": "0",
  "sortBy": "1",
  "urls": [
    "https://www.irishjobs.ie/jobs/software-engineer/in-dublin"
  ],
  "maxListings": 20,
  "fetchDetails": false,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "mcpConnectors": [],
  "maxNotifyListings": 50
}' |
apify call abotapi/irishjobs-ie --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,abotapi/irishjobs-ie"
        }
    }
}

```

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/he8iJvOBblxhcMofZ/builds/LtZUhFhp8w64a3TcH/openapi.json
