# Creative Scotland Scraper: Arts Jobs & Grants (`getascraper/creativescotland-scraper`) Actor

Scrape every job, grant, residency, commission and tender from Creative Scotland's Opportunities board. Get organisation, location, deadline, tags, contact email and apply link for each listing.

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

## Pricing

from $1.31 / 1,000 opportunities

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Creative Scotland Scraper: Arts Jobs & Grants

<table width="100%">
<tr>
<td style="padding:24px 28px;background:#F5F3FF;border:1px solid #DDD6FE;border-top:4px solid #6D28D9;border-radius:12px">
<span style="font-size:23px;font-weight:800;color:#1C1917;line-height:1.3">Scrape every Creative Scotland opportunity, without the missed runs</span><br>
<span style="font-size:15px;color:#57534E;line-height:1.6">Pull jobs, grants, residencies, commissions and tenders from the Opportunities board, verified across multiple cloud runs at a 100% success rate.</span>
</td>
</tr>
</table>

<table width="100%">
<tr>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #DDD6FE;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#5B21B6">✅ Reliable by default</span><br>
<span style="font-size:12px;color:#57534E">Works out of the box, verified across multiple cloud runs at a 100% success rate.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #DDD6FE;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#5B21B6">🗂️ Every category covered</span><br>
<span style="font-size:12px;color:#57534E">Jobs, funding, residencies, commissions, tenders and more, all 16 board categories.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #DDD6FE;border-left:none;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#5B21B6">📄 Full detail, not just teasers</span><br>
<span style="font-size:12px;color:#57534E">Optional enrichment pulls the full description, pay rate, tags, contact email and apply link.</span>
</td>
<td style="padding:14px 12px;width:25%;background:#FFFFFF;border:1px solid #DDD6FE;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:15px;font-weight:800;color:#5B21B6">🎯 Filter before you scrape</span><br>
<span style="font-size:12px;color:#57534E">Narrow by category or the board's own recency filters so you only pay for what you need.</span>
</td>
</tr>
</table>

