# Highland Jobs (.scot) Scraper (`memo23/highlandjobs-scraper`) Actor

crape every Scottish Highlands & Islands vacancy from highlandjobs.scot via the public WP-JSON API. Title, employer, location, salary (parsed), categories, posted date, full description HTML, apply email/URL. 204 jobs in ~3 requests. JSON or CSV out.

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

## Pricing

from $2.00 / 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/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

## Highland Jobs (.scot) Scraper

**Turn highlandjobs.scot into structured Scottish Highlands & Islands vacancy data.** Scrape every job from highlandjobs.scot — title, employer, location, salary band (parsed), category & employment type taxonomies, posted date, full description HTML, featured image, and the actual apply email or external apply URL — pulled straight from the site's public WP-JSON REST API. JSON or CSV out, no compute charge per run, just per result.

#### How it works

![How Highland Jobs Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-highlandjobs.png)

#### ✨ Why use this scraper?

Tracking the Highlands & Islands labour market? Building seasonal hiring dashboards for hospitality / tourism / cleaning? Need a clean dataset of every live vacancy in the Highlands without scrolling pages?

- 🎯 **Three starting points.** Paste the `/jobs/` archive URL, a direct `/job/<slug>/` URL, or the WP-JSON endpoint itself — all classified and translated automatically.
- ⚡ **WP-JSON REST API as the data source.** Each vacancy comes from `/wp-json/wp/v2/job-listings` — every WP Job Manager field arrives in one request. No detail-page HTML re-fetching needed.
- 📦 **All 204 vacancies in ~3 HTTP calls.** Pages of up to 100 items each, with `X-WP-TotalPages` driving parallel page fetches.
- 📧 **Apply email or URL captured.** `_application` meta is detected and split into `applyEmail` / `externalApplyUrl` automatically.
- 🏷️ **Taxonomies inline.** Categories (`Hospitality & Tourism`, `Cleaning & Facilities`, …) and employment types (`Seasonal`, `Full Time`, …) embedded via WP-JSON `_embed` — no extra HTTP cost.
- 🏔️ **Highlands & Islands focus.** Scotland's biggest non-central-belt job board — tourism, hospitality, cleaning, healthcare, retail, public sector, fisheries.
- 📤 **Clean exports.** One row per vacancy with all 34 fields inline. JSON + CSV exported automatically.

#### 🎯 Use cases

| Team | What they build |
|------|-----------------|
| **Hospitality groups** | Daily new-vacancy feeds for hotels, restaurants, holiday lets across the Highlands |
| **Tourism operators** | Salary intelligence for visitor attractions, distilleries, transport providers |
| **Recruitment / agencies** | Niche regional candidate sourcing — Skye, Lewis, Inverness, Caithness, Aberdeenshire |
| **Workforce strategy** | Seasonal hiring trends — when do operators start posting for Easter / summer / autumn |
| **Charities & public sector** | Cross-region benchmarking for nonprofit / council pay bands |
| **Job aggregators** | Real recruiter apply emails + external URLs for redirect-and-track use cases |

#### 📥 Supported inputs

You can pass any combination of these URL shapes in `startUrls`. Each URL is classified automatically.

| URL pattern | Behaviour |
|---|---|
| `https://highlandjobs.scot/jobs/` | **Full listing** — defaults to every vacancy on the site |
| `https://highlandjobs.scot/job/<slug>/` | **Single job** — translates to a slug-filtered WP-JSON query |
| `https://highlandjobs.scot/wp-json/wp/v2/job-listings` | **WP-JSON endpoint** — pass-through (same as the default) |
| `https://highlandjobs.scot/wp-json/wp/v2/job-listings/<id>` | **WP-JSON single record** — translates to `?include=<id>` |

Easiest workflow: leave `startUrls` empty to scrape every live vacancy, or paste a single `/job/<slug>/` URL when you want one record.

**Not supported:**

