# Jobs.ie Scraper (`steadyscrape/jobs-ie-scraper`) Actor

Scrape Jobs.ie job listings across Ireland by keyword, county and job type: title, employer, salary as numbers, location and county, posted and expiry dates, full description, skills and contract terms. Only-new-jobs mode for daily feeds. Export to JSON, CSV or Excel, or via API.

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

## Pricing

from $1.00 / 1,000 jobs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Jobs.ie Scraper

Scrape job listings from **[Jobs.ie](https://www.jobs.ie)**, Ireland's job board, by **keyword**, **county** and **job type**.
This Jobs.ie scraper gives every job with its **employer**, **location and county**, **salary as Jobs.ie shows it and as
numbers** (minimum, maximum, currency, per year / day / hour), **posting and expiry dates**, **snippet**, labels and link — and,
from each job's own page, the **full description**, **skill tags**, **employment type**, **contract and on-site / hybrid /
remote terms**, **industries**, the **job's address with coordinates** and the **advertiser's business address**.

No start fee, no login. Pay only for the jobs you get; searches that find nothing cost nothing.

> This Actor is unofficial and is not affiliated with, endorsed by or connected to Jobs.ie or StepStone.

### What you can do with this Jobs.ie scraper

- **Recruiting and sourcing in Ireland**: every open role for a title or skill, county by county, with the employer or
  agency advertising it.
- **Salary benchmarking**: published pay ranges as numbers you can sort and average, by role and county.
- **Job alerts and feeds**: schedule it daily with **Posted within** and **Only new jobs** to receive just the jobs posted
  since the last run — into a spreadsheet, Slack, email or your ATS through Apify's integrations.
- **Lead generation for recruitment agencies and HR services**: who is hiring for what, where, and how many jobs each
  advertiser has open.
- **Labour-market research**: demand by county, contract vs permanent, remote and hybrid work in Ireland.

### Input

| Field | What it does |
|---|---|
| **Keywords** | Job titles, skills or company names as people type them into Jobs.ie: `accountant`, `software developer`, `nurse`, `HR manager`. Each is read through Jobs.ie's own search page (`jobs.ie/jobs/accountant`). |
| **Counties, provinces or towns** | Empty for all of Ireland. `County Dublin`, `Co. Cork`, `Galway`, `Munster`, `Blanchardstown`: each keyword is searched in each place through Jobs.ie's own place page (`/jobs/accountant/in-county-dublin`), which also lists jobs a short distance around it. A place Jobs.ie does not know gives a free row instead of jobs from all of Ireland. |
| **Job types** | Contract, Part time, Temporary, Work from home — Jobs.ie's own job-type lists. |
| **jobs.ie search links** | Result lists copied from Jobs.ie, read at their address (page numbers and filter parameters dropped). |
| **Posted within** | Last 24 hours, 3, 7 or 14 days. |
| **Minimum yearly salary (€)** | Jobs whose published pay reaches it (hourly pay counted at 2,080 hours, daily at 260 days). |
| **Only jobs with a published salary** | Leaves out "€ Not Disclosed" jobs. |
| **Include job details** | On by default: opens each job's page (charged as job-with-details). |
| **Max jobs per search** | 100 by default; 0 for every job the list shows. |
| **Only new jobs since the last run** | Monitor mode for scheduled runs: jobs delivered before are skipped and not charged. |

Example — accountants and payroll jobs in Dublin and Cork, posted this week, paying at least €50,000:

```json
{
    "keywords": ["accountant", "payroll"],
    "locations": ["County Dublin", "County Cork"],
    "postedWithin": "7",
    "minYearlySalary": 50000,
    "maxJobsPerSearch": 200
}
```

Example — part-time and work-from-home customer service jobs anywhere in Munster, as a daily feed:

```json
{
    "keywords": ["customer service"],
    "jobTypes": ["part-time", "work-from-home"],
    "locations": ["Munster"],
    "onlyNewJobs": true,
    "maxJobsPerSearch": 0
}
```

### Output

One row per job (with job details on):

```json
{
    "jobId": "108242911",
    "url": "https://www.jobs.ie/job/accountant/noel-group-job108242911",
    "title": "Accountant",
    "companyName": "Noel Group",
    "companyId": "1256875",
    "companyLogo": "https://tjgliveassets.s3.eu-west-1.amazonaws.com/company-logos/c9d6abf4-1e22-4618-adcc-1890c59f021b.png",
    "companyJobsUrl": "https://www.jobs.ie/jobs/noel-group?cmpId=1256875&cmp=1",
    "location": "County Dublin",
    "county": "Dublin",
    "salaryText": "€60,000 - €65,000 per annum",
    "salaryMin": 60000,
    "salaryMax": 65000,
    "salaryCurrency": "EUR",
    "salaryPeriod": "year",
    "workFromHome": null,
    "postedAt": "2026-10-27T14:20:25.027Z",
    "expiresAt": "2026-11-27T00:00:00.000Z",
    "snippet": "We are partnering with a well-established hospitality group to recruit a Qualified Accountant who will play a key role i…",
    "labels": [
        "NEW"
    ],
    "isSponsored": false,
    "isTopJob": false,
    "crossPostedFrom": null,
    "matchType": "main",
    "rowType": "job",
    "status": "ok",
    "search": "accountant · County Dublin",
    "scrapedAt": "2026-10-28T13:10:00.000Z",
    "searchUrl": "https://www.jobs.ie/jobs/accountant/in-county-dublin",
    "position": 1,
    "details": {
        "description": "We are partnering with a well-established hospitality group to recruit a Qualified Accountant who will play a key role in financial reporting, controls, managem…",
        "descriptionHtml": "<div><p>We are partnering with a well-established hospitality group to recruit a Qualified…",
        "skills": [
            "accountant",
            "acca",
            "aca"
        ],
        "employmentTypes": [
            "FULL_TIME"
        ],
        "jobTerms": [
            "Permanent Contract",
            "On-site"
        ],
        "industries": [
            "Accountancy",
            "Accountancy-Accountancy"
        ],
        "validThrough": "2026-11-27T00:00:00.000Z",
        "directApply": true,
        "addressLocality": "Dublin, County Dublin",
        "addressRegion": "Leinster",
        "addressCountry": "IE",
        "latitude": 53.3389397,
        "longitude": -6.2527127,
        "companyAddress": "1a Santry Business Park, Turnapin Little, Dublin 9, Co. Dublin, Ireland",
        "companyOpenJobs": 54
    }
}
```

A search that gives nothing to charge for gives one **free** row with the reason: `no_results` (no job, or every job left
out by your filters, counted by filter), `not_found` (a place Jobs.ie does not know, a page that is gone), `invalid` (a
link that is not a Jobs.ie result list), `disallowed` (a page Jobs.ie's robots.txt closes to crawlers) or `blocked` (Jobs.ie
stopped answering). The run's **SUMMARY** record lists, per search, the jobs found, the jobs listed and pages read, the
place Jobs.ie said the list was for, and how many jobs each filter left out.

#### Fields

| Field | Description |
|---|---|
| `jobId`, `url`, `title` | Jobs.ie's job id, the job's page and its title. |
| `companyName`, `companyId`, `companyLogo`, `companyJobsUrl` | The employer or recruitment agency advertising the job, and its list of open jobs on Jobs.ie. |
| `location`, `county` | The location as Jobs.ie shows it ("Dundalk, Louth") and the county it names (`null` when it names a town alone, such as "Blanchardstown"). |
| `salaryText`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod` | The salary as shown ("€60,000 - €65,000 per annum", "€ Not Disclosed") and as numbers: `year`, `month`, `week`, `day` or `hour`. |
| `workFromHome` | The card's work-from-home note, when it has one. |
| `postedAt`, `expiresAt` | When the job was posted and the day Jobs.ie stops listing it (ISO 8601, UTC). |
| `snippet`, `labels`, `isSponsored`, `isTopJob`, `crossPostedFrom` | The card's text, badges ("NEW"), promotion flags and the sister site a job was cross-posted from. |
| `matchType` | `main` for a match of your search; other values for jobs Jobs.ie added as close matches. |
| `search`, `searchUrl`, `position`, `scrapedAt` | Which search found the job, the list it came from, its place in that search, and when. |
| `details.description`, `details.descriptionHtml` | The full job description as text and as HTML. |
| `details.skills` | The skill tags under the description. |
| `details.employmentTypes`, `details.jobTerms` | `FULL_TIME`, `PART_TIME`… and the ad's terms ("Permanent Contract", "On-site", "Hybrid"…). |
| `details.industries`, `details.validThrough`, `details.directApply` | The job's industries, its closing date, and whether you apply on Jobs.ie itself. |
| `details.addressLocality`, `addressRegion`, `addressCountry`, `latitude`, `longitude` | The job's address: town and county, province, country and coordinates. |
| `details.companyAddress`, `details.companyOpenJobs` | The advertiser's business address and how many jobs it has open. |

### Pricing

Pay per event, no start fee:

| Event | Price |
|---|---|
| `job` — a job as its list card shows it | US$0.001 |
| `job-with-details` — a job with its own page read | US$0.002 |

Rows with a reason (no results, not found, invalid, disallowed, blocked) and jobs already delivered earlier in the run are
free. Set a maximum cost per run in Apify and the Actor stops at it.

### Limits

- **Jobs.ie can only be read from Ireland**, so the Actor reads it through Apify's residential proxy in Ireland; that cost is
  included in the prices above.
- The Actor follows Jobs.ie's **robots.txt**: it reads the site's keyword, place and job-type pages and the job pages, and
  never its filter parameters. So **Posted within**, **salary** and the place for a **job type** are applied by the Actor
  to the jobs it reads, and **Permanent** jobs are not offered as a job type (that list is closed to crawlers; the
  `jobTerms` of each job say "Permanent Contract").
- A job type cannot be narrowed to a place in Jobs.ie's addresses, so with places the type's all-Ireland list is read and
  the jobs whose listed location names one of your places are kept; a job listed only by a town outside the place's name
  is left out.
- Jobs.ie does not mark on its pages whether an advertiser is a recruitment agency or a direct employer, so that is not a
  field. Recruiters' names, emails and phone numbers are not collected as fields.
- IrishJobs.ie, Jobs.ie's sister site, is not read.

### Is it legal to scrape Jobs.ie?

This Actor reads public job listings that anyone in Ireland can see without an account, follows the site's robots.txt, and
asks for one page a second. It collects no personal data as fields. Check that your use of the data complies with Jobs.ie's
terms and with the GDPR and other laws that apply to you. This Actor is unofficial and not affiliated with Jobs.ie or
StepStone.

# Actor input Schema

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

Job titles, skills or company names as people type them into jobs.ie, e.g. <code>accountant</code>, <code>software developer</code>, <code>nurse</code>, <code>HR manager</code>. Each is read through jobs.ie's own search page for it (<code>jobs.ie/jobs/accountant</code>). Give at least one keyword or a search link.

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

Leave empty for all of Ireland. <code>County Dublin</code>, <code>Co. Cork</code>, <code>Galway</code>, a province such as <code>Munster</code>, or a town such as <code>Blanchardstown</code>: each keyword is searched in each place through jobs.ie's own place page (<code>/jobs/accountant/in-county-dublin</code>). A place jobs.ie does not know gives a free row instead of jobs from all of Ireland.

## `jobTypes` (type: `array`):

Read jobs.ie's own job-type lists instead of the plain keyword list. jobs.ie's robots.txt closes these lists narrowed to a place, so with locations the type's all-Ireland list is read and the jobs whose listed location names one of your places are kept (a job listed only by a town outside your place's name is left out). Permanent is not offered: robots.txt closes it.

## `searchUrls` (type: `array`):

Result lists copied from jobs.ie, e.g. <code>https://www.jobs.ie/jobs/accountant/in-county-dublin</code>, each read at its address with page numbers and filter parameters dropped (use the filters below instead: jobs.ie's robots.txt closes its filter parameters to crawlers). Job pages are not taken.

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

Only jobs posted in the last days, as jobs.ie's own date filter offers them, checked against each job's posting date. Combine with a schedule and Only new jobs for a daily feed.

## `minYearlySalary` (type: `integer`):

Only jobs whose published pay reaches this much a year (hourly pay counted at 2,080 hours, daily at 260 days, monthly times twelve). Jobs with "€ Not Disclosed" are left out when this is set.

## `onlyWithSalary` (type: `boolean`):

Leave out jobs whose salary is "€ Not Disclosed".

## `includeDetails` (type: `boolean`):

Open each job's page for the full description, skill tags, employment type, contract and on-site / hybrid / remote terms, industries, the job's address with coordinates and the advertiser's business address. Charged as job-with-details instead of job.

## `maxJobsPerSearch` (type: `integer`):

Stop each search (each keyword in each place or job type, and each link) after this many jobs. 0 means every job the list shows.

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

Deliver, and charge, only jobs that an earlier run with the same searches and filters has not delivered. Made for scheduled runs.

## Actor input object example

```json
{
  "keywords": [
    "accountant"
  ],
  "locations": [
    "County Dublin"
  ],
  "jobTypes": [],
  "searchUrls": [],
  "postedWithin": "any",
  "onlyWithSalary": false,
  "includeDetails": true,
  "maxJobsPerSearch": 2,
  "onlyNewJobs": false
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "keywords": [
        "accountant"
    ],
    "locations": [
        "County Dublin"
    ],
    "maxJobsPerSearch": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/jobs-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 = {
    "keywords": ["accountant"],
    "locations": ["County Dublin"],
    "maxJobsPerSearch": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("steadyscrape/jobs-ie-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "accountant"
  ],
  "locations": [
    "County Dublin"
  ],
  "maxJobsPerSearch": 2
}' |
apify call steadyscrape/jobs-ie-scraper --silent --output-dataset

```

## MCP server setup

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