# IrishJobs.ie Ireland Jobs Scraper (`memo23/irishjobs-scraper`) Actor

Scrape job postings from IrishJobs.ie — title, employer + logo, structured EUR salary band, work type, dates, full description, and applyUrl. Works with any keyword, county, company, or filtered search URL. Efficient JSON-based pagination, one flat row per job. JSON or CSV out.

- **URL**: https://apify.com/memo23/irishjobs-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Jobs, AI, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.45 / 1,000 job postings

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

## IrishJobs.ie Ireland Jobs Scraper

Turn Ireland's leading job board into clean, structured hiring data. Paste any IrishJobs.ie search URL — keyword, county, company, or filtered — and get one flat row per job posting: title, employer with logo, structured EUR salary band, work type, dates, full description, and the apply URL. No browser, no flakiness, no per-request proxy bills.

#### How it works

![How the IrishJobs.ie Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-irishjobs.png)

#### ✨ Why use this scraper?

- **All-Ireland coverage** — every sector and county on IrishJobs.ie, Dublin to Donegal, thousands of live postings.
- **Any search URL works** — the query string is honoured server-side, so every filter the IrishJobs web search supports (keyword, location, salary, posted date, remote…) works here too. No filter-mapping surprises.
- **Efficient JSON-based pagination** — listings are walked through the site's own structured feed (25 jobs per call), not scraped from HTML. Faster, cheaper, far more robust to redesigns.
- **Three data sources merged per row** — the listing feed, the JobPosting JSON-LD, and the job-ad app state. You get fields (structured salary, work type, employer jobs count, skills) that plain HTML scrapers miss.
- **Structured EUR salary band** — `min` / `max` / `currency` / `period` parsed when the employer disclosed one; the honest `"€ Not Disclosed"` raw text when they didn't. Never fabricated.
- **Built-in residential proxy at no extra cost** — traffic is pre-routed; nothing to configure, no proxy add-ons to buy.

#### 🎯 Use cases

| Who | What they do with it |
|---|---|
| **Recruiters & staffing agencies** | Monitor competitor postings, source niches by county, track when roles close (`validThrough`). |
| **HR & compensation analysts** | Benchmark Irish salaries by sector using the structured salary band + work type. |
| **Job aggregators & boards** | Ingest a clean JSON feed of Irish vacancies with stable numeric IDs for dedup. |
| **Market & labour researchers** | Track hiring volume by industry, employer, county over time (`datePosted`, `industry`, `employer.jobsCount`). |
| **Lead-gen teams** | Companies that are hiring are companies that are buying — enrich rows with contact emails (opt-in) and qualify by payment stack. |

#### 📥 Supported inputs

| Input URL | Example | What happens |
|---|---|---|
| Keyword listing | `https://www.irishjobs.ie/jobs/software-engineer` | Paginates all matches, one row per job |
| Keyword + location | `https://www.irishjobs.ie/jobs/accountant/in-cork` | Server-side location filter honoured |
| Location / county | `https://www.irishjobs.ie/jobs/dublin` | All jobs for that area |
| Company jobs page | `https://www.irishjobs.ie/jobs-at/{company-slug}` | All live postings for one employer |
| Filtered search | any listing URL + query string (`?salary=…`, `?postedWithin=…`, …) | Filters honoured verbatim, server-side |
| Job detail | `https://www.irishjobs.ie/job/{slug}/{org}-job{id}` | Scraped directly — exactly 1 row |

**Not supported:** URLs from other domains (including UK Stepstone sister sites — use the dedicated TotalJobs / Caterer / CWJobs scrapers for those), CV-search or recruiter-side pages, and pages behind a login.

#### 🔄 How it works