Never miss a Scottish arts opportunity, or waste a scheduled run on a scraper that quietly fails. This Actor pulls every job, grant, residency, commission and tender from [Creative Scotland's Opportunities board](https://opportunities.creativescotland.com), and it's built to actually finish the job every time.

### 🚀 Why use it

The only other scraper for this board fails roughly 3 out of every 10 runs, going by its own public Apify stats. That's a real problem if you're monitoring for new funding calls or job postings on a schedule: a silent failure means you miss the opportunity entirely.

**"I run a monthly digest for my arts organisation's newsletter."** I need every open opportunity in one clean list, not a scraper that comes back empty half the time and makes me manually check the site anyway.

**"I track funding calls for freelance clients."** Deadlines matter. If a run silently fails, I lose the lead time I'd otherwise have to prepare an application.

**"I'm building a job alert tool for creative workers in Scotland."** I need a reliable, filterable feed I can schedule and trust, not one I have to babysit.

### 🧭 How to use it

<table width="100%">
<tr>
<td style="padding:16px 14px;width:33%;background:#F5F3FF;border:1px solid #DDD6FE;border-radius:10px 0 0 10px;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#6D28D9;letter-spacing:1px">STEP 1</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Pick your scope</span><br>
<span style="font-size:12px;color:#57534E">Choose categories, a recency filter, or leave it open to scan the whole board.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#F5F3FF;border:1px solid #DDD6FE;border-left:none;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#6D28D9;letter-spacing:1px">STEP 2</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Run the Actor</span><br>
<span style="font-size:12px;color:#57534E">It crawls the board's pages and, if enabled, visits each listing for full detail.</span>
</td>
<td style="padding:16px 14px;width:33%;background:#F5F3FF;border:1px solid #DDD6FE;border-left:none;border-radius:0 10px 10px 0;vertical-align:top">
<span style="font-size:12px;font-weight:800;color:#6D28D9;letter-spacing:1px">STEP 3</span><br>
<span style="font-size:14px;font-weight:700;color:#1C1917">Get structured data</span><br>
<span style="font-size:12px;color:#57534E">Download clean, ready-to-use records in JSON, CSV or Excel from the Output tab.</span>
</td>
</tr>
</table>

### 📥 Input

| Field | Type | Required | Description |
|---|---|---|---|
| `startUrls` | array of URLs | No | Opportunities board URL(s) to crawl. Defaults to the full board. |
| `categories` | array (enum) | No | Only fetch opportunities in these categories. Leave empty for all. |
| `filter` | enum | No | Match the board's own recency/sort buckets (recently added, upcoming deadlines, and so on). |
| `keywords` | string | No | Optional free-text search term. |
| `proxyConfiguration` | object | No | Connection settings. Defaults to the setup this site needs to work reliably. |
| `enrichDetail` | boolean | No | Fetch each opportunity's full description, tags, contact email and apply link. |
| `maxItems` | integer | No | Stop after this many opportunities. 0 for no limit. |

### 📤 Output

```json
{
  "rowType": "opportunity",
  "opportunityId": "6dd19a67-7cb4-4cc7-8c72-37c452a3b4ec",
  "title": "Library Assistant",
  "category": "Jobs",
  "tags": ["Literature and Publishing"],
  "organization": "The Royal Conservatoire",
  "location": "Glasgow City",
  "deadline": "2026-09-13T23:55:00.000Z",
  "deadlineRaw": "13 September 2026 at 23:55",
  "descriptionTeaser": "Library Assistant Information Services Permanent, Part Time...",
  "description": "Full listing description text...",
  "payRaw": "Salary Scale: £25,979 per annum",
  "contactEmail": "vacancies@rcs.ac.uk",
  "externalUrl": "https://www.rcs.ac.uk/vacancies/",
  "opportunityUrl": "https://opportunities.creativescotland.com/opportunity/index/6dd19a67-7cb4-4cc7-8c72-37c452a3b4ec/",
  "scrapedAt": "2026-08-30T00:36:03.605Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV or Excel.

### 🗃️ Data table

| Field | Type | Description |
|---|---|---|
| `title` | string | Opportunity title |
| `category` | string | One of the board's 16 categories |
| `tags` | array | Secondary tags shown on the listing |
| `organization` | string | The organisation offering the opportunity |
| `location` | string | Geographic location |
| `deadline` | string | Application deadline, ISO format |
| `deadlineRaw` | string | Application deadline, as shown on the site |
| `descriptionTeaser` | string | Short summary shown on the board |
| `description` | string | Full listing description, enrichment mode only |
| `payRaw` | string | Pay, fee, or rate, when the listing states one |
| `contactEmail` | string | Contact email, when the listing includes one |
| `externalUrl` | string | External apply link, when the listing includes one |
| `opportunityUrl` | string | Direct link to the listing |

### 💰 Pricing

This Actor uses pay per event pricing: you're charged per opportunity extracted, and nothing else. Empty runs cost nothing. There are no subscriptions and no minimum spend.

### ⭐ Enjoying Creative Scotland Scraper?

<table width="100%">
<tr>
<td style="padding:20px 24px 14px;background:#F5F3FF;border:1px solid #DDD6FE;border-left:5px solid #6D28D9;border-radius:10px 10px 0 0">
<span style="font-size:20px;letter-spacing:4px">⭐ ⭐ ⭐ ⭐ ⭐</span><br>
<span style="font-size:17px;font-weight:800;color:#1C1917">If this Actor caught an opportunity you would have missed, that's worth 10 seconds of your time.</span><br>
<span style="font-size:14px;color:#57534E">A 5-star rating helps other arts organisers, funding trackers and job hunters find it. Your feedback also tells us what to build next.</span>
</td>
</tr>
<tr>
<td style="padding:0;background:#6D28D9;border:1px solid #DDD6FE;border-top:none;border-radius:0 0 10px 10px;text-align:center">
<a href="https://apify.com/getascraper/creativescotland-scraper/reviews" style="display:block;padding:13px 16px;color:#FFFFFF;text-decoration:none;font-weight:800;font-size:15px;letter-spacing:0.3px">★&nbsp;&nbsp;Rate this Actor on Apify</a>
</td>
</tr>
</table>

### ❓ FAQ

**Do I need to configure anything for this Actor to work reliably?**
No. The board can be finicky about where requests come from, so the Actor ships with the right setup as the default. Just run it.

**Can I filter by category before running the Actor?**
Yes. Pick one or more of the board's 16 categories (Jobs, Funding and Grants, Artist Residencies, Tenders and more) in the input, or leave it empty to scan everything.

**Does the output include when an opportunity was first posted?**
No. The source site itself doesn't expose a raw posting date, only an application deadline and its own coarse recency filters (recently added, last week, last month). This Actor never fabricates a posting date it doesn't have.

**Is this legal?**
This Actor only extracts publicly available information already shown to any visitor of the Opportunities board. Always review the target site's terms of service before using the data commercially.

### 🔗 Other actors

- [S1 Jobs Scraper](https://apify.com/getascraper/s1jobs-scraper) ↗ - Scotland jobs, salaries and employer data.
- [HIJOBS Scraper](https://apify.com/getascraper/hijobs-scraper) ↗ - Jobs across Scotland's Highlands and Islands.
- [Goodmoves Jobs Scraper](https://apify.com/getascraper/goodmoves-jobs-scraper) ↗ - Scottish charity and third-sector vacancies.
- [EURAXESS Jobs Scraper](https://apify.com/getascraper/euraxess-jobs-scraper) ↗ - European research vacancies, including arts and humanities.
- [HigherEdJobs Scraper](https://apify.com/getascraper/higheredjobs-com-scraper) ↗ - Academic job listings with salary and monitoring support.

# Actor input Schema

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

Opportunities board URL(s) to crawl. Leave the default to scan the whole board, or paste a pre-filtered board search URL.

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

Only fetch opportunities in these categories. Leave empty for all categories.

## `filter` (type: `string`):

Match the board's own recency/sort buckets, since opportunities have no raw posting date.

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

Optional free-text search term, matched against opportunity titles and descriptions.

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

UK residential proxy is required: the site hard-blocks any request without a UK residential exit IP, confirmed live.

## `enrichDetail` (type: `boolean`):

Fetch each opportunity's detail page for the full description, contact email, and apply link. Costs one extra page fetch per item.

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

Stop after this many opportunities. Set to 0 for no limit.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://opportunities.creativescotland.com/"
    }
  ],
  "categories": [],
  "filter": "",
  "keywords": "",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  },
  "enrichDetail": true,
  "maxItems": 50
}
```

# Actor output Schema

## `opportunities` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://opportunities.creativescotland.com/"
        }
    ],
    "categories": [],
    "filter": "",
    "keywords": "",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "GB"
    },
    "enrichDetail": true,
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/creativescotland-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": [{ "url": "https://opportunities.creativescotland.com/" }],
    "categories": [],
    "filter": "",
    "keywords": "",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "GB",
    },
    "enrichDetail": True,
    "maxItems": 50,
}

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

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://opportunities.creativescotland.com/"
    }
  ],
  "categories": [],
  "filter": "",
  "keywords": "",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "GB"
  },
  "enrichDetail": true,
  "maxItems": 50
}' |
apify call getascraper/creativescotland-scraper --silent --output-dataset

```

## MCP server setup

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

```

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

## OpenAPI specification

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