# Highland TSI Vacancies Scraper — Charity & Third Sector Jobs (`memo23/highlandtsi-scraper`) Actor

Scrape every Third Sector vacancy from highlandtsi.org.uk in a single run. Get job title, charity, location, salary, hours, contract type, deadline, contact email, external apply URL and full description as clean JSON. Pure HTTP — no browser or proxy needed, optional recency filter.

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

## Pricing

from $1.99 / 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 Third Sector (TSI) Vacancies Scraper

**Scrape the highlandtsi.org.uk/vacancies board — Highland Third Sector Interface's charity-jobs aggregator.** One HTTP request returns the complete Wix CMS vacancy collection inline: title, organisation, location, salary (parsed), hours, working pattern, deadline (text + sortable ISO), external apply URL, contact email, attachment URL, and full description HTML. Optional last-N-hours recency filter for daily monitoring. JSON or CSV out, no compute charge per run, just per result.

#### How it works

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

#### ✨ Why use this scraper?

Highland TSI re-lists vacancies from charities across the Highlands — Carr Gomm, CHSS, Fèis Rois, Befrienders Highland, Citizens Advice, community trusts. Tracking the Highland third-sector job market? Running a daily "what's new" digest? Building a regional charity-jobs feed?

- 🎯 **One fetch, every field.** The /vacancies page is a Wix site that embeds its entire `VacancySubmission` CMS collection in the page's warmup data. We parse that JSON directly — no per-card HTML scraping, no pagination.
- 🏷️ **Rich structured data per vacancy.** Title, organisation, location, salary (parsed to `{currency, min, max}`), hours, working pattern, role length, deadline (both the original text and a sortable ISO date), full description HTML.
- 🔗 **Aggregator-aware.** Each vacancy is posted by an external Highland charity — we capture the org's own `externalApplyUrl` (their application page), the contact email, the contact name, and any free-text apply instructions.
- 🕒 **24-hour recency filter.** `postedWithinHours` filters to only vacancies published in the last N hours — ideal for a daily run that should only surface fresh postings.
- 🏔️ **Highland-wide charity sector.** Inverness, Skye, Dingwall, Golspie, Grampian — community trusts, care providers, counselling services, arts orgs.
- 📤 **Clean exports.** One row per vacancy. JSON + CSV exported automatically.

#### 🎯 Use cases

