# myjobscotland Scraper – Scottish Council & Public Sector Jobs (`ukopendatatools/myjobscotland-jobs`) Actor

Export live jobs from myjobscotland.gov.uk: all 32 Scottish councils plus care, education and emergency-services employers. Salary, hours, contract, closing date, full advert. Daily new-job alerts. No login.

- **URL**: https://apify.com/ukopendatatools/myjobscotland-jobs.md
- **Developed by:** [UK Open Data Tools](https://apify.com/ukopendatatools) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 results

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

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

## What's an Apify Actor?

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

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

## How to integrate an Actor?

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

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

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

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

# README

## myjobscotland Scraper – Scottish Council & Public Sector Jobs

**Export live vacancies from myjobscotland.gov.uk, the jobs portal for all 32 Scottish councils plus care, education, early-years and emergency-services employers.** Each job comes with its title, employer, salary, hours, contract type, closing date, categories and the full advert, as clean JSON, CSV or Excel. You don't need a login, browser or proxy, and it can run on a schedule as a daily new-jobs feed.

### What data does it return?

- **Job:** title, reference, position type (full/part time), contract type (permanent/temporary), hours, job categories, full description (contact details redacted by default), apply link
- **Employer:** organisation (e.g. Glasgow City Council, Shetland Islands Council), sector (councils, adult care, early years, education, emergency services, other organisations), location
- **Pay and dates:** salary text plus parsed min/max salary in GBP and the pay period, date added, closing date

### Who is it for?

- **Recruitment agencies** covering Scottish local government, social care and education
- **HR and reward teams:** salary benchmarking across councils (social workers, teachers, HGV drivers, care staff…)
- **Local job boards, newsletters and alerts:** Slack, Telegram or email digests of new council jobs (`onlyNew` + a schedule)
- **Researchers:** council and public-sector hiring trends in Scotland

### How to use it

1. Click **Try for free** / **Start**.
2. Enter a keyword (e.g. `social worker`, `teacher`, `HGV`) or leave it empty for all live jobs (around 2,000). You can also filter by organisation, sector, location, category or minimum salary.
3. Set **Max results** to cap the run and your cost.
4. Run it, then download the results as JSON, CSV or Excel, or read them through the Apify API.

### Input example

```json
{"keyword": "social worker", "organisations": ["Glasgow"], "postedWithinDays": 7, "maxItems": 100}
```

All inputs: keyword, sectors, organisations, locations, categories, excludeKeywords, minSalaryGbp, postedWithinDays, includeDetails, onlyNew + stateKey, redactContactDetails, maxItems, maxPages.

### Output example

One dataset item per job. This record is from a real test run (description shortened):

```json
{
  "jobId": "494359",
  "title": "Head Teacher - Whalsay School",
  "url": "https://myjobscotland.gov.uk/councils/shetland-islands-council/jobs/head-teacher-whalsay-school-494359",
  "organisation": "Shetland Islands Council",
  "sector": "councils",
  "location": "Whalsay School, Whalsay",
  "positionType": "Full Time",
  "contractType": "Permanent",
  "salaryText": "£79,614.00 - £79,614.00",
  "salaryMinGbp": 79614,
  "salaryMaxGbp": 79614,
  "closingDate": "2026-11-10",
  "addedAt": "2026-10-20T09:28:00.000Z",
  "reference": "SIC09079",
  "promoted": true,
  "applyUrl": "https://myjobscotland.gov.uk/apply?jobId=PXOFK026203F3VBQB798M8MZY-656673",
  "datePosted": "2026-10-28T00:00:00",
  "hours": "35 hours",
  "categories": [
    "Education",
    "Headships"
  ],
  "employmentTypes": [
    "FULL_TIME"
  ],
  "salaryPeriod": "year",
  "organisationUrl": "https://myjobscotland.gov.uk/councils/shetland-islands-council",
  "description": "Advertisement DetailsAre you passionate about teaching, learning and inclusion with the skills, confidence and energy to make a positive impact on the lives of …",
  "source": "myjobscotland.gov.uk",
  "scrapedAt": "2026-10-29T10:09:41.859Z"
}
```

### How much does it cost?

Pay per result: **$0.0025 per job returned ($2.50 per 1,000 results).** There's no subscription, and Apify platform usage is included in the price.

| Jobs returned | Cost |
|---|---|
| 100 | $0.25 |
| 1,000 | $2.50 |
| 10,000 | $25.00 |

Use **Max results** and Apify's *maximum cost per run* setting to cap spend. The Actor stops cleanly when your budget is reached. Jobs skipped by your filters or already seen (`onlyNew`) are **not** charged.

### Monitoring new jobs

Set `onlyNew: true` and schedule the Actor daily (Apify **Schedules**). Each run returns, and charges for, only jobs it hasn't returned before for that `stateKey`. Connect Apify integrations (webhooks, Make, Zapier, Google Sheets, Slack) to send new jobs wherever you need them.

### Legal and data protection

myjobscotland (COSLA) publishes this information publicly and states it is happy to share data in line with Open Government Licence principles. robots.txt allows `/search-jobs` and job pages. The Actor is polite (≤90 requests/min) and emails and phone numbers are redacted by default.

### FAQ

- **Which employers are covered?** Whatever is advertised on myjobscotland: the 32 Scottish councils plus the care, education, early-years, emergency-services and other organisations that post there. NHS Scotland jobs are not on myjobscotland.
- **Can I get only jobs from one council?** Yes. Put the council name in **Organisations**, e.g. `Highland` or `City of Edinburgh`.
- **Can I export to CSV, Excel or Google Sheets?** Yes. Every dataset can be exported in those formats or fetched through the API.
- **Does it break when the site changes?** Live tests run against the real site, and the run fails loudly instead of returning empty data, so you're never charged for nothing.
- **Need another field or source?** Open an issue on the Actor page.

# Actor input Schema

## `keyword` (type: `string`):

Search keyword, e.g. 'teacher', 'social worker', 'HGV'. Leave empty for all live jobs (~2,000).

## `organisations` (type: `array`):

e.g. 'Glasgow City Council', 'Highland', 'College'.

## `sectors` (type: `array`):

Employer type from the job URL: councils, adult-care, early-years, education, emergency-services, organisations.

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

Town/place text, e.g. 'Aberdeen', 'Lerwick'.

## `categories` (type: `array`):

e.g. 'Social Care', 'Teaching', 'Driving'. Requires details.

## `excludeKeywords` (type: `array`):

Skip jobs whose title contains any of these.

## `minSalaryGbp` (type: `integer`):

Uses the top of the advertised range.

## `postedWithinDays` (type: `integer`):

0 = any.

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

Visits each job page for description, hours, categories and employment types.

## `redactContactDetails` (type: `boolean`):

Removes personal contact details from descriptions (recommended for UK GDPR).

## `onlyNew` (type: `boolean`):

Monitoring mode for daily schedules.

## `stateKey` (type: `string`):

Separate memory per saved search.

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

Stop after this many jobs (0 = no limit). You pay per job returned.

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

Safety cap on search pages (24 jobs/page).

## `proxyConfiguration` (type: `object`):

Not needed normally.

## Actor input object example

```json
{
  "keyword": "social worker",
  "includeDetails": true,
  "redactContactDetails": true,
  "onlyNew": false,
  "stateKey": "default",
  "maxItems": 200,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All results in the default dataset, shown with the Overview table view by default.

# 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 = {
    "keyword": "social worker"
};

// Run the Actor and wait for it to finish
const run = await client.actor("ukopendatatools/myjobscotland-jobs").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 = { "keyword": "social worker" }

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

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

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

```

## CLI example

```bash
echo '{
  "keyword": "social worker"
}' |
apify call ukopendatatools/myjobscotland-jobs --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ukopendatatools/myjobscotland-jobs"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/sqMBuaQ7hy3UczFju/builds/jdXvB5z027faUae9m/openapi.json