1. **Classify** every input URL — listing vs job detail.
2. **Walk listings** through IrishJobs' structured resultlist feed, 25 jobs per call, `?page=N` pagination, until your `maxItems` cap or the result set ends.
3. **Fetch each job page** in parallel (sliding-window concurrency) through the built-in residential proxy, racing three independent HTTP stacks for reliability.
4. **Parse & merge** the JobPosting JSON-LD, the job-ad app state (salary text, work type, company card), and the listing item (structured salary, skills, dates) into one flat row.
5. **Push one row per job** to the dataset — no padding rows, you pay per real result.

#### ⚙️ Input parameters

| Field | Type | Default | Description |
|---|---|---|---|
| `startUrls` | array | — | Mix of IrishJobs listing URLs and direct job-detail URLs. **Required.** |
| `maxItems` | integer | `1000` | Max job rows **per listing URL**. Direct detail URLs always emit 1 row each. |
| `maxConcurrency` | integer | `4` | Parallel detail-page fetches. 3–6 is the sweet spot. |
| `maxRequestRetries` | integer | `6` | Per-URL retry budget; each retry rotates the proxy session. |
| `enrichEmails` | boolean | `false` | Opt-in: discover a contact email for each hiring employer. Billed per email found, never for misses. |
| `qualifyByPayment` | boolean | `false` | Opt-in, requires `enrichEmails`: flag employers whose websites take payments online (Stripe, Shopify, PayPal…). Free with enrichment. |
| `proxy` | object | built-in | Optional override. Leave empty — the built-in residential proxy is already configured and free. |

#### 📊 Output overview

Each dataset record is **one job posting** as a flat row. Identity fields (`jobId`, `jobUrl`, `title`) sit at the top level; the employer, location, and salary are small nested objects so CSV export stays readable (`employer.name`, `salary.min`, …). Every row records which search URL it was discovered on (`sourceSearchUrl`), so multi-URL runs stay traceable.

#### 📦 Output sample

Real row from a live run (description trimmed):