- Filtering by browser query-string filters (`?role=…`, `?job=…`, etc.) — the WP-JSON endpoint returns everything; filter in your downstream consumer.
- Hosts outside `highlandjobs.scot`.

#### 🔄 How it works

1. **Classify each `startUrl`** and translate it to the canonical `/wp-json/wp/v2/job-listings` shape.
2. **Fetch page 1** — read `X-WP-Total` and `X-WP-TotalPages` from the response headers.
3. **Parallel-fetch pages 2..N** via a sliding window of `maxConcurrency` requests.
4. **Parse each WP Job Manager item** — title, content HTML, meta block (`_job_location`, `_application`, `_company_*`, `_job_salary*`), `_embed` taxonomies (category, type), featured-media URL, author.
5. **Detect apply type** from the `_application` meta — email vs external URL vs internal.
6. **Push one normalised row per vacancy** to the dataset.

#### ⚙️ Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `startUrls` | array | `["https://highlandjobs.scot/jobs/"]` | Browser URLs, single-job URLs, or WP-JSON endpoints. Empty array = scrape everything. |
| `enrichTaxonomies` | boolean | `true` | When `true`, embeds taxonomy term names and featured image via WP-JSON `_embed`. Adds zero extra HTTP calls. |
| `maxItems` | integer | `1000` | Hard cap on rows pushed. Set to 1000+ to scrape every job (~204 live). |
| `maxConcurrency` / `minConcurrency` | integer | `5` / `1` | Parallel WP-JSON page-fetch limits. |
| `maxRequestRetries` | integer | `5` | Retries before a failed WP-JSON request is given up. |
| `proxy` | object | No proxy | Site does not anti-bot — any proxy works, none is the default for speed. |

#### 📊 Output overview

Each scraped vacancy is one **single dataset row** of `type: "job"`. All taxonomies, salary parsing, apply-target detection, featured media, and author info are merged into the same row — the dataset row count equals the job count exactly. No padding rows.

#### 📦 Output sample

