# PublicJobs.ie Scraper (`unfenced-group/publicjobs-ie-scraper`) Actor

Scrape job listings from PublicJobs.ie — Ireland's official public sector recruitment platform. Supports keyword, county and category filters.

- **URL**: https://apify.com/unfenced-group/publicjobs-ie-scraper.md
- **Developed by:** [Unfenced Group](https://apify.com/unfenced-group) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.49 / 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.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

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

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

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

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

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

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

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

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## PublicJobs.ie Scraper

![PublicJobs.ie Scraper Banner](https://i.imgur.com/MSSu4Oo.png)

Extract structured job listings from PublicJobs.ie — Ireland's official public sector recruitment platform, covering Civil Service competitions, HSE roles, local authority positions, and State Board appointments. No API key required. Supports keyword search, county filtering, job category filtering, and full description extraction.

---

### Why this scraper?

#### 🏛️ Full public sector coverage
Captures all vacancy types on the platform: Civil Service competitions managed directly by publicjobs, External Recruiter postings from public bodies, and State Board appointments — in a single structured dataset.

#### 🔍 Flexible search and filtering
Filter by keyword, Irish county (all 26 supported), job category, and vacancy type. Results respect every combination of filters simultaneously.

#### 📄 Rich job descriptions
When **Fetch detail pages** is enabled, each result includes the complete job description in HTML, plain text, and Markdown — along with grade, contract type, working pattern, and organisation website.

#### ♻️ Cross-run repost detection
The actor tracks job IDs across runs using a 90-day deduplication store. Enable **Skip reposts** to avoid processing vacancies you have already collected.

#### 📅 Date-based filtering
Use **Max age (days)** to retrieve only recently posted vacancies, ideal for scheduled daily or weekly runs.

#### 💸 Usage-based pricing
Pay only for results you receive — no subscriptions, no flat fees. Combine with **Max results** to cap spend exactly.

---

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `searchQuery` | string | `""` | Keyword(s) to search for |
| `county` | string | `""` | Irish county name, e.g. `Dublin`, `Cork` |
| `category` | string | `""` | Job category, e.g. `Administrative`, `Medical / Health` |
| `vacancyType` | enum | `All` | `All` / `publicjobs` / `External Recruiter` / `State Boards` |
| `maxResults` | integer | `500` | Maximum number of results to return |
| `fetchDetails` | boolean | `true` | Fetch full descriptions and structured fields from detail pages |
| `daysOld` | integer | — | Only return jobs posted within this many days |
| `skipReposts` | boolean | `false` | Skip jobs already seen in previous runs |
| `startUrls` | array | `[]` | Specific search result URLs to scrape |

**County values (case-insensitive):** Carlow, Cavan, Clare, Cork, Donegal, Dublin, Galway, Kerry, Kildare, Kilkenny, Laois, Leitrim, Limerick, Longford, Louth, Mayo, Meath, Monaghan, Offaly, Roscommon, Sligo, Tipperary, Waterford, Westmeath, Wexford, Wicklow.

**Category values (case-insensitive, partial list):** Administrative, Agricultural / Environmental, Business Support, Economics / Finance, Education, Engineering / Architects / Planners, Graduate and Trainee / Junior Management, Legal, Medical / Health, Science / IT / Technology.

---

### Output schema

```json
{
  "id": "3209",
  "url": "https://publicjobs.tal.net/vx/lang-en-GB/mobile-0/appcentre-1/brand-4/xf-.../candidate/so/pm/1/pl/3/opp/3209-Assistant-ICT-Manager-Dublin-City-Council/en-GB",
  "title": "Assistant ICT Manager - Dublin City Council",
  "organisation": "Dublin City Council",
  "location": "Dublin City Council",
  "county": "Dublin",
  "vacancyType": "publicjobs",
  "grade": "Head of Information Systems",
  "contractType": "Permanent",
  "workingPattern": "Full-Time",
  "roleType": "Local Authority",
  "orgWebsite": "https://www.dublincity.ie/",
  "advertisingDate": "2026-04-02",
  "closingDate": "2026-04-23",
  "publishDate": "2026-04-02",
  "publishDateISO": "2026-04-02",
  "applyUrl": "https://publicjobs.tal.net/vx/.../opp/3209-.../en-GB",
  "description": "<h3>Job summary</h3><p>...</p><h3>Main Duties of the Job</h3><p>...</p>",
  "descriptionText": "Job summary The Assistant ICT Manager...",
  "descriptionMarkdown": "#### Job summary\n\nThe Assistant ICT Manager...",
  "contentHash": "a1b2c3d4e5f60718",
  "source": "publicjobs.ie",
  "scrapedAt": "2026-04-09T14:22:00.000Z",
  "isRepost": false,
  "originalPublishDate": null,
  "originalUrl": null,
  "summary": "Assistant ICT Manager - Dublin City Council at Dublin City Council — Dublin City Council"
}
````

***

### Examples

**Example 1 — All current vacancies**

```json
{
  "maxResults": 500,
  "fetchDetails": true
}
```

**Example 2 — Nursing roles in Dublin, last 30 days**

```json
{
  "searchQuery": "nurse",
  "county": "Dublin",
  "daysOld": 30,
  "fetchDetails": true
}
```

**Example 3 — Administrative roles only, skip previously seen**

```json
{
  "category": "Administrative",
  "vacancyType": "publicjobs",
  "skipReposts": true,
  "fetchDetails": true,
  "maxResults": 200
}
```

**Example 4 — Fast metadata-only scan (no detail pages)**

```json
{
  "fetchDetails": false,
  "maxResults": 1000
}
```

***

### 💰 Pricing

**$1.49 per 1,000 results** — you only pay for successfully retrieved listings.
Failed retries and filtered reposts are never charged.

| Results | Cost |
|---|---|
| 100 | ~$0.15 |
| 500 | ~$0.75 |
| 1,000 | ~$1.49 |
| 10,000 | ~$14.90 |

> Flat-rate alternatives typically charge $29–$49/month regardless of usage.
> At 1,000 results/month, this scraper costs 95%+ less with no commitment.

Use the **Max results** cap in the input to control your spend exactly.

***

### Performance

| Run type | Results | Approx. time |
|---|---|---|
| All vacancies, list only (`fetchDetails: false`) | ~320 | ~30 seconds |
| All vacancies, with details (`fetchDetails: true`) | ~320 | ~8–12 minutes |
| Keyword search with details | 5–50 | ~1–3 minutes |

PublicJobs.ie is a relatively small board (~300–400 active vacancies at any time). Full runs complete quickly.

***

### Known limitations

- **Apply URL:** The `applyUrl` field points to the publicjobs.tal.net detail page. For some External Recruiter postings, applications are handled on the employer's own website.
- **Salary:** Salary information is embedded within the job description text (in the Benefits section) when provided. There is no separate structured salary field — salary is `null` for jobs that do not publish it.
- **Advertising date:** For some vacancies the advertising date is not shown on the detail page; the date from the list page is used in that case.
- **Irish language postings:** The scraper targets the English-language version of the platform. Irish (Gaeilge) listings are not included.
- **Total vacancies:** PublicJobs.ie is a specialist board focused on the Irish public sector. The total active listing count is typically 300–450 vacancies.

***

### Technical details

- **Source:** publicjobs.ie — Ireland's official public sector recruitment platform
- **Memory:** 256 MB
- **Repost storage:** KeyValueStore `publicjobs-ie-job-dedup`, 90-day TTL
- **Retry:** Automatic retry on network errors, exponential backoff, 3 attempts per request

***

### Additional services

Need a custom actor, additional filters, scheduled runs, or integration support?
Send an email to <info@unfencedgroup.nl> — we build on request.

***

*Built by [unfenced-group](https://apify.com/unfenced-group) · Issues? Open a ticket or send a message.*

# Actor input Schema

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

Keyword(s) to search for, e.g. 'nurse', 'engineer', 'data analyst'.

## `county` (type: `string`):

Filter by Irish county name, e.g. 'Dublin', 'Cork', 'Galway'. Case-insensitive. Leave blank for all counties.

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

Filter by job category, e.g. 'Administrative', 'Engineering / Architects / Planners', 'Medical / Health'. Case-insensitive. Leave blank for all categories.

## `vacancyType` (type: `string`):

Filter by vacancy type: 'All' returns every listing; 'publicjobs' returns only direct Civil Service competitions; 'External Recruiter' returns third-party postings; 'State Boards' returns State Board appointments.

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

Maximum number of job listings to return. Reduce to limit cost.

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

Fetch full job description, contract type, grade, and other structured fields from each job's detail page. Disable to retrieve list-only data faster.

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

Only return jobs posted within this many days. Set to 0 or leave blank to return all jobs.

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

Skip jobs already seen in previous runs of this actor (uses a 90-day cross-run deduplication store).

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

Optional list of specific PublicJobs.ie search result URLs to scrape instead of building the URL from the filters above. Each URL must be a publicjobs.tal.net job board URL.

## Actor input object example

```json
{
  "searchQuery": "",
  "county": "",
  "category": "",
  "vacancyType": "All",
  "maxResults": 500,
  "fetchDetails": true,
  "skipReposts": false,
  "startUrls": []
}
```

# 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 = {};

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

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "PublicJobs.ie Scraper",
        "description": "Scrape job listings from PublicJobs.ie — Ireland's official public sector recruitment platform. Supports keyword, county and category filters.",
        "version": "0.0",
        "x-build-id": "tVOhumHfcklhw2Q4o"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/unfenced-group~publicjobs-ie-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-unfenced-group-publicjobs-ie-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/unfenced-group~publicjobs-ie-scraper/runs": {
            "post": {
                "operationId": "runs-sync-unfenced-group-publicjobs-ie-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/unfenced-group~publicjobs-ie-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-unfenced-group-publicjobs-ie-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQuery": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Keyword(s) to search for, e.g. 'nurse', 'engineer', 'data analyst'.",
                        "default": ""
                    },
                    "county": {
                        "title": "County",
                        "type": "string",
                        "description": "Filter by Irish county name, e.g. 'Dublin', 'Cork', 'Galway'. Case-insensitive. Leave blank for all counties.",
                        "default": ""
                    },
                    "category": {
                        "title": "Job category",
                        "type": "string",
                        "description": "Filter by job category, e.g. 'Administrative', 'Engineering / Architects / Planners', 'Medical / Health'. Case-insensitive. Leave blank for all categories.",
                        "default": ""
                    },
                    "vacancyType": {
                        "title": "Vacancy type",
                        "enum": [
                            "All",
                            "publicjobs",
                            "External Recruiter",
                            "State Boards"
                        ],
                        "type": "string",
                        "description": "Filter by vacancy type: 'All' returns every listing; 'publicjobs' returns only direct Civil Service competitions; 'External Recruiter' returns third-party postings; 'State Boards' returns State Board appointments.",
                        "default": "All"
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of job listings to return. Reduce to limit cost.",
                        "default": 500
                    },
                    "fetchDetails": {
                        "title": "Fetch detail pages",
                        "type": "boolean",
                        "description": "Fetch full job description, contract type, grade, and other structured fields from each job's detail page. Disable to retrieve list-only data faster.",
                        "default": true
                    },
                    "daysOld": {
                        "title": "Max age (days)",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Only return jobs posted within this many days. Set to 0 or leave blank to return all jobs."
                    },
                    "skipReposts": {
                        "title": "Skip reposts",
                        "type": "boolean",
                        "description": "Skip jobs already seen in previous runs of this actor (uses a 90-day cross-run deduplication store).",
                        "default": false
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Optional list of specific PublicJobs.ie search result URLs to scrape instead of building the URL from the filters above. Each URL must be a publicjobs.tal.net job board URL.",
                        "default": [],
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