| Team | What they build |
|------|-----------------|
| **Highland charity recruiters** | Daily new-vacancy digests across the region's third sector |
| **TSI / CVS networks** | Cross-region voluntary-sector hiring intelligence |
| **Job aggregators** | Real external apply URLs (each org's own page) for redirect-and-track |
| **Researchers** | Highland charity labour-market datasets with salary + deadline |
| **Workforce strategy** | Pay benchmarks across small Highland charities |

#### 📥 Supported inputs

| URL pattern | Behaviour |
|---|---|
| `https://www.highlandtsi.org.uk/vacancies` | **Full vacancy board** (default) |
| `https://www.highlandtsi.org.uk/board-opportunities` | Board / trustee opportunities (same Wix collection shape) |
| `https://www.highlandtsi.org.uk/volunteering-opportunities` | Volunteering opportunities (same shape) |

Leave `startUrls` empty for the default /vacancies board.

**Not supported:** per-vacancy detail pages (HTSI has none — each vacancy's detail lives on the posting org's own site, captured as `externalApplyUrl`); hosts outside `highlandtsi.org.uk`.

#### 🔄 How it works

1. **Fetch `/vacancies`** — the Wix-rendered page (~1.4 MB).
2. **Extract the warmup-data JSON** — `appsWarmupData.dataBinding.dataStore.recordsByCollectionId.VacancySubmission`.
3. **For each record**, normalise into our standard row:
   - Parse `salary` string → `{currency, min, max, raw}`
   - Resolve the apply target — prefer a clean `websiteLink`/`howToApply` URL; fall back to the `yourEmail` contact; preserve free-text instructions in `applyInstructions`
   - Convert Wix media URIs (`wix:image://`, `wix:document://`) → https URLs for `logoUrl` / `attachmentUrl`
   - Map `_publishDate` → `postedDate`, `deadlineSort` → `closingDate` (ISO), keep the original `deadlineToApply` text in `closingDateText`
4. **Apply the recency filter** (if `postedWithinHours` set) on `_publishDate`.
5. **Push one row per vacancy**, sorted newest-first.

#### ⚙️ Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `startUrls` | array | `["https://www.highlandtsi.org.uk/vacancies"]` | Any HTSI URL — all resolve to the /vacancies collection. |
| `postedWithinHours` | integer | (none) | Only return vacancies published in the last N hours. 24 = last day, 72 = last 3 days. Empty/0 = all. |
| `maxItems` | integer | `1000` | Hard cap on rows pushed (~13 live vacancies). |
| `maxConcurrency` | integer | `1` | Reserved — single-page design. |
| `maxRequestRetries` | integer | `5` | Retries before the fetch is given up. |
| `proxy` | object | No proxy | Wix CDN does not anti-bot — proxy optional. |

#### 📊 Output overview

Each scraped vacancy is one **single dataset row** of `type: "job"`. The `aggregator: true` flag marks that HTSI re-lists these from external orgs; `externalApplyUrl` points at the posting charity's own application page.

#### 📦 Output sample

```json
{
  "type": "job",
  "source": "highlandtsi.org.uk",
  "sourceProvider": "wix-cms",
  "aggregator": true,
  "jobId": "98d3d6e8-be0a-4ff9-ab22-2119c5c5a1cb",
  "slug": "98d3d6e8-be0a-4ff9-ab22-2119c5c5a1cb",
  "jobUrl": "https://www.highlandtsi.org.uk/vacancies",
  "title": "Executive Director",
  "description": "<h2><span style=\"font-weight:bold\">Befrienders Highland is recruiting…</span></h2>",
  "descriptionText": "Befrienders Highland is recruiting an Executive Director\n21 hours a week (1 year)…",
  "companyName": "Befrienders Highland",
  "companyWebsite": "https://www.befriendershighland.org.uk/",
  "companyDomain": "befriendershighland.org.uk",
  "contactName": "Lindsey Standring",
  "logoUrl": "https://static.wixstatic.com/media/349cf4_8d9837888af14ea8adc92892438a967d~mv2.png",
  "attachmentUrl": "https://static.wixstatic.com/media/349cf4_42fad55f65504afbadfeb7050f1b5f88.pdf",
  "location": "Inverness / Hybrid working",
  "remote": true,
  "salary": { "currency": "GBP", "min": 44970, "max": 44970, "raw": "£44,970 pro rata" },
  "salaryRaw": "£44,970 pro rata",
  "hours": "21",
  "workingPattern": "Part time",
  "contractType": "1 year contract with option for renewal",
  "employmentTypes": ["Part time", "1 year contract with option for renewal"],
  "status": "publish",
  "postedDate": "2026-06-05T07:39:08.794Z",
  "closingDate": "2026-06-21T23:00:00.000Z",
  "closingDateText": "5pm on Monday 22nd June",
  "modifiedDate": "2026-06-05T07:39:16.875Z",
  "applyType": "external",
  "applyUrl": "https://www.befriendershighland.org.uk/",
  "applyEmail": "admin@befriendershighland.org.uk",
  "externalApplyUrl": "https://www.befriendershighland.org.uk/",
  "applyInstructions": null,
  "scrapedAt": "2026-06-05T08:20:12.991Z"
}
````

#### 🗂 Key output fields

| Group | Fields |
|---|---|
| **Identifiers** | `type`, `source`, `sourceProvider` (`wix-cms`), `aggregator` (true), `jobId` (Wix `_id`), `slug`, `jobUrl`, `scrapedAt` |
| **Content** | `title`, `description` (HTML), `descriptionText` (plain) |
| **Dates** | `postedDate` (ISO from `_publishDate`), `closingDate` (ISO from `deadlineSort`), `closingDateText` (original wording), `modifiedDate` (ISO) |
| **Organisation** | `companyName`, `companyWebsite`, `companyDomain`, `contactName`, `logoUrl`, `attachmentUrl` (job-spec PDF when attached) |
| **Location** | `location`, `remote` (true when location mentions home/hybrid/remote) |
| **Compensation** | `salary.{currency, min, max, raw}`, `salaryRaw`, `hours` |
| **Work pattern** | `workingPattern` (Full/Part time), `contractType` (`roleLength`), `employmentTypes[]` |
| **Apply flow** | `applyType`, `applyUrl`, `externalApplyUrl` (posting org's own page), `applyEmail`, `applyInstructions` (free-text when no clean URL) |

#### ❓ FAQ

**Why is `jobUrl` always /vacancies?**
Highland TSI doesn't host per-vacancy detail pages — it's an aggregator. The real "detail page" is the posting charity's own application page, which we capture in `externalApplyUrl`.

**Why does `closingDate` differ from `closingDateText`?**
`closingDate` is the machine-sortable ISO date from Wix's `deadlineSort` field. `closingDateText` is exactly how the charity wrote it (e.g. "5pm on Monday 22nd June") — useful for display, since some say "Ongoing" or include a time.

**How fresh is the data?**
The vacancy collection is embedded in the page's first paint, so it's as fresh as the live site. Combine with `postedWithinHours: 24` for a daily run that only surfaces new postings.

**Can I scrape board/trustee or volunteering opportunities too?**
Yes — point `startUrls` at `/board-opportunities` or `/volunteering-opportunities`. They use the same Wix collection shape.

**Can I scrape private pages or applicant data?**
No. Only the public /vacancies board that any visitor's browser renders.

#### 💬 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>
- Similar scrapers for other Scottish job boards (highlandjobs.scot, s1jobs, Goodmoves, ASVA): drop an email.
- For API access (no Apify fee, just usage): <muhamed.didovic@gmail.com>

#### 🔎 Explore more scrapers

See other scrapers 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 Third Sector Interface (HTSI), highlandtsi.org.uk, Wix.com, or any of their subsidiaries or affiliates. All trademarks mentioned are the property of their respective owners.

The scraper accesses only the publicly available /vacancies board on highlandtsi.org.uk — no authenticated endpoints, recruiter-only features, or content behind a login. Users are responsible for ensuring their use complies with highlandtsi.org.uk's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organisation.

***

### SEO Keywords

highland tsi scraper, scrape highlandtsi.org.uk, highland third sector vacancies api, highland charity jobs scraper, scottish highlands charity jobs api, inverness charity jobs scraper, highland voluntary sector jobs, Apify highland tsi, wix cms scraper, wix collection scraper, highland third sector interface jobs, skye charity jobs scraper, dingwall charity jobs api, scottish charity recruitment data, highlandjobs alternative scraper, goodmoves alternative scraper, s1jobs alternative scraper, scottish third sector hiring data, highland community jobs scraper, charity vacancies aggregator scraper

# Actor input Schema

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

Supported: `https://www.highlandtsi.org.uk/vacancies` (also board-opportunities, volunteering-opportunities). Leave empty for /vacancies.

## `postedWithinHours` (type: `integer`):

Client-side filter on the Wix `_publishDate` (when the listing was added — NOT shown on the site). The /vacancies page displays ALL currently-open vacancies regardless of age, so 0 (the default) returns everything you see on the page. Set 168 for the last week, 72 for 3 days, 24 for the last day. Note: this is a low-volume board, so narrow windows often drop most (or all) live jobs.

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

Hard cap on rows pushed. Highland TSI typically lists ~13 live vacancies.

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

Reserved — Highland TSI fetches a single page.

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

Reserved.

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

Retries before the listing fetch is given up.

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

Wix CDN does not anti-bot — proxy is optional.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.highlandtsi.org.uk/vacancies"
  ],
  "maxItems": 1000,
  "maxConcurrency": 1,
  "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://www.highlandtsi.org.uk/vacancies"
    ],
    "postedWithinHours": 0,
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/highlandtsi-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": ["https://www.highlandtsi.org.uk/vacancies"],
    "postedWithinHours": 0,
    "proxy": { "useApifyProxy": False },
}

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

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    "https://www.highlandtsi.org.uk/vacancies"
  ],
  "postedWithinHours": 0,
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call memo23/highlandtsi-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Highland TSI Vacancies Scraper — Charity & Third Sector Jobs",
        "description": "Scrape every Third Sector vacancy from highlandtsi.org.uk in a single run. Get job title, charity, location, salary, hours, contract type, deadline, contact email, external apply URL and full description as clean JSON. Pure HTTP — no browser or proxy needed, optional recency filter.",
        "version": "0.0",
        "x-build-id": "1kQuAlJUXEme3xKjm"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~highlandtsi-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-highlandtsi-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~highlandtsi-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-highlandtsi-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~highlandtsi-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-highlandtsi-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": "highlandtsi.org.uk URLs",
                        "type": "array",
                        "description": "Supported: `https://www.highlandtsi.org.uk/vacancies` (also board-opportunities, volunteering-opportunities). Leave empty for /vacancies.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "postedWithinHours": {
                        "title": "Only vacancies posted in the last N hours (optional)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Client-side filter on the Wix `_publishDate` (when the listing was added — NOT shown on the site). The /vacancies page displays ALL currently-open vacancies regardless of age, so 0 (the default) returns everything you see on the page. Set 168 for the last week, 72 for 3 days, 24 for the last day. Note: this is a low-volume board, so narrow windows often drop most (or all) live jobs."
                    },
                    "maxItems": {
                        "title": "Maximum vacancies to scrape",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Hard cap on rows pushed. Highland TSI typically lists ~13 live vacancies.",
                        "default": 1000
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Reserved — Highland TSI fetches a single page.",
                        "default": 1
                    },
                    "minConcurrency": {
                        "title": "Min concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Reserved.",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "Max request retries",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Retries before the listing fetch is given up.",
                        "default": 5
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Wix CDN does not anti-bot — proxy is optional.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
