# IrishJobs.ie Scraper — Ireland Jobs with Salary & Geo (`unfenced-group/irishjobs-ie-scraper`) Actor

Scrape job listings from IrishJobs.ie (StepStone). Structured salary, geo-coordinates, full descriptions in text/HTML/Markdown, batch searches, compact mode, and repost detection. Filter by keyword, location, and recency. Proxy-free. $1.40/1,000 results.

- **URL**: https://apify.com/unfenced-group/irishjobs-ie-scraper.md
- **Developed by:** [Unfenced Group](https://apify.com/unfenced-group) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 73 total users, 17 monthly users, 91.8% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 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 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 Scraper

![IrishJobs.ie Scraper](https://api.apify.com/v2/key-value-stores/lJlifu6C8YQfZMPKE/records/irishjobs-ie-scraper)

Extract job listings from IrishJobs.ie at scale, with structured salary, geo-coordinates, company data, and full descriptions. Runs proxy-free via a warmed cookie session. No API key required.

***

### Why this scraper?

#### 🎯 Built for Ireland

A dedicated IrishJobs.ie scraper covering the full listing set across every sector and county. Locations, salary, and dates are parsed for the Irish market.

#### 📄 Two modes in one

List mode returns the full card data — title, company, location, salary, badges, snippet — fast and cheap. Detail mode adds the complete description in text, HTML and Markdown, plus industry, contract type, and exact coordinates.

#### 💶 Structured salary and geo

Minimum, maximum, currency and period parsed from the listing. In detail mode, latitude and longitude come straight from the page's structured data, ready for mapping without a separate geocoding step.

#### 🔁 Batch searches

Run several keyword searches in a single run. They share one dataset, one dedup state, and one run start, so a batch costs less than the same searches run separately.

#### 📦 Compact mode

Return a reduced core-field payload for AI agents and MCP pipelines, ready to pipe into an ATS or LLM context without stripping extra fields.

#### ♻️ Repost detection

A 90-day dedup window skips listings already seen in earlier runs, so scheduled runs can emit new listings only.

***

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `searchQuery` | string | `developer` | Job title, skill, or keyword. Empty browses all jobs. |
| `searchQueries` | array | (empty) | Several keyword searches in one run, sharing one dataset and dedup state. Overrides `searchQuery`. |
| `location` | string | (empty) | City, county, or region (e.g. `Dublin`, `Cork`). Empty searches nationwide. |
| `category` | string | (empty) | IrishJobs numeric category ID from a category URL. Empty means all. |
| `daysOld` | integer | `0` | Only listings posted within this many days (snaps to 1, 3, 7, or 30). `0` disables. |
| `maxResults` | integer | `100` | Maximum listings to return across all searches. |
| `fetchDetails` | boolean | `false` | Fetch each detail page for full description, structured salary, industry, contract type, geo-coordinates, and apply URL. |
| `compact` | boolean | `false` | Return a reduced core-field payload for AI agents and MCP pipelines. |
| `skipReposts` | boolean | `false` | Skip listings seen in earlier runs (90-day window). Enable for new-only feeds. |
| `startUrls` | array | (empty) | Specific IrishJobs.ie search or detail URLs. Overrides all filters. |

***

### Output schema

Every field below is present on every record in full mode. Fields the source does not publish for a given job are returned as `null`. Fields marked **(detail)** are populated only when `fetchDetails: true`. Compact mode returns a reduced subset.

| Field | Type | Description |
|---|---|---|
| `jobId` | string | IrishJobs listing ID. |
| `harmonisedId` | string|null | StepStone cross-network listing ID. |
| `url` | string | Direct link to the listing. |
| `title` | string | Job title. |
| `company` | string | Hiring company. |
| `companyId` | number|null | IrishJobs company ID. |
| `companyUrl` | string|null | Company profile URL on IrishJobs. |
| `companyLogo` | string|null | Company logo URL. |
| `location` | string|null | Job location. |
| `postCode` | string|null | Post code, where published. |
| `country` | string | Country code (IE). |
| `latitude` | number|null | Latitude (from structured data in detail mode). |
| `longitude` | number|null | Longitude (from structured data in detail mode). |
| `remote` | boolean|null | Whether the role is remote. |
| `contractType` | string|null | **(detail)** Employment type (e.g. `FULL_TIME, REMOTE_WORKING`). |
| `industry` | string|null | **(detail)** Industry classification. |
| `snippet` | string|null | Short description from the search card. |
| `description` | string|null | **(detail)** Full description, plain text. |
| `descriptionHtml` | string|null | **(detail)** Full description, HTML. |
| `descriptionMarkdown` | string|null | **(detail)** Full description, Markdown. |
| `salary` | string|null | Raw salary text where the listing shows one. |
| `salaryMin` | number|null | Parsed minimum salary. |
| `salaryMax` | number|null | Parsed maximum salary. |
| `salaryCurrency` | string|null | Salary currency (EUR/GBP). |
| `salaryPeriod` | string|null | `yearly`, `monthly`, `weekly`, `daily`, or `hourly`. |
| `publishDate` | string|null | Date posted. |
| `expiryDate` | string|null | Listing expiry date. |
| `applyUrl` | string|null | **(detail)** Application URL. |
| `directApply` | boolean|null | **(detail)** Whether direct apply is offered. |
| `applicantLocationRequirement` | string|null | **(detail)** Required applicant country, where set. |
| `skills` | array | Skill tags, where present. |
| `labels` | array | Card labels (e.g. `NEW`). |
| `isNew` | boolean | Whether the listing carries the NEW badge. |
| `isSponsored` | boolean | Whether the listing is sponsored. |
| `isHighlighted` | boolean | Whether the listing is highlighted. |
| `isTopJob` | boolean | Whether the listing is a top job. |
| `isAnonymous` | boolean | Whether the employer is anonymous. |
| `changeStatus` | string|null | Change status across runs (NEW / UPDATED / UNCHANGED). |
| `contentHash` | string|null | Stable hash of core fields, for change tracking. |
| `source` | string | Always `IrishJobs.ie`. |
| `scrapedAt` | string | ISO timestamp when scraped. |

#### Example record

```json
{
  "jobId": "107644731",
  "harmonisedId": "5a0d4c68-d58f-42da-8031-65fa3dc021f1",
  "url": "https://www.irishjobs.ie/job/life400-developer/bank-of-ireland-group-job107644731",
  "title": "Life400 Developer",
  "company": "Bank of Ireland Group",
  "companyId": 1242646,
  "companyUrl": "https://www.irishjobs.ie/jobs/bank-of-ireland-group?cmpId=1242646",
  "companyLogo": "https://www.irishjobs.ie/CompanyLogos/9699d558-4255-4f16-b81d-ba4.png",
  "location": "Dublin, County Dublin",
  "postCode": null,
  "country": "IE",
  "latitude": 53.33306,
  "longitude": -6.24889,
  "remote": true,
  "contractType": "FULL_TIME, REMOTE_WORKING",
  "industry": "IT, IT-Software Development",
  "snippet": "New Ireland is seeking a skilled Life400 Developer ...",
  "description": "What is the opportunity? New Ireland is seeking a skilled Life400 Developer ...",
  "descriptionHtml": "<div><b>What is the opportunity?</b><br>New Ireland is seeking ...</div>",
  "descriptionMarkdown": "**What is the opportunity?**\n\nNew Ireland is seeking a skilled Life400 Developer ...",
  "salary": null,
  "salaryMin": null,
  "salaryMax": null,
  "salaryCurrency": null,
  "salaryPeriod": null,
  "publishDate": "2026-07-06T11:18:32.843Z",
  "expiryDate": "2026-08-05T22:00:00Z",
  "applyUrl": "https://www.irishjobs.ie/job/life400-developer/bank-of-ireland-group-job107644731",
  "directApply": true,
  "applicantLocationRequirement": "ie",
  "skills": [],
  "labels": ["NEW"],
  "isNew": true,
  "isSponsored": false,
  "isHighlighted": false,
  "isTopJob": false,
  "isAnonymous": false,
  "changeStatus": "NEW",
  "contentHash": "b7e2c9a1f3d40856",
  "source": "IrishJobs.ie",
  "scrapedAt": "2026-07-06T12:30:00.000Z"
}
```

***

### Examples

**Developer jobs in Dublin, full details**

```json
{
  "searchQuery": "developer",
  "location": "Dublin",
  "fetchDetails": true,
  "maxResults": 100
}
```

**Batch of tech searches in one run**

```json
{
  "searchQueries": ["python developer", "data engineer", "devops"],
  "maxResults": 300
}
```

**New listings only, posted in the last day**

```json
{
  "searchQuery": "accountant",
  "daysOld": 1,
  "skipReposts": true,
  "maxResults": 200
}
```

**Compact output for an AI pipeline**

```json
{
  "searchQuery": "nurse",
  "compact": true,
  "maxResults": 100
}
```

Schedule any of these to run daily in the Apify Scheduler, and enable `skipReposts` to receive only new listings each run.

***

### 💰 Pricing

**$1.40 per 1,000 results** — you only pay for successfully retrieved listings. Failed retries are never charged, and an over-filtered query that returns nothing costs nothing.

| Results | Cost |
|---|---|
| 100 | ~$0.14 |
| 1,000 | ~$1.40 |
| 10,000 | ~$14.00 |
| 100,000 | ~$140.00 |

> Proxy-based alternatives layer compute and proxy charges on top of their per-result rate. This actor runs proxy-free, so the per-result price is the whole cost.

***

### Performance

| Run size | Typical time |
|---|---|
| 100 results (list only) | under 1 minute |
| 1,000 results (list only) | 3–5 minutes |
| 100 results with `fetchDetails` | 3–5 minutes |
| 1,000 results with `fetchDetails` | 15–25 minutes |

List mode is the fastest and cheapest. Enable `fetchDetails` only when you need descriptions, industry, contract type, or coordinates.

***

### Known limitations

- Many IrishJobs listings show "€ Not Disclosed"; those return `null` salary fields.
- Full description, industry, contract type, and geo-coordinates are only available with `fetchDetails: true`.
- IrishJobs exposes no working contract-type search filter, so contract type cannot be used to narrow the search. It is still returned per job in detail mode.
- The site uses an Akamai challenge; the actor clears it with a warmed cookie session and no proxy, but very large runs may occasionally re-warm mid-run.

***

### Technical details

- **Source:** IrishJobs.ie (StepStone network) — Ireland job listings
- **Push notifications:** get new results delivered to Telegram, Discord, Slack, WhatsApp or any webhook the moment a scheduled run finds them
- **Coverage:** the full public listing set, filterable by keyword, location, and recency
- **Deduplication:** 90-day repost detection plus a per-record `contentHash` for change tracking
- **Retry:** automatic retry with exponential backoff and session re-warming on challenge responses

***

### Rate this actor

If this scraper does its job, a short review on the **Reviews** tab helps other users find it. Something not working? Open an issue on the **Issues** tab instead — issues get fixed.

***

### Need a custom scraper?

**[Unfenced Group](https://www.unfencedgroup.nl)** builds Apify actors for any website — for free.

If the site you need isn't in our portfolio yet, just ask. We scope, build, and publish it at no cost to you. You only pay for results — we absorb the compute and proxy costs ourselves. Same pay-per-result pricing, same quality, same standards as every actor in this portfolio.

**Get in touch:** [www.unfencedgroup.nl](https://www.unfencedgroup.nl)

# Actor input Schema

## `searchQuery` (type: `string`):

Job title, skill, or keyword to search for (e.g. 'developer', 'accountant', 'nurse'). Leave empty to browse all jobs.

## `searchQueries` (type: `array`):

Run several keyword searches in one run, sharing a single dataset and one dedup state. Overrides Search Keyword when set.

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

City, county, or region in Ireland (e.g. 'Dublin', 'Cork', 'Galway'). Leave empty to search nationwide.

## `category` (type: `string`):

IrishJobs numeric category ID, taken from a category URL on the site. Leave empty for all categories.

## `daysOld` (type: `integer`):

Only return listings posted within this many days. Snaps to the nearest supported window (1, 3, 7, or 30). Set to 0 to disable.

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

Maximum number of job listings to return across all searches.

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

When enabled, fetches each job's detail page for the full description (text, HTML, and Markdown), structured salary, industry, contract type, geo-coordinates, and apply URL. Increases run time.

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

Return a reduced set of core fields per job (id, title, company, location, salary, contract type, dates, URLs). Useful for AI agents and MCP pipelines.

## `skipReposts` (type: `boolean`):

Skip listings already seen in previous runs (90-day dedup window). Enable for new-only feeds on scheduled runs.

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

Specific IrishJobs.ie search or job detail URLs to scrape directly. Overrides all keyword and location filters.

## `telegramToken` (type: `string`):

Bot token from @BotFather, e.g. '110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw'. Requires Telegram chat ID below.

## `telegramChatId` (type: `string`):

Chat or channel ID the bot posts to, e.g. '-1001234567890'. Get it from @userinfobot.

## `discordWebhookUrl` (type: `string`):

Discord channel webhook, e.g. 'https://discord.com/api/webhooks/…'. Channel settings → Integrations → Webhooks.

## `slackWebhookUrl` (type: `string`):

Slack incoming webhook, e.g. 'https://hooks.slack.com/services/…'.

## `whatsappPhoneNumberId` (type: `string`):

Meta Cloud API phone number ID, e.g. '106540352242922'. Requires access token and recipient below.

## `whatsappAccessToken` (type: `string`):

Meta Cloud API access token for the WhatsApp Business account.

## `whatsappTo` (type: `string`):

Recipient phone number in international format, e.g. '31612345678'.

## `webhookUrl` (type: `string`):

Any HTTPS endpoint. Receives a JSON POST with site, query, result counts and the newest items, e.g. 'https://example.com/hooks/jobs'.

## `webhookHeaders` (type: `object`):

Optional extra HTTP headers for the webhook request, e.g. {"Authorization": "Bearer abc123"}.

## `notificationLimit` (type: `integer`):

Maximum number of results shown in a notification message. Default 10, cap 25.

## `notifyOnlyChanges` (type: `boolean`):

Only send a notification when the run found new or changed items. Applies when incremental tracking is active; full runs with results always notify.

## Actor input object example

```json
{
  "searchQuery": "software engineer",
  "searchQueries": [
    "python developer",
    "data engineer",
    "devops"
  ],
  "location": "Dublin",
  "category": "34",
  "daysOld": 7,
  "maxResults": 100,
  "fetchDetails": false,
  "compact": false,
  "skipReposts": false,
  "startUrls": [],
  "notificationLimit": 10,
  "notifyOnlyChanges": true
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQuery": "developer"
};

// Run the Actor and wait for it to finish
const run = await client.actor("unfenced-group/irishjobs-ie-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 = { "searchQuery": "developer" }

# Run the Actor and wait for it to finish
run = client.actor("unfenced-group/irishjobs-ie-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 '{
  "searchQuery": "developer"
}' |
apify call unfenced-group/irishjobs-ie-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=unfenced-group/irishjobs-ie-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/gvBqL0U3tROYbXIwk/builds/okookm9UvkVcYvMbq/openapi.json
