IrishJobs.ie Scraper - Jobs, Salaries, Employers & Locations
Pricing
from $1.20 / 1,000 job scrapeds
IrishJobs.ie Scraper - Jobs, Salaries, Employers & Locations
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.
Pricing
from $1.20 / 1,000 job scrapeds
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
6 days ago
Last modified
Categories
Security
Limited permissionsShare
IrishJobs.ie Scraper: Job Listings, Salaries and Employer Details
IrishJobs.ie Scraper turns IrishJobs.ie into structured data. Search by keyword and location or paste your own search-result links, and get one flat row per job with title, employer, EUR salary bands, skills, employment type and posting date. Turn on detail-page enrichment for the full job description, GPS coordinates and any contact details listed on the posting. Run it once for a sample, or schedule it to monitor a search and receive only the jobs that are new, changed, or gone. Export to JSON, CSV or Excel, or pull results straight into your app through the API.
Why This Scraper?
- Two ways in. Build a search from keyword, location, job type, salary and recency filters, or paste any IrishJobs.ie search-result link and let the run paginate it.
- Rich listing data by default. Title, employer with logo, location, parsed EUR salary bands, skills and posting date come back on every job, no extra toggle needed.
- Optional detail enrichment. Switch on the full job description, GPS coordinates, Eircode, employment type and any listed contact details, and pay the enrichment charge only for the jobs actually read.
- Built for recurring searches. Incremental mode returns only new, updated or expired jobs on repeat runs of the same search, so a daily or weekly schedule does not re-bill jobs you already have.
- Resume without re-paying. Point Resume at a previous run or dataset and the crawl skips everything already collected there instead of starting over.
- Clear pass or fail. A run that cannot read the site at all stops with an error instead of quietly returning zero jobs, so an empty result you can trust is never confused with a blocked one.
Use Cases
- Job seekers and career sites: pull fresh listings for a role and location into your own search page or alert bot.
- Recruitment agencies and sourcing teams: track new postings from competing agencies and employers across Ireland.
- Compensation and workforce research: build a dataset of parsed EUR salary bands by role, county and employment type.
- Market and competitor monitoring: watch a given employer's or sector's hiring volume over time with scheduled incremental runs.
- Lead generation: find employers actively hiring in a region as a signal for outreach.
Data You Get
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
jobId | "9482113" |
jobUrl | "https://www.irishjobs.ie/job/senior-backend-engineer-job9482113" |
title | "Senior Backend Engineer" |
description | "We are looking for an experienced backend engineer..." (detail enrichment only) |
employerName | "Clover Peak Technologies" |
employerUrl | "https://www.irishjobs.ie/company/clover-peak-technologies" |
employerLogoUrl | "https://www.irishjobs.ie/img/logos/cloverpeak.png" |
employerId | 55210 |
locationText | "County Dublin" |
locationLocality / locationRegion | "Dublin" / "County Dublin" (detail enrichment only) |
locationPostalCode | "D02 XY45" (detail enrichment only) |
locationLat / locationLng | 53.3498 / -6.2603 (detail enrichment only) |
salaryRaw | "€55,000 - €65,000 per annum" |
salaryMin / salaryMax | 55000 / 65000 |
salaryCurrency / salaryPeriod | "EUR" / "year" |
employmentType | "FULL_TIME" (detail enrichment only) |
skills | ["Python", "AWS", "Kubernetes"] |
datePosted | "2026-09-15T09:00:00+00:00" |
validThrough | "2026-10-15T00:00:00+00:00" (detail enrichment only) |
applyUrl / applyType | "https://careers.cloverpeak.example/apply/9482113" / "external" (detail enrichment only) |
contactPhone / contactEmail | "+353 20 910 0142" / "careers@example.com" (detail enrichment only, when the posting lists one) |
sourceSearchUrl | "https://www.irishjobs.ie/jobs/software-engineer/in-dublin" |
scrapedAt | "2026-09-29T10:15:00+00:00" |
Every record also carries placement flags captured at scrape time (isSponsored, isHighlighted, isTopJob, isTrafficFromPartner, crossPostedCount), and in incremental mode also changeType, changedFields, firstSeenAt and lastSeenAt.
How to Use
- Pick a mode:
search(build a URL from your keyword, location and filters) orurl(paginate the exact search-result links you paste). - Fill in the filters for that mode, and turn on Fetch detail pages if you need the full description, GPS coordinates, Eircode or contact details.
- Set Max jobs and Max pages to control run size and cost, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it through the API.
Search by keyword and location:
{"mode": "search","keywords": ["software engineer"],"locations": ["Dublin"],"maxListings": 20}
Search with job type and salary filters:
{"mode": "search","keywords": ["engineer"],"locations": ["Dublin"],"jobType": "permanent","minSalary": 40000,"salaryType": "1","maxListings": 25}
Paste a search-result link and enrich each job:
{"mode": "url","urls": ["https://www.irishjobs.ie/jobs/software-engineer/in-dublin"],"maxPages": 3,"fetchDetails": true}
Monitor a search on a schedule:
{"mode": "search","keywords": ["nurse"],"locations": ["Dublin"],"incrementalMode": true,"emitExpired": true,"maxListings": 0}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/irishjobs-ie").call(run_input={"mode": "search","keywords": ["software engineer"],"locations": ["Dublin"],})for job in client.dataset(run["defaultDatasetId"]).iterate_items():print(job["title"], job["employerName"], job["salaryRaw"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/irishjobs-ie').call({mode: 'search',keywords: ['software engineer'],locations: ['Dublin'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one interrupted crawl: paste its run or dataset id and every job already collected there is treated as already-seen, so it does not count against Max jobs and is not paid for again. The walk keeps paging forward past an entirely already-collected page as long as it has not yet found any new job this search (subject to Max pages, if you set one); once it has found at least one new job, an all-duplicate page still stops that search's walk, so a resume is not guaranteed to reach every page deep in a large result set. - Incremental mode (
incrementalMode) is for scheduled runs over the same search. Each job is classifiedNEW,UPDATED(withchangedFields),UNCHANGED(suppressed and not billed unlessemitUnchangedis on), orEXPIRED.stateKeynames or shares the saved baseline for a search; leave it blank and the actor derives one from your search itself. - Ignore fields (
ignoreFieldsForChanges, incremental mode only) lists fields to leave out when deciding whether a job changed, for example a field that churns on your setup. Use the top-level output field names, for examplesalaryMin,salaryMaxoremployerLogoUrl; the job record is flat, so there are no dotted paths. Ignored fields stay in the output; a change in them alone is reported asUNCHANGEDand never appears inchangedFields. Changing this list does not re-report jobs you already track. Already-excluded by default:scrapedAt,sourceSearchUrl,travelTime,crossPostedCountand the placement flags. - A job is only ever marked as no-longer-present after a run with
emitExpiredon completed a full, uncapped scan of the search (no Resume, no Max jobs/Max pages cutoff). WithemitExpiredoff, disappeared jobs are simply left as-is in the saved baseline; nothing is marked gone, andEXPIREDcannot occur for that search until you turn it on and let one full scan complete. If a job that was previously markedEXPIREDshows up again in a later scan, it comes back asNEW, with a freshfirstSeenAt, not as a distinct "reappeared" state.
URL mode: supported links
In url mode, leaving Start URLs untouched scrapes one example of each shape below (Max jobs is shared across them). Replace the list to scrape only your own links.
| Link shape | Example |
|---|---|
| All jobs | https://www.irishjobs.ie/jobs |
| All jobs, page 2 (starts at that page; partial scope, never marks jobs EXPIRED) | https://www.irishjobs.ie/jobs?page=2 |
Keyword and location search (q=, l=) | https://www.irishjobs.ie/jobs?q=software+engineer&l=dublin |
| Keyword and location search, paginated (starts at that page; partial scope) | https://www.irishjobs.ie/jobs?q=software+engineer&l=dublin&page=2 |
Search sorted (sort=) | https://www.irishjobs.ie/jobs?q=software+engineer&l=dublin&sort=2 |
| Search with a job-type filter | https://www.irishjobs.ie/jobs?q=nurse&jobtype=permanent |
| Salary filter | https://www.irishjobs.ie/jobs?salary=40000&salarytypeid=1&action=facet_selected%3bsalary%3b40000%3bsalarytypeid%3b1 |
| Posted-within filter | https://www.irishjobs.ie/jobs?action=facet_selected%3bage%3b7&postedWithin=7 |
| Single job (one detail record keyed on the job id; needs the residential connection; the row is returned either way, and the detail enrichment event is charged only when Fetch detail pages is on) | https://www.irishjobs.ie/job/bms-engineer/bms-performance-job108278791 |
Host without www or the m. host (normalised to www) | https://irishjobs.ie/jobs?q=nurse |
Not supported: id-only job links (/job/job<id>, the site returns 404) and /browse-jobs (the site refuses it). They are skipped with a warning in the run log naming the link and the reason; they never end as a silent empty result.
Further fields: harmonisedId, remote, labels, isNew, isAnonymous, snippet (listing card), postCode, industry, directApply, applicantLocationRequirement, descriptionHtml and descriptionMarkdown (detail enrichment only), contentHash and source. Common alternate names are also filled with the same values: url, company, companyId, companyUrl, companyLogo, location, country, latitude, longitude, salary, publishDate, expiryDate, contractType, and changeStatus (incremental mode).
Send results into your apps (MCP connectors)
Optionally pipe the scraped jobs 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 job, not the full JSON. Each job becomes one entry with a title (the job title, falling back to employer or location) and its fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify > Settings > Integrations (Notion, Airtable, Linear, or Apify).
- Select it in the MCP Connectors input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where jobs 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 (build a URL from filters) or url (paginate pasted links). |
keywords | array | [] | Job title or keyword to search for. Empty browses all jobs. |
locations | array | [] | Town, city, or county to search in. Empty searches all of Ireland. |
jobType | string | "" (Any) | permanent, contract, temporary, part-time, or graduate. |
minSalary | integer | 0 | Minimum annual salary in EUR. 0 applies no salary filter. |
salaryType | string | "0" (Any) | Salary period code used with Minimum salary: "1" per annum, "4" per hour, "5" per day. |
postedWithin | string | "0" (Any time) | Days since posting: "1", "3", "7", "14", or "30". |
sortBy | string | "1" (Most relevant) | "2" Most recent, or "3" Salary (high to low). |
searchQuery | string | none | Alternate name for keywords; used only when keywords is empty. |
searchQueries | array | none | Alternate name for keywords; used only when keywords is empty. |
location | string | none | Alternate name for locations; used only when locations is empty. |
daysOld | integer | 0 | Alternate for postedWithin; rounded up to 1, 3, 7, 14 or 30 days. Used only when postedWithin is "0". |
startUrls | array | none | Alternate name for urls; when urls is untouched, switches to url mode. |
maxResults | integer | none | Alternate name for maxListings; used when Max jobs is left at its default of 20 (or not set). Any other Max jobs value wins. |
compact | boolean | false | Return a reduced core field set for AI agents. |
skipReposts | boolean | false | Turns on incremental mode and returns only NEW jobs; no UNCHANGED, UPDATED or EXPIRED rows. |
urls | array | one example of each supported link shape (see URL mode below) | Links for url mode: search-result links are paginated, job links are scraped as one record. |
maxPages | integer | none (unlimited) | Max search-result pages to walk per search. 0 or empty also means unlimited. |
maxListings | integer | 20 | Max jobs to return. 0 is unlimited. |
fetchDetails | boolean | false | Fetch each job's detail page for the full description, GPS coordinates and contact details. Bills a per-job enrichment charge only for pages actually read, and only when this is on (a pasted job link is returned without that charge when it is off). |
resumeFromRunId | string | none | Previous run id or dataset id to skip already-collected jobs. |
ignoreFieldsForChanges | array | [] | Top-level output fields (for example salaryMin, employerLogoUrl) ignored when detecting changes in incremental mode. |
incrementalMode | boolean | false | Enable recurring monitoring with change detection. |
stateKey | string | none | Stable key for the monitoring campaign's saved baseline. Defaults to a hash of your search. |
emitUnchanged | boolean | false | Also return (and bill) UNCHANGED rows. |
emitExpired | boolean | false | Also return (and bill) EXPIRED rows. Requires a complete, uncapped scan of the search. |
proxy | object | Residential (Ireland) | Connection settings. |
mcpConnectors | array | [] | Connector ids to forward jobs to (Notion, Airtable, Linear). |
notionParentPageUrl | string | none | Notion connector only: page under which jobs are created. |
maxNotifyListings | integer | 50 | Cap on jobs written to each connector per run. |
Output Example
Sample shape: values are illustrative placeholders, not from a live record.
{"jobId": "9482113","jobUrl": "https://www.irishjobs.ie/job/senior-backend-engineer-job9482113","title": "Senior Backend Engineer","description": "We are looking for an experienced backend engineer to join our growing platform team. You will design and maintain APIs, mentor junior developers, and work closely with product on our core booking system.","employerName": "Clover Peak Technologies","employerUrl": "https://www.irishjobs.ie/company/clover-peak-technologies","employerLogoUrl": "https://www.irishjobs.ie/img/logos/cloverpeak.png","employerId": 55210,"locationText": "County Dublin","locationLocality": "Dublin","locationRegion": "County Dublin","locationPostalCode": "D02 XY45","locationCountry": "IE","locationLat": 53.3498,"locationLng": -6.2603,"salaryRaw": "€55,000 - €65,000 per annum","salaryMin": 55000,"salaryMax": 65000,"salaryCurrency": "EUR","salaryPeriod": "year","employmentType": "FULL_TIME","skills": ["Python", "AWS", "Kubernetes"],"datePosted": "2026-09-15T09:00:00+00:00","validThrough": "2026-10-15T00:00:00+00:00","applyUrl": "https://careers.cloverpeak.example/apply/9482113","applyType": "external","sourceSearchUrl": "https://www.irishjobs.ie/jobs/software-engineer/in-dublin","contactPhone": "+353 20 910 0142","contactEmail": "careers@example.com","isSponsored": false,"isHighlighted": true,"isTopJob": false,"isTrafficFromPartner": false,"crossPostedCount": 0,"scrapedAt": "2026-09-29T10:15:00+00:00"}
Plan Requirement
IrishJobs.ie sits behind an edge that refuses most datacenter connections with an "Access Denied" page, so this actor needs a residential Ireland (or GB) connection to read it reliably (datacenter connections only work occasionally); a paid Apify plan or your own residential proxy URLs is required; the default proxy setting already selects it, and the run automatically retries with a different connection when one is refused. Detail-page enrichment also needs this connection type: without it, Fetch detail pages is skipped for the run and only listing fields are returned, at no enrichment charge.
FAQ
How much does it cost?
Three events are billed. apify-actor-start is charged once per run. Job scraped (apify-default-dataset-item) is charged once per job row pushed to the dataset. detail-enrichment is charged once per job whose detail page was actually fetched and read, and only when Fetch detail pages is on; skipped or failed pages are never charged. In incremental mode, unchanged jobs are not pushed and not billed. The Pricing tab shows the current rates. Use Max jobs to cap the cost of any run.
Is it legal to scrape IrishJobs.ie?
This actor collects only publicly available job listing data. You are responsible for how you use it: follow IrishJobs.ie's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution, especially around any contact details in a listing.
Can I get only new or changed jobs on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new, updated and expired jobs, and unchanged ones are not billed. Expired jobs need emitExpired on and at least one earlier run that completed a full, uncapped scan of the search; until then, a job that stops appearing is simply left alone in the saved baseline rather than marked gone. A job that comes back after being marked expired is reported as NEW again, not as a distinct "reappeared" state.
Why is employmentType empty on some jobs?
IrishJobs.ie's listing cards do not carry an employment type field at all. It is only filled in when Fetch detail pages is on and the job's own page states it.
Why did my run fail instead of returning an empty dataset?
If the site refuses every request, the run stops with a clear error so "no jobs match this search" is never confused with "nothing could be read". Run it again in a few minutes, or check your proxy settings. A genuine zero-match search still succeeds with an empty dataset.
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 jobs into Notion, Airtable or Linear.
🔗 Want more jobs data?
Pair this actor with these related scrapers from the same team:
| 💼 Totaljobs Scraper Scrape UK job listings from Totaljobs.com by keyword, location, filters, or URL. Extract... | 💼 CWJobs UK Scraper Scrape CWJobs.co.uk tech and IT job listings by keyword, location, salary, work type... |
| 💼 France Travail Scraper Scrape job offers from France Travail with titles, companies, locations, salaries... | 💼 Jobs.cz Scrape Czech job listings from Jobs.cz. Search builder (keyword, location, field, salary... |
| 💼 StepStone.de Scrape StepStone.de jobs by keyword, location, filters, or URL. Extract 35+ fields... | 💼 Workday Jobs Scraper Scrape job postings from any Workday-hosted careers site on Myworkdayjobs.com. Paste... |
💬 Support
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.