```json
{
  "rowType": "job",
  "jobId": "107578248",
  "jobUrl": "https://www.irishjobs.ie/job/healthcare-assistant-home-care/hibernia-home-care-job107578248",
  "sourceSite": "irishjobs.ie",
  "title": "Dublin North Central - Healthcare Assistant / Home Care Support Worker (Full-Time)",
  "description": "<div><strong>Job Title: Healthcare Assistant / Home Care Support Worker (Full-Time)</strong>…",
  "datePosted": "2026-06-24T03:13:45.33Z",
  "validThrough": "2026-07-24T22:00:00Z",
  "industry": "Health, Health-Nursing",
  "directApply": true,
  "workType": "Permanent",
  "contractType": null,
  "workFromHome": null,
  "skills": [],
  "employer": {
    "name": "Hibernia Home Care",
    "url": "https://www.irishjobs.ie/jobs/hibernia-home-care-group?cmpId=1348188&cmp=1",
    "logoUrl": "https://www.irishjobs.ie/CompanyLogos/715b3506-a4ef-4baa-a31b-9bf506f2c173.png",
    "id": 1348188,
    "jobsCount": 10
  },
  "location": {
    "text": "Dublin, County Dublin, Dublin, IE",
    "locality": "Dublin, County Dublin",
    "region": "Dublin",
    "postalCode": null,
    "country": "IE",
    "lat": 53.33306,
    "lng": -6.24889
  },
  "salary": {
    "rawText": "€32,691 per annum",
    "min": 32691,
    "max": null,
    "currency": "EUR",
    "period": "annum"
  },
  "applyUrl": "https://www.irishjobs.ie/job/healthcare-assistant-home-care/hibernia-home-care-job107578248",
  "applyType": "internal",
  "scrapedAt": "2026-07-13T13:13:47.372Z"
}
````

#### 🗂 Key output fields

| Field | Notes |
|---|---|
| **Identity** | |
| `jobId` | Stable numeric ID from the URL suffix — use for dedup across runs. |
| `jobUrl` | Canonical job page on IrishJobs.ie. |
| `sourceSearchUrl` | The listing URL this row was discovered on (`null` for direct detail inputs). |
| **Posting** | |
| `title`, `description` | Description is the full HTML body. |
| `datePosted`, `validThrough` | ISO 8601. `validThrough` = closing date. |
| `industry` | IrishJobs category tag, e.g. `"Health, Health-Nursing"`. |
| `workType` | `"Permanent"` / `"Contract"` / `"Temporary"` / `"Part Time"` — from the job-ad metadata. |
| `workFromHome` | `"Hybrid"` / `"Remote"` / `null` — from the listing feed. |
| `skills` | Skill tags from the listing feed, when the employer added them. |
| **Employer** | |
| `employer.name`, `employer.id`, `employer.logoUrl` | `employer.url` is the IrishJobs company-jobs page (not the company's own website). |
| `employer.jobsCount` | Live postings count for this employer — a hiring-intensity signal. |
| **Location** | |
| `location.lat` / `location.lng` | Populated when the posting carries geo data. |
| **Salary** | |
| `salary.rawText` | Always present — `"€ Not Disclosed"` when the employer hid it (common in Ireland). |
| `salary.min/max/currency/period` | Only set when a real band was disclosed. Never inferred or predicted. |
| **Apply** | |
| `applyType` | `"internal"` (one-click on IrishJobs, `applyUrl` = job page) / `"external"` (recruiter ATS — resolve by opening `jobUrl`) / `"unknown"`. |
| **Enrichment (opt-in)** | |
| `contactEmail`, `contactWebsite`, `emailEnrichment` | Only when `enrichEmails: true`. |

#### ❓ FAQ

**Do search filters from the website work?**
Yes — your URL is passed to IrishJobs' own search backend verbatim, so anything the web UI can filter (keyword, county, salary, posted date, remote…) is honoured server-side. If the URL works in your browser, it works here.

**Why is `salary.min` null on many rows?**
Because the employer chose "€ Not Disclosed" — roughly half of Irish postings do. The row keeps the honest raw text, and `min`/`max` stay null. We deliberately do **not** copy the site's "predicted salary" widget: those are estimates, not the posting's own data.

**Is `applyUrl` always the recruiter's site?**
No. When `applyType` is `"internal"`, the application happens on IrishJobs itself and `applyUrl` equals `jobUrl`. When it's `"external"`, the recruiter URL is resolved by JavaScript at click-time, which a server-side scraper can't run — open `jobUrl` in a browser and click Apply.

**How many rows will a listing produce?**
Up to `min(maxItems, total results)` per listing URL. The first API call reports the exact total, and the run log shows it up front.

**Do I need to configure a proxy?**
No — every request already goes through the actor's built-in residential proxy at no extra cost. The `proxy` input exists only if you insist on your own pool.

**How fresh is the data?**
Every run hits the live site — rows are as current as the moment the run executes. Schedule the actor for continuous monitoring.

#### 💬 Support

- Found a bug or need a field added? Open an issue on the actor's [Issues tab](https://console.apify.com/actors/zOhXoEjIfjqRYMUEx/issues) — I usually respond within a day.
- Custom requirements (other Stepstone-family boards, bespoke output shapes, delivery to your DB)? Message me through Apify.

#### 🛠 Additional services

- **Contact-email enrichment** — flip `enrichEmails` on to get a contact email per hiring employer, billed only per email found.
- **Payment qualification** — flip `qualifyByPayment` on (free with enrichment) to flag employers that take payments online: processor stack, Stripe key exposure, confidence score.

#### 🔎 Explore more scrapers

Scraping other Stepstone-family boards? Same engine, dedicated actors:

- [StepStone Job Scraper](https://apify.com/memo23/stepstone-search-cheerio-ppr) — Germany, Austria, France, Denmark + contact emails
- [TotalJobs UK Scraper](https://apify.com/memo23/totaljobs-scraper) — UK's biggest Stepstone board, GBP salary bands
- [Caterer.com Scraper](https://apify.com/memo23/caterer-scraper) — UK hospitality vertical
- [CWJobs Scraper](https://apify.com/memo23/cwjobs-scraper) — UK tech & IT
- [Jobsite Scraper](https://apify.com/memo23/jobsite-scraper) — UK all sectors
- [s1jobs Scraper](https://apify.com/memo23/s1jobs-scraper) — Scotland

Plus **CharityJob**, **Goodmoves**, and 100+ other actors on the [memo23 profile](https://apify.com/memo23).

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by IrishJobs.ie, The Stepstone Group, or any of their subsidiaries or affiliates. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available job-posting pages — no authenticated endpoints, recruiter-only features, or content behind an IrishJobs login. Users are responsible for ensuring their use complies with IrishJobs.ie's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organisation.

***

### SEO Keywords

irishjobs scraper, scrape irishjobs.ie, irishjobs api, Apify irishjobs, ireland jobs scraper, irish job board scraper, dublin jobs data, cork jobs scraper, ireland job postings api, jobs ireland dataset, irish salary benchmark data, recruitment data ireland, hiring trends ireland, job market analysis ireland, ireland vacancy data, stepstone ireland scraper, jobs.ie alternative scraper, indeed ireland alternative, job listings extraction ireland, EUR salary data, JobPosting JSON-LD scraper, jobs to CSV ireland, labour market data ireland

# Actor input Schema

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

Mix of listing URLs (e.g. `https://www.irishjobs.ie/jobs/dublin`, `https://www.irishjobs.ie/jobs/software-engineer/in-cork`, `https://www.irishjobs.ie/jobs-at/{company}`) and direct job-detail URLs (`/job/{slug}/{company}-job{id}`). Every filter the IrishJobs web search supports works here too — the query string is honoured server-side (keyword, location, salary, posted-date, work-from-home, etc.). Listings auto-paginate; details emit one row each. Sister-site URLs are not supported here — for totaljobs.com use [TotalJobs Scraper](https://apify.com/memo23/totaljobs-scraper), for stepstone.de/at/fr/dk use [StepStone Scraper](https://apify.com/memo23/stepstone-search-cheerio-ppr).

