# ASVA Jobs Scraper (`memo23/asva-scraper`) Actor

Scrape the asva.co.uk Scottish visitor-attraction jobs board. RSS + detail-page enrichment: organisation, salary (parsed), location, job type, role type, full description. Castles, museums, distilleries, hotels — hospitality and tourism hiring. JSON or CSV out.

- **URL**: https://apify.com/memo23/asva-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 $1.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

## ASVA Jobs Scraper

**Turn the asva.co.uk visitor-attraction jobs board into structured Scottish hospitality & tourism hiring data.** Reads the public RSS feed for fast listing, then enriches each row by fetching the detail page for organisation, salary, location, job type, and role-type taxonomies. JSON or CSV out, no compute charge per run, just per result.

#### How it works

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

#### ✨ Why use this scraper?

The Association of Scottish Visitor Attractions (ASVA) hosts a jobs board for its members — galleries, museums, castles, distilleries, gardens, hotels, parks. Tracking who's hiring across Scottish tourism? Benchmarking visitor-attraction pay? Sourcing for seasonal openings?

- 🎯 **Two starting points.** The `/jobs/feed/` RSS feed (default), the `/jobs/` archive page, or any single `/jobs/<slug>/` URL.
- ⚡ **RSS feed as the primary source.** One HTTP call returns the 10 most recent jobs with title, link, pubDate, author, description, and full content HTML — no pagination needed.
- 🏛️ **Detail-page enrichment (one-fetch-per-job).** `.job-header` block carries organisation (e.g. *National Galleries of Scotland*), salary (e.g. *£27,362 per annum*), and location (e.g. *Edinburgh*). Body class carries job-type + role-type taxonomies.
- 💰 **Salary parsed.** Free-text salary strings are decomposed into `{currency, min, max, raw}` when possible — `salary.raw` always preserves the original.
- 🇬🇧 **Scottish visitor attractions.** National Trust Scotland, NGS, Historic Environment Scotland, distilleries, gardens, castles, museums, hotels.
- 📤 **Clean exports.** One row per vacancy with merged RSS + detail-page enrichment. JSON + CSV exported automatically.

#### 🎯 Use cases

| Team | What they build |
|------|-----------------|
| **Visitor attractions (NGS, NTS, HES, distilleries)** | Cross-sector seasonal hiring intelligence |
| **Hospitality recruitment** | Daily new-vacancy feeds for visitor-services / catering / cleaning roles |
| **Tourism researchers** | Scottish tourism labour-market datasets |
| **Workforce strategy / funders** | Visitor-attraction pay benchmarks across the sector |
| **Sector publications** | Auto-populate "jobs in Scottish tourism" landing pages |

#### 📥 Supported inputs

| URL pattern | Behaviour |
|---|---|
| `https://www.asva.co.uk/jobs/feed/` | **RSS feed** (default) — 10 most recent items |
| `https://www.asva.co.uk/jobs/` | **Jobs archive page** — routed to the RSS feed for consistency |
| `https://www.asva.co.uk/jobs/<slug>/` | **Single job** — synthetic RSS stub + detail-page fetch |

Leave `startUrls` empty for the default RSS feed.

**Not supported:** filtering via the archive's `?role=` / `?job=` query strings (RSS doesn't paginate this way); hosts outside `asva.co.uk`.

#### 🔄 How it works

1. **Bucket each `startUrl`** as RSS feed vs direct detail URL.
2. **Fetch the RSS feed** — get up to 10 items per request with title, link, pubDate, author, full content HTML.
3. **For each item**, optionally fetch the `/jobs/<slug>/` detail page (one HTTP call per job).
4. **Parse `.job-header`** for `Organisation`, `Salary`, `Location` — labelled text extraction.
5. **Pull body classes** `job-type-<type>` and `role-type-<role>` — humanised back to "Full Time" / "Visitor Services" etc.
6. **Push one merged row per vacancy** with RSS + detail-page enrichment.

