# s1jobs Scraper – Scotland & UK Jobs, Salaries & Details (`abotapi/s1jobs-com-scraper`) Actor

Scrape jobs from s1jobs.com across Scotland and the UK. Search by keyword, location, or URLs. Returns title, parsed salary band, company, logo, GPS location, skills, contract type, and 90+ fields per job, with optional full description, postcode, and apply links.

- **URL**: https://apify.com/abotapi/s1jobs-com-scraper.md
- **Developed by:** [AbotAPI](https://apify.com/abotapi) (community)
- **Categories:** Jobs, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 job results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are 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

## s1jobs.com Jobs Scraper

Extract job listings from s1jobs.com, Scotland's largest job site. Get the job title, parsed salary band, company, company logo, location with GPS coordinates, contract type, skills, posting dates and 90+ fields per job. Turn on full details and each record also carries the complete job description, postcode, structured location, matched and unmatched skills, accreditations and the apply links. Search by keyword and location, or paste search URLs you already refined in your browser.

### Why This Scraper?

* **90+ fields per job, 110+ with details on.** Title, parsed salary (raw text plus numeric min/max/period and hourly/annual aliases), company, company logo, city, county, district, country, GPS coordinates, contract type, full or part time, working pattern, skills, job types, posted and expiry dates, sponsored and featured flags, public sector flag, video flag and more.
* **Every field name, every alias.** Each value is exposed under camelCase, snake_case and nested shapes (for example `salary.min`, `salaryLow`, `salaryRangeLow`, `location.postalCode`, `employer.name`) so the output is a drop-in replacement no matter which schema your pipeline already expects.
* **Two input modes.** Pick a keyword and one or more locations from the form, or paste any s1jobs.com search URL. Multiple URLs are supported and results across pages are collected for you.
* **Rich client-side filters.** Contract type, full or part time, direct employer or recruitment agency, minimum salary (per year, day or hour), public sector only, jobs with video only, and sort by relevance or most recent.
* **Full detail enrichment.** Optionally fetch each job's full record to add the complete description, postcode, structured location, salary band, matched and unmatched skill counts, accreditations and the direct apply method, URL and email.
* **One clean limit.** Set the total number of jobs you want and the run collects up to that number for you.
* **Cost efficient.** Runs on the cheap, free-tier-friendly default connection, and works on any Apify plan including the free tier.

### Data You Get

> Sample shape - values are illustrative placeholders, not from a live listing.

| Field | Example |
|---|---|
| jobId | `000000000` |
| title | `Registered Nurse` |
| company | `Example Care Group` |
| companyLogo | `https://www.s1jobs.com/img/company/0000.png` |
| city | `Glasgow` |
| county | `Lanarkshire` |
| country | `Scotland` |
| coordinates | `{ "lat": 55.8642, "lng": -4.2518 }` |
| salary | `{ "rawText": "£30,000 - £35,000", "min": 30000, "max": 35000, "currency": "GBP", "period": "annual" }` |
| contractType | `Permanent` |
| fullOrPartTime | `Full` |
| workingHourPattern | `Regular working hours` |
| employmentType | `["PERMANENT", "FULL_TIME"]` |
| skills | `["Healthcare / Pharmaceuticals"]` |
| jobTypes | `["Nursing"]` |
| datePosted | `Sat, 06 Jun 2026 07:30:24 GMT` |
| expiryDate | `Mon, 06 Jul 2026 07:30:24 GMT` |
| isSponsored | `false` |
| isFeatured | `false` |
| isPublicSector | `false` |
| jobUrl | `https://www.s1jobs.com/job/registered-nurse-000000000` |
| postcode | `G1 1AA` (when `fetchDetails=true`) |
| description_text | `As Registered Nurse you will play a central role...` (when `fetchDetails=true`) |
| applicationUrl | `https://www.example.com/apply/0000` (when `fetchDetails=true`) |
| skillsUnmatchedCount | `16` (when `fetchDetails=true`) |
| scrapedAt | `2026-06-15T00:00:00+00:00` |

### How to Use

#### Search by keyword and location

```json
{
  "mode": "search",
  "locations": ["Glasgow", "Edinburgh"],
  "keywords": "nurse",
  "maxListings": 50,
  "fetchDetails": true,
  "proxy": { "useApifyProxy": true }
}
````

#### Filtered search (permanent, full time, public sector)

```json
{
  "mode": "search",
  "locations": ["Aberdeen"],
  "keywords": "project manager",
  "contractType": "permanent",
  "workingHours": "full",
  "publicSectorOnly": true,
  "minSalary": 35000,
  "salaryType": "annual",
  "sortBy": "date",
  "maxListings": 100
}
```

#### Paste search URLs

```json
{
  "mode": "url",
  "urls": [
    "https://www.s1jobs.com/jobs/?Keywords=warehouse&Location=glasgow",
    "https://www.s1jobs.com/jobs/?Location=edinburgh"
  ],
  "maxListings": 200,
  "fetchDetails": false
}
```

### Input Parameters

| Parameter | Type | Description |
|---|---|---|
| mode | string | `search` builds searches from the filters below; `url` paginates the URLs you paste. |
| locations | array | Towns, cities or counties (Search mode). One search runs per location. Empty lists jobs from everywhere. |
| keywords | string | Role, skill or company to search for (Search mode). |
| contractType | string | `any`, `permanent`, `contract` or `temporary`. |
| workingHours | string | `any`, `full` or `part`. |
| advertiserType | string | `any`, `employer` (direct) or `agency`. |
| minSalary | integer | Lowest salary to include; combined with the period below. Jobs with no numeric salary are always kept. |
| salaryType | string | Unit for the minimum salary filter: `annual`, `daily` or `hourly`. |
| publicSectorOnly | boolean | Keep only public sector roles. |
| hasVideoOnly | boolean | Keep only jobs that include a recruiter video. |
| sortBy | string | `relevance` or `date`. |
| urls | array | s1jobs.com search URLs to scrape (URL mode). Filter fields are ignored. |
| fetchDetails | boolean | Fetch each job's full record (description, postcode, skills, apply links). Default on. |
| maxListings | integer | Total jobs to collect across all searches. **This is the only run limit. Default 20.** `0` = unlimited. |
| maxPages | integer | Optional per-search safety stop on pages walked. Does **not** cap the run; defaults to `0` (unlimited) and defers to Max jobs. |
| proxy | object | Connection settings. A free-tier-friendly connection is the default. |

### Output Example

> Sample shape - values are illustrative placeholders, not from a live listing.

```json
{
  "jobId": "000000000",
  "title": "Registered Nurse",
  "company": "Example Care Group",
  "companyName": "Example Care Group",
  "companyLogo": "https://www.s1jobs.com/img/company/0000.png",
  "employer": {
    "name": "Example Care Group",
    "logoUrl": "https://www.s1jobs.com/img/company/0000.png",
    "url": "https://www.s1jobs.com/jobs/?CompanyId=0000"
  },
  "city": "Glasgow",
  "county": "Lanarkshire",
  "country": "Scotland",
  "postcode": "G1 1AA",
  "coordinates": { "lat": 55.8642, "lng": -4.2518 },
  "location": {
    "text": "Glasgow, Lanarkshire",
    "locality": "Glasgow",
    "region": "Lanarkshire",
    "country": "Scotland",
    "postalCode": "G1 1AA",
    "lat": 55.8642,
    "lng": -4.2518
  },
  "salary": {
    "rawText": "£30,000 - £35,000",
    "min": 30000,
    "max": 35000,
    "currency": "GBP",
    "period": "annual"
  },
  "salaryLow": 30000,
  "salaryHigh": 35000,
  "contractType": "Permanent",
  "fullOrPartTime": "Full",
  "employmentType": ["PERMANENT", "FULL_TIME"],
  "workingHourPattern": "Regular working hours",
  "skills": ["Healthcare / Pharmaceuticals"],
  "primaryCoreSkill": "Healthcare / Pharmaceuticals",
  "skillsUnmatchedCount": 16,
  "jobTypes": ["Nursing"],
  "datePosted": "Sat, 06 Jun 2026 07:30:24 GMT",
  "expiryDate": "Mon, 06 Jul 2026 07:30:24 GMT",
  "closingDate": null,
  "isSponsored": false,
  "isFeatured": false,
  "isPublicSector": false,
  "hasVideo": false,
  "applicationMethod": "url",
  "applicationUrl": "https://www.example.com/apply/0000",
  "applicationEmail": "jobs@example.com",
  "description_text": "As Registered Nurse you will play a central role in delivering high quality care...",
  "jobUrl": "https://www.s1jobs.com/job/registered-nurse-000000000",
  "canonicalUrl": "https://www.s1jobs.com/job/registered-nurse-000000000",
  "status": "live",
  "detailFetched": true,
  "scrapedAt": "2026-06-15T00:00:00+00:00"
}
```

### Send results into your apps (MCP connectors)

You can push every scraped job straight into the apps you already use, via Model Context Protocol (MCP) connectors, with no extra glue code:

1. Authorize a connector once under **Apify → Settings → Integrations**.
2. Select it in the **MCP connectors** input.
3. Run the scraper. Results are delivered to the connector as they are collected.

For the Notion connector, also set **Notion parent page URL** to the page under which a sub-page is created per job. Leave the MCP inputs empty to keep results in the Apify dataset only (the default).

### Plan Requirement

This scraper runs on Apify's free-tier-friendly default connection, so it works on any Apify plan including the free tier. For the highest reliability on very large runs you can pick a different connection in the proxy input; some connection options require a paid Apify plan.

# Actor input Schema

## `mode` (type: `string`):

How to find jobs: build a search from filters, or paginate URLs you paste.

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

Towns, cities, or counties (Search mode). Examples: 'Glasgow', 'Edinburgh', 'Aberdeen', 'Fife'. One search runs per location. Leave empty to list jobs from everywhere.

## `keywords` (type: `string`):

Role, skill, or company to search for. Example: 'nurse', 'warehouse', 'project manager', 'driver'. Leave empty to list all jobs in the location.

## `contractType` (type: `string`):

Filter by contract arrangement.

## `workingHours` (type: `string`):

Filter by full time or part time.

## `advertiserType` (type: `string`):

Restrict to direct employers or recruitment agencies.

## `minSalary` (type: `integer`):

Lowest salary to include. Combined with the salary period below. Jobs that quote no numeric salary (for example 'Competitive') are always kept. Leave empty for no minimum.

## `salaryType` (type: `string`):

Unit for the minimum salary filter.

## `publicSectorOnly` (type: `boolean`):

Keep only public-sector roles.

## `hasVideoOnly` (type: `boolean`):

Keep only jobs that include a recruiter video.

## `sortBy` (type: `string`):

Result ordering.

## `urls` (type: `array`):

s1jobs.com search-result URLs to scrape (URL mode). Multi-URL supported. Filter fields above are ignored. A page number in the URL is honoured as the starting point for results.

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

Fetch the per-job record to add the full description, postcode, structured location, salary band, matched and unmatched skills, accreditations and apply links. Adds ~20 fields. On = richest output (recommended). Off = fast, listing fields only.

## `maxListings` (type: `integer`):

Total jobs to collect across all searches. This is THE limit on the run (default 20). Set 0 for unlimited.

## `maxPages` (type: `integer`):

Optional per-search safety stop on pages walked (20 jobs per page). This does NOT cap the run - leave it at 0 (the default, unlimited) and the run defers to Max jobs for its size. Only set a value if you want to hard-stop pagination for one location/URL early.

## `maxResidentialRequests` (type: `integer`):

Safety cap on how many Residential proxy requests this run may use. 0 = unlimited. This cap stops a run from overspending on Residential bandwidth.

## `maxResidentialMB` (type: `integer`):

Safety cap on how many megabytes of Residential proxy traffic this run may transfer. 0 = unlimited. Once spent, the run keeps going on the cheaper default connection so it can never silently overspend on Residential bandwidth.

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

Connection settings. The cheap, free-tier-friendly default works well for this site. You can pick a different connection here for very large runs.

## `mcpConnectors` (type: `array`):

Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON - the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "locations": [
    "Glasgow"
  ],
  "contractType": "any",
  "workingHours": "any",
  "advertiserType": "any",
  "salaryType": "annual",
  "publicSectorOnly": false,
  "hasVideoOnly": false,
  "sortBy": "relevance",
  "urls": [
    "https://www.s1jobs.com/jobs/?Keywords=nurse&Location=glasgow"
  ],
  "fetchDetails": true,
  "maxListings": 20,
  "maxPages": 0,
  "maxResidentialRequests": 0,
  "maxResidentialMB": 0,
  "proxy": {
    "useApifyProxy": true
  },
  "maxNotifyListings": 50
}
```

# Actor output Schema

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

Individual job records with 90+ fields, plus ~20 detail fields when fetchDetails is enabled.

## `output` (type: `string`):

Run summary: total jobs, detail records fetched, pages walked, duration.

# 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 = {
    "locations": [
        "Glasgow"
    ],
    "urls": [
        "https://www.s1jobs.com/jobs/?Keywords=nurse&Location=glasgow"
    ],
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/s1jobs-com-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 = {
    "locations": ["Glasgow"],
    "urls": ["https://www.s1jobs.com/jobs/?Keywords=nurse&Location=glasgow"],
    "proxy": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/s1jobs-com-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 '{
  "locations": [
    "Glasgow"
  ],
  "urls": [
    "https://www.s1jobs.com/jobs/?Keywords=nurse&Location=glasgow"
  ],
  "proxy": {
    "useApifyProxy": true
  }
}' |
apify call abotapi/s1jobs-com-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "s1jobs Scraper – Scotland & UK Jobs, Salaries & Details",
        "description": "Scrape jobs from s1jobs.com across Scotland and the UK. Search by keyword, location, or URLs. Returns title, parsed salary band, company, logo, GPS location, skills, contract type, and 90+ fields per job, with optional full description, postcode, and apply links.",
        "version": "1.0",
        "x-build-id": "b1jKx5AVdzSFnhbab"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/abotapi~s1jobs-com-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-abotapi-s1jobs-com-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/abotapi~s1jobs-com-scraper/runs": {
            "post": {
                "operationId": "runs-sync-abotapi-s1jobs-com-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/abotapi~s1jobs-com-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-abotapi-s1jobs-com-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": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "url"
                        ],
                        "type": "string",
                        "description": "How to find jobs: build a search from filters, or paginate URLs you paste.",
                        "default": "search"
                    },
                    "locations": {
                        "title": "Locations",
                        "type": "array",
                        "description": "Towns, cities, or counties (Search mode). Examples: 'Glasgow', 'Edinburgh', 'Aberdeen', 'Fife'. One search runs per location. Leave empty to list jobs from everywhere.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "keywords": {
                        "title": "Keywords",
                        "type": "string",
                        "description": "Role, skill, or company to search for. Example: 'nurse', 'warehouse', 'project manager', 'driver'. Leave empty to list all jobs in the location."
                    },
                    "contractType": {
                        "title": "Contract type",
                        "enum": [
                            "any",
                            "permanent",
                            "contract",
                            "temporary"
                        ],
                        "type": "string",
                        "description": "Filter by contract arrangement.",
                        "default": "any"
                    },
                    "workingHours": {
                        "title": "Hours",
                        "enum": [
                            "any",
                            "full",
                            "part"
                        ],
                        "type": "string",
                        "description": "Filter by full time or part time.",
                        "default": "any"
                    },
                    "advertiserType": {
                        "title": "Advertiser type",
                        "enum": [
                            "any",
                            "employer",
                            "agency"
                        ],
                        "type": "string",
                        "description": "Restrict to direct employers or recruitment agencies.",
                        "default": "any"
                    },
                    "minSalary": {
                        "title": "Minimum salary",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Lowest salary to include. Combined with the salary period below. Jobs that quote no numeric salary (for example 'Competitive') are always kept. Leave empty for no minimum."
                    },
                    "salaryType": {
                        "title": "Salary period",
                        "enum": [
                            "annual",
                            "daily",
                            "hourly"
                        ],
                        "type": "string",
                        "description": "Unit for the minimum salary filter.",
                        "default": "annual"
                    },
                    "publicSectorOnly": {
                        "title": "Public sector only",
                        "type": "boolean",
                        "description": "Keep only public-sector roles.",
                        "default": false
                    },
                    "hasVideoOnly": {
                        "title": "Jobs with video only",
                        "type": "boolean",
                        "description": "Keep only jobs that include a recruiter video.",
                        "default": false
                    },
                    "sortBy": {
                        "title": "Sort by",
                        "enum": [
                            "relevance",
                            "date"
                        ],
                        "type": "string",
                        "description": "Result ordering.",
                        "default": "relevance"
                    },
                    "urls": {
                        "title": "Search URLs",
                        "type": "array",
                        "description": "s1jobs.com search-result URLs to scrape (URL mode). Multi-URL supported. Filter fields above are ignored. A page number in the URL is honoured as the starting point for results.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "fetchDetails": {
                        "title": "Fetch full job details",
                        "type": "boolean",
                        "description": "Fetch the per-job record to add the full description, postcode, structured location, salary band, matched and unmatched skills, accreditations and apply links. Adds ~20 fields. On = richest output (recommended). Off = fast, listing fields only.",
                        "default": true
                    },
                    "maxListings": {
                        "title": "Max jobs",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Total jobs to collect across all searches. This is THE limit on the run (default 20). Set 0 for unlimited.",
                        "default": 20
                    },
                    "maxPages": {
                        "title": "Max pages per search",
                        "minimum": 0,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Optional per-search safety stop on pages walked (20 jobs per page). This does NOT cap the run - leave it at 0 (the default, unlimited) and the run defers to Max jobs for its size. Only set a value if you want to hard-stop pagination for one location/URL early.",
                        "default": 0
                    },
                    "maxResidentialRequests": {
                        "title": "Residential request cap",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Safety cap on how many Residential proxy requests this run may use. 0 = unlimited. This cap stops a run from overspending on Residential bandwidth.",
                        "default": 0
                    },
                    "maxResidentialMB": {
                        "title": "Residential traffic budget (MB)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Safety cap on how many megabytes of Residential proxy traffic this run may transfer. 0 = unlimited. Once spent, the run keeps going on the cheaper default connection so it can never silently overspend on Residential bandwidth.",
                        "default": 0
                    },
                    "proxy": {
                        "title": "Proxy",
                        "type": "object",
                        "description": "Connection settings. The cheap, free-tier-friendly default works well for this site. You can pick a different connection here for very large runs."
                    },
                    "mcpConnectors": {
                        "title": "Pipe results into your apps (optional)",
                        "type": "array",
                        "description": "Optionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify → Settings → Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON - the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com)."
                    },
                    "notionParentPageUrl": {
                        "title": "Notion parent page (Notion connector only)",
                        "type": "string",
                        "description": "URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors."
                    },
                    "maxNotifyListings": {
                        "title": "Max items to export per connector",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Cap on items written to each connector per run. Does not affect the dataset.",
                        "default": 50
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