## `maxItems` (type: `integer`):

Maximum job rows emitted **per listing URL**. Pass 3 listings with `maxItems: 100` → up to 300 total rows (100 each). Direct detail URLs always emit 1 row each. Each row is one paid dataset item. Default 1000. Free-tier users are additionally capped at 100 total rows.

## `maxConcurrency` (type: `integer`):

Parallel HTTP requests for detail-page fetches. Concurrency 3-6 is the sweet spot through the built-in residential proxy.

## `maxRequestRetries` (type: `integer`):

Per-URL retry budget on network errors, proxy CONNECT failures, HTTP/2 stream resets, and transient 4xx responses. Each retry rotates the proxy session. Default 6.

## `enrichEmails` (type: `boolean`):

If enabled, finds a contact email for each hiring employer (discovered from the company name, then its website is scanned). Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Billed per contact email found; only charged when an email is returned, never for misses.

## `qualifyByPayment` (type: `boolean`):

Requires "Enrich with contact emails". Scans each business's website — reusing the pages already fetched for email discovery, so no extra cost or time — for payment processors and e-commerce platforms (Stripe, Shopify, PayPal, Paddle, Lemon Squeezy, WooCommerce, Square, Chargebee and more). Adds takesPayments (is this a real paying business?), paymentProcessors (which stack), stripeLiveKey (the public key if exposed) and paymentConfidence. Turn raw contacts into monetization-qualified leads. No extra charge — included with each enriched company.

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

Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.irishjobs.ie/jobs/dublin"
  ],
  "maxItems": 1000,
  "maxConcurrency": 4,
  "maxRequestRetries": 6,
  "enrichEmails": false,
  "qualifyByPayment": false
}
```

# 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 = {
    "startUrls": [
        "https://www.irishjobs.ie/jobs/dublin"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/irishjobs-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 = { "startUrls": ["https://www.irishjobs.ie/jobs/dublin"] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/irishjobs-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 '{
  "startUrls": [
    "https://www.irishjobs.ie/jobs/dublin"
  ]
}' |
apify call memo23/irishjobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "IrishJobs.ie Ireland Jobs Scraper",
        "description": "Scrape job postings from IrishJobs.ie — title, employer + logo, structured EUR salary band, work type, dates, full description, and applyUrl. Works with any keyword, county, company, or filtered search URL. Efficient JSON-based pagination, one flat row per job. JSON or CSV out.",
        "version": "0.1",
        "x-build-id": "p9gpWGNYb3wFjeAtU"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~irishjobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-irishjobs-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/memo23~irishjobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-irishjobs-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/memo23~irishjobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-irishjobs-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",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "IrishJobs.ie URLs",
                        "type": "array",
                        "description": "Mix of listing URLs (e.g. `https://www.irishjobs.ie/jobs/dublin`, `https://www.irishjobs.ie/jobs/software-engineer/in-cork`, `https://www.irishjobs.ie/jobs-at/{company}`) and direct job-detail URLs (`/job/{slug}/{company}-job{id}`). Every filter the IrishJobs web search supports works here too — the query string is honoured server-side (keyword, location, salary, posted-date, work-from-home, etc.). Listings auto-paginate; details emit one row each. Sister-site URLs are not supported here — for totaljobs.com use [TotalJobs Scraper](https://apify.com/memo23/totaljobs-scraper), for stepstone.de/at/fr/dk use [StepStone Scraper](https://apify.com/memo23/stepstone-search-cheerio-ppr).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max jobs per listing URL",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum job rows emitted **per listing URL**. Pass 3 listings with `maxItems: 100` → up to 300 total rows (100 each). Direct detail URLs always emit 1 row each. Each row is one paid dataset item. Default 1000. Free-tier users are additionally capped at 100 total rows.",
                        "default": 1000
                    },
                    "maxConcurrency": {
                        "title": "Max parallel requests",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Parallel HTTP requests for detail-page fetches. Concurrency 3-6 is the sweet spot through the built-in residential proxy.",
                        "default": 4
                    },
                    "maxRequestRetries": {
                        "title": "Max request retries",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Per-URL retry budget on network errors, proxy CONNECT failures, HTTP/2 stream resets, and transient 4xx responses. Each retry rotates the proxy session. Default 6.",
                        "default": 6
                    },
                    "enrichEmails": {
                        "title": "Enrich with contact emails (experimental, billed per email)",
                        "type": "boolean",
                        "description": "If enabled, finds a contact email for each hiring employer (discovered from the company name, then its website is scanned). Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Billed per contact email found; only charged when an email is returned, never for misses.",
                        "default": false
                    },
                    "qualifyByPayment": {
                        "title": "💳 Qualify by payment (flag businesses that take money online)",
                        "type": "boolean",
                        "description": "Requires \"Enrich with contact emails\". Scans each business's website — reusing the pages already fetched for email discovery, so no extra cost or time — for payment processors and e-commerce platforms (Stripe, Shopify, PayPal, Paddle, Lemon Squeezy, WooCommerce, Square, Chargebee and more). Adds takesPayments (is this a real paying business?), paymentProcessors (which stack), stripeLiveKey (the public key if exposed) and paymentConfidence. Turn raw contacts into monetization-qualified leads. No extra charge — included with each enriched company.",
                        "default": false
                    },
                    "proxy": {
                        "title": "Proxy configuration (optional override)",
                        "type": "object",
                        "description": "Leave empty — the actor already routes all traffic through its own built-in residential proxy at no extra cost to you. Only set this if you want to use your own proxies."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