```json
{
  "type": "job",
  "source": "highlandjobs.scot",
  "jobId": "15971",
  "slug": "holiday-home-cleaning-and-support-staff",
  "jobUrl": "https://highlandjobs.scot/job/holiday-home-cleaning-and-support-staff/",
  "wpJsonUrl": "https://highlandjobs.scot/wp-json/wp/v2/job-listings/15971",
  "title": "Holiday Home Cleaning and Support Staff",
  "description": "<p data-start=\"191\" data-end=\"506\">AB Holiday Home Services is hiring cleaning and support staff…</p>",
  "descriptionText": "AB Holiday Home Services is hiring cleaning and support staff to work across holiday homes near the Glendale area on the Isle of Skye…",
  "companyName": "AB Holiday Home Services Ltd",
  "companyTagline": null,
  "companyWebsite": null,
  "companyDomain": null,
  "companyTwitter": null,
  "companyVideo": null,
  "location": "Isle of Skye",
  "remote": false,
  "salary": {
    "currency": "GBP",
    "min": 15,
    "max": 15,
    "unit": "HOUR",
    "raw": "£15.00"
  },
  "categories": ["Cleaning & Facilities", "Cleaning and Housekeeping", "Hospitality & Tourism", "Hospitality & Venues"],
  "employmentTypes": ["Seasonal"],
  "contractType": "Seasonal",
  "featured": false,
  "filled": false,
  "status": "publish",
  "postedDate": "2026-05-19T20:24:43Z",
  "modifiedDate": "2026-05-19T20:24:47Z",
  "applyType": "email",
  "applyUrl": "https://highlandjobs.scot/job/holiday-home-cleaning-and-support-staff/",
  "applyEmail": "abhhsltd@outlook.com",
  "externalApplyUrl": null,
  "featuredImageUrl": "https://highlandjobs.scot/wp-content/uploads/2026/04/AB-Holiday-Homes.jpg",
  "authorId": 20,
  "authorName": null,
  "scrapedAt": "2026-05-20T00:13:00.000Z"
}
````

#### 🗂 Key output fields

| Group | Fields |
|---|---|
| **Identifiers** | `type`, `source`, `jobId`, `slug`, `jobUrl`, `wpJsonUrl`, `scrapedAt` |
| **Role** | `title`, `description` (HTML), `descriptionText` (plain) |
| **Dates** | `postedDate` (ISO), `modifiedDate` (ISO) |
| **Employer** | `companyName`, `companyWebsite`, `companyDomain`, `companyTagline`, `companyTwitter`, `companyVideo`, `featuredImageUrl` |
| **Location** | `location`, `remote` |
| **Compensation** | `salary.{currency, min, max, unit, raw}` |
| **Taxonomies** | `categories[]`, `employmentTypes[]`, `contractType` |
| **Flags** | `featured`, `filled`, `status` |
| **Apply flow** | `applyType` (`email` / `external` / `internal` / `unknown`), `applyUrl` (the highlandjobs.scot page), `applyEmail`, `externalApplyUrl` |
| **WordPress meta** | `authorId`, `authorName` |

#### ❓ FAQ

**Why no detail-page fetch?**
WP Job Manager exposes every meaningful field via the WP-JSON list endpoint — including the full content HTML, meta block, and embedded taxonomies. Per-vacancy detail pages are redundant.

**Why are some salary `min`/`max` values weird (e.g. picks up `20%` from "20% allowance")?**
The salary parser extracts ALL numbers from the raw string. For "£27,362 per annum plus 20% shift allowance" you may see `min: 20, max: 27362`. The original `salary.raw` is always correct — use it when the structured parse looks off.

**Can I get categorisation in different languages?**
No. Category and type term names come from the site's own taxonomy and are HTML-entity decoded but otherwise unchanged.

**Can I scrape private pages or applicant data?**
No. The scraper accesses only the publicly available WP-JSON REST API and renders the same data anyone can fetch with `curl https://highlandjobs.scot/wp-json/wp/v2/job-listings`.

**How do I limit results?**
Set `maxItems`. The actor stops walking pages as soon as the cap is reached.

#### 💬 Support

- For issues or feature requests, please use the **Issues** tab on the actor's Apify Console page.
- Author's website: <https://muhamed-didovic.github.io/>
- Email: <muhamed.didovic@gmail.com>

#### 🛠 Additional services

- Custom output shape, additional fields, or one-off datasets: <muhamed.didovic@gmail.com>
- Need a similar scraper for other UK regional job boards (s1jobs, VAS Sheffield, Doing Good Leeds, ASVA, Snicket, VA Rotherham, Barnsley CVS, etc.)? Drop an email.
- For API access (no Apify fee, just a usage fee for the API): <muhamed.didovic@gmail.com>

#### 🔎 Explore more scrapers