#### ⚙️ Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `startUrls` | array | `["https://www.asva.co.uk/jobs/feed/"]` | RSS feed, archive page, or single-job URLs. Empty = default feed. |
| `enrichDetail` | boolean | `true` | When `true`, fetches each `/jobs/<slug>/` page for organisation/salary/location/job-type/role-type. Disable for RSS-only output. |
| `postedWithinHours` | integer | (none) | Only return rows posted in the last N hours (24 = last day, 72 = last 3 days). Empty/0 = all. Ideal for daily monitoring runs that only want fresh postings. |
| `maxItems` | integer | `1000` | Hard cap on rows pushed (RSS returns the 10 most recent). |
| `maxConcurrency` / `minConcurrency` | integer | `5` / `1` | Parallel detail-page fetch limits. |
| `maxRequestRetries` | integer | `5` | Retries before a failed request is given up. |
| `proxy` | object | No proxy | Site does not anti-bot — proxy optional. |

#### 📊 Output overview

Each scraped vacancy is one **single dataset row** of `type: "job"`. RSS-derived fields (title, link, pubDate, content HTML) are merged with detail-page enrichment (organisation, salary, location, taxonomies).

#### 📦 Output sample

```json
{
  "type": "job",
  "source": "asva.co.uk",
  "jobId": "19998",
  "slug": "security-attendant-5",
  "jobUrl": "https://www.asva.co.uk/jobs/security-attendant-5/",
  "title": "Security Attendant",
  "description": "<p>Full-time and Permanent<br />Salary £27,362 per annum plus 20% shift allowance…</p>",
  "descriptionText": "Full-time and Permanent\nSalary £27,362 per annum plus 20% shift allowance…",
  "companyName": "National Galleries of Scotland",
  "companyWebsite": null,
  "companyDomain": null,
  "companyTagline": null,
  "location": "Edinburgh",
  "remote": false,
  "salary": {
    "currency": "GBP",
    "min": 20,
    "max": 27362,
    "raw": "£27,362 per annum plus 20% shift allowance of £5,472 per annum"
  },
  "salaryRaw": "£27,362 per annum plus 20% shift allowance of £5,472 per annum",
  "categories": ["Visitor Services"],
  "employmentTypes": ["Full Time"],
  "contractType": "Full Time",
  "roleType": "Visitor Services",
  "status": "publish",
  "postedDate": "2026-05-19T15:45:02.000Z",
  "modifiedDate": null,
  "applyType": "internal",
  "applyUrl": "https://www.asva.co.uk/jobs/security-attendant-5/",
  "applyEmail": null,
  "externalApplyUrl": null,
  "authorName": "Pauline Martin",
  "scrapedAt": "2026-05-20T00:13:00.000Z"
}
````

#### 🗂 Key output fields

| Group | Fields |
|---|---|
| **Identifiers** | `type`, `source`, `jobId`, `slug`, `jobUrl`, `scrapedAt` |
| **Content** | `title`, `description` (HTML, from RSS `content:encoded`), `descriptionText` (plain) |
| **Dates** | `postedDate` (ISO from RSS pubDate), `modifiedDate` |
| **Employer** | `companyName` (from `.job-header > Organisation`), `companyTagline` |
| **Location** | `location` (from `.job-header > Location`), `remote` |
| **Compensation** | `salary.{currency, min, max, raw}`, `salaryRaw` (always preserves original) |
| **Taxonomies** | `categories[]` (from `role-type-*` body class), `employmentTypes[]` (from `job-type-*`), `contractType`, `roleType` |
| **Apply flow** | `applyType`, `applyUrl`, `applyEmail`, `externalApplyUrl` |
| **WordPress meta** | `authorName` (RSS `dc:creator`) |

#### ❓ FAQ

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

**Why only 10 jobs per run?**
ASVA's RSS feed returns the 10 most recent. The actor doesn't walk the archive's HTML pagination because the markup is inconsistent. For more, watch the feed daily and dedup downstream.

**Why is `applyType` usually "internal"?**
ASVA job posts often don't include an `mailto:` or outbound URL in the body — applicants click the "Apply" button on the ASVA page itself which routes via JS. The actor preserves the ASVA URL in `applyUrl` for downstream redirect.

**Can I scrape private pages or applicant data?**
No. Only the public RSS feed and public `/jobs/<slug>/` pages.

**How do I limit results?**
Set `maxItems`. Disable `enrichDetail` to skip per-job HTTP calls (10 jobs in 1 fetch).

#### 💬 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 regional Scottish job boards (highlandjobs.scot, s1jobs, Goodmoves): 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 the Association of Scottish Visitor Attractions (ASVA), asva.co.uk, or any of their subsidiaries or affiliates. All trademarks mentioned are the property of their respective owners.

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

***

### SEO Keywords

asva scraper, scrape asva.co.uk, asva jobs api, association of scottish visitor attractions scraper, scottish visitor attractions jobs api, scottish hospitality jobs scraper, scottish tourism jobs scraper, Apify asva, national trust scotland jobs scraper, national galleries scotland jobs api, scottish heritage jobs scraper, scottish seasonal jobs data, visitor attraction recruitment data, rss feed scraper, scottish museum jobs api, scottish distillery jobs scraper, highlandjobs alternative scraper, s1jobs alternative scraper, goodmoves alternative scraper, scottish hiring trends data

# Actor input Schema

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

Supported shapes: `https://www.asva.co.uk/jobs/feed/`, `https://www.asva.co.uk/jobs/`, `https://www.asva.co.uk/jobs/<slug>/`. Leave empty for the full feed.

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