If this Highland Jobs Scraper was useful, see other scrapers and actors at [memo23's Apify profile](https://apify.com/memo23) — covering job boards, real estate, social media, and more.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Highland Jobs (highlandjobs.scot), The Highland Times, or any of their subsidiaries or affiliates. All trademarks mentioned are the property of their respective owners.

The scraper accesses only the publicly available WP-JSON REST endpoint and public job pages on highlandjobs.scot — no authenticated endpoints, recruiter-only features, or content behind a login. Users are responsible for ensuring their use complies with highlandjobs.scot's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organisation.

***

### SEO Keywords

highland jobs scraper, scrape highlandjobs.scot, highland jobs api, highlandjobs.scot scraper, Apify highland jobs, scottish highlands jobs scraper, isle of skye jobs scraper, inverness jobs scraper, lewis jobs scraper, scottish tourism jobs scraper, scottish hospitality jobs api, highlands and islands recruitment data, scottish seasonal jobs data, wp-json scraper, wp job manager scraper, scottish charity jobs scraper, s1jobs alternative scraper, goodmoves alternative scraper, charityjob alternative scraper, totaljobs alternative scraper, scottish hiring trends data

# Actor input Schema

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

Supported shapes: `https://highlandjobs.scot/jobs/`, `https://highlandjobs.scot/job/<slug>/`, `https://highlandjobs.scot/wp-json/wp/v2/job-listings`, or `.../job-listings/<id>`. Leave empty to scrape every job on the site.

## `enrichTaxonomies` (type: `boolean`):

When enabled (recommended), each job row carries decoded taxonomy term names (e.g. `Hospitality & Tourism`, `Seasonal`) plus the featured image URL. No extra HTTP requests are needed — uses WP-JSON `_embed`.

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

Hard cap on rows pushed to the dataset. highlandjobs.scot currently has ~200 live jobs — set to 1000+ to scrape everything.

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

Maximum WP-JSON pages fetched in parallel. The endpoint is fast and unrestricted — defaults to 5.

## `minConcurrency` (type: `integer`):

Minimum WP-JSON pages fetched in parallel.

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

Number of retries before a failed WP-JSON request is given up.

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

highlandjobs.scot does not anti-bot — any proxy (or none) works. Defaults to no proxy for speed.

## Actor input object example

```json
{
  "startUrls": [
    "https://highlandjobs.scot/jobs/"
  ],
  "enrichTaxonomies": true,
  "maxItems": 1000,
  "maxConcurrency": 5,
  "minConcurrency": 1,
  "maxRequestRetries": 5,
  "proxy": {
    "useApifyProxy": 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://highlandjobs.scot/jobs/"
    ],
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/highlandjobs-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://highlandjobs.scot/jobs/"],
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/highlandjobs-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://highlandjobs.scot/jobs/"
  ],
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call memo23/highlandjobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Highland Jobs (.scot) Scraper",
        "description": "crape every Scottish Highlands & Islands vacancy from highlandjobs.scot via the public WP-JSON API. Title, employer, location, salary (parsed), categories, posted date, full description HTML, apply email/URL. 204 jobs in ~3 requests. JSON or CSV out.",
        "version": "0.0",
        "x-build-id": "LWtdErvJnCGZYxgl5"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~highlandjobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-highlandjobs-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~highlandjobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-highlandjobs-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~highlandjobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-highlandjobs-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",
                "properties": {
                    "startUrls": {
                        "title": "highlandjobs.scot URLs",
                        "type": "array",
                        "description": "Supported shapes: `https://highlandjobs.scot/jobs/`, `https://highlandjobs.scot/job/<slug>/`, `https://highlandjobs.scot/wp-json/wp/v2/job-listings`, or `.../job-listings/<id>`. Leave empty to scrape every job on the site.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "enrichTaxonomies": {
                        "title": "Embed taxonomies (categories, types, featured media)",
                        "type": "boolean",
                        "description": "When enabled (recommended), each job row carries decoded taxonomy term names (e.g. `Hospitality & Tourism`, `Seasonal`) plus the featured image URL. No extra HTTP requests are needed — uses WP-JSON `_embed`.",
                        "default": true
                    },
                    "maxItems": {
                        "title": "Maximum jobs to scrape",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Hard cap on rows pushed to the dataset. highlandjobs.scot currently has ~200 live jobs — set to 1000+ to scrape everything.",
                        "default": 1000
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum WP-JSON pages fetched in parallel. The endpoint is fast and unrestricted — defaults to 5.",
                        "default": 5
                    },
                    "minConcurrency": {
                        "title": "Min concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Minimum WP-JSON pages fetched in parallel.",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "Max request retries",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Number of retries before a failed WP-JSON request is given up.",
                        "default": 5
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "highlandjobs.scot does not anti-bot — any proxy (or none) works. Defaults to no proxy for speed.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