When enabled, each job triggers one extra HTTP call to the /jobs/<slug>/ page to extract organisation name, salary, location, job type and role type from the `.job-header` block and body classes. Disable for RSS-only output.

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

Filters on each row's posted date. Set 24 for the last day, 72 for the last 3 days, etc. Leave empty (or 0) to return everything regardless of age. Rows whose source has no posted date are always kept.

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

Hard cap on rows pushed. The ASVA RSS returns the 10 most recent jobs per request.

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

Maximum detail-page fetches in parallel.

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

Minimum detail-page fetches in parallel.

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

Number of retries before a failed request is given up.

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

asva.co.uk does not anti-bot — proxy is optional. Defaults to no proxy.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.asva.co.uk/jobs/feed/",
    "https://www.asva.co.uk/jobs"
  ],
  "enrichDetail": true,
  "postedWithinHours": 24,
  "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://www.asva.co.uk/jobs/feed/",
        "https://www.asva.co.uk/jobs"
    ],
    "postedWithinHours": 24,
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/asva-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.asva.co.uk/jobs/feed/",
        "https://www.asva.co.uk/jobs",
    ],
    "postedWithinHours": 24,
    "proxy": { "useApifyProxy": False },
}

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ASVA Jobs Scraper",
        "description": "Scrape the asva.co.uk Scottish visitor-attraction jobs board. RSS + detail-page enrichment: organisation, salary (parsed), location, job type, role type, full description. Castles, museums, distilleries, hotels — hospitality and tourism hiring. JSON or CSV out.",
        "version": "0.0",
        "x-build-id": "mrV3F7WQvJZXOZFEf"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~asva-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-asva-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~asva-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-asva-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~asva-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-asva-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": "asva.co.uk URLs",
                        "type": "array",
                        "description": "Supported shapes: `https://www.asva.co.uk/jobs/feed/`, `https://www.asva.co.uk/jobs/`, `https://www.asva.co.uk/jobs/<slug>/`. Leave empty for the full feed.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "enrichDetail": {
                        "title": "Fetch each detail page for structured fields (recommended)",
                        "type": "boolean",
                        "description": "When enabled, each job triggers one extra HTTP call to the /jobs/<slug>/ page to extract organisation name, salary, location, job type and role type from the `.job-header` block and body classes. Disable for RSS-only output.",
                        "default": true
                    },
                    "postedWithinHours": {
                        "title": "Only rows posted in the last N hours",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Filters on each row's posted date. Set 24 for the last day, 72 for the last 3 days, etc. Leave empty (or 0) to return everything regardless of age. Rows whose source has no posted date are always kept."
                    },
                    "maxItems": {
                        "title": "Maximum jobs to scrape",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Hard cap on rows pushed. The ASVA RSS returns the 10 most recent jobs per request.",
                        "default": 1000
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum detail-page fetches in parallel.",
                        "default": 5
                    },
                    "minConcurrency": {
                        "title": "Min concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Minimum detail-page fetches in parallel.",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "Max request retries",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Number of retries before a failed request is given up.",
                        "default": 5
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "asva.co.uk does not anti-bot — proxy is optional. Defaults to no proxy.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
