# York CVS Jobs Scraper (`memo23/yorkcvs-scraper`) Actor

Scrape yorkcvs.livevacancies.co.uk — Vue SPA hosted by hireful, but NO browser needed. Actor reverse-engineered the public JSON API. Each row: title, salary, location, full description HTML, ISO closing date, region, contract type, hours. JSON or CSV out.

- **URL**: https://apify.com/memo23/yorkcvs-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Jobs, Agents, AI
- **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

## York CVS Jobs Scraper

**Scrape the York CVS jobs board at yorkcvs.livevacancies.co.uk — even though it's a Vue SPA.** No browser automation needed. The actor reverse-engineered the hireful SaaS bundle and hits the public JSON API directly with a single HTTP call. Each row carries title, salary, location, full description HTML, ISO closing date, region, contract type, hours, employer brand info, and PDF attachments. JSON or CSV out, no compute charge per run, just per result.

#### How it works

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

#### ✨ Why use this scraper?

York CVS hosts its job board through **hireful** — a SaaS Applicant Tracking System with a Vue SPA front-end. Tracking who's hiring at York-area charities? Building a North Yorkshire voluntary-sector dashboard? Want a structured feed without firing up a headless browser?

- 🚀 **No browser, no Playwright.** We reverse-engineered hireful's SPA bundle and found the public JSON API: `https://api.core-easywebats.com/v1/job/all`. The only auth is the `Origin` header — the API maps Origin → company internally.
- ⚡ **One HTTP call, full payload.** The list endpoint returns EVERY job with EVERY field (title, salary, location, full description HTML, ISO closing date, region, contract type, hours, employer brand info, PDF attachments) — no per-job detail fetch needed.
- 🎯 **Two starting points.** The hireful API URL directly, or any `yorkcvs.livevacancies.co.uk` SPA URL (auto-redirected to the API).
- 🆔 **Stable identifiers.** Both `job_number` (sequential) and `id` (UUID) preserved per row.
- 🇬🇧 **York / North Yorkshire focus.** Social prescribers, support workers, project coordinators — charity-sector roles at York-area orgs.
- 📤 **Clean exports.** One row per vacancy with all fields inline. JSON + CSV exported automatically.

#### 🎯 Use cases

| Team | What they build |
|------|-----------------|
| **York-area CVS network** | Cross-borough nonprofit hiring intelligence |
| **Social-care recruiters** | Daily new-vacancy feeds for York charity sector |
| **Researchers** | York labour-market datasets across charity / public-sector roles |
| **Workforce strategy** | Salary intelligence with structured `{currency, min, max}` |
| **ATS / aggregator builders** | hireful-API integration reference (any livevacancies.co.uk tenant works with the same pattern, just swap the Origin header) |

#### 📥 Supported inputs

| URL pattern | Behaviour |
|---|---|
| `https://api.core-easywebats.com/v1/job/all` | **Direct API call** (default) |
| `https://yorkcvs.livevacancies.co.uk/` | **SPA root** — auto-routes to the API call |
| `https://yorkcvs.livevacancies.co.uk/#/jobs/<number>` | **SPA detail URL** — also routes to the full list (and the row matching `<number>` is included) |

Leave `startUrls` empty for the default.

**Not supported:** other hireful tenants (the actor is wired to York CVS's Origin specifically — drop us an email if you want a different tenant).

#### 🔄 How it works

1. **Send GET** to `https://api.core-easywebats.com/v1/job/all` with:
   - `Origin: https://yorkcvs.livevacancies.co.uk`
   - `Referer: https://yorkcvs.livevacancies.co.uk/`
2. **Parse the JSON array** — every job is a complete record (no pagination, no detail fetch).
3. **For each item**, normalise into our standard `JobRecord` shape:
   - Concat `description[].description` blocks → single HTML body
   - Parse `salary` string → `{currency, min, max, raw}`
   - Extract apply email/URL from description body via regex
4. **Push one row per job** to the dataset.

#### ⚙️ Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `startUrls` | array | `["https://api.core-easywebats.com/v1/job/all"]` | Hireful API URL or any `yorkcvs.livevacancies.co.uk` URL. Empty = default. |
| `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. |
| `maxConcurrency` / `minConcurrency` | integer | `5` / `1` | Reserved — single-call design. |
| `maxRequestRetries` | integer | `5` | Retries before the API call is given up. |
| `proxy` | object | No proxy | API has no anti-bot — proxy optional. |

#### 📊 Output overview

Each scraped vacancy is one **single dataset row** of `type: "job"`. No detail-page enrichment needed — the hireful list endpoint is the data source AND the detail source.

#### 📦 Output sample

```json
{
  "type": "job",
  "source": "yorkcvs.livevacancies.co.uk",
  "sourceProvider": "hireful",
  "jobId": "22",
  "jobUuid": "160de6e5-b0f9-4b21-bfbb-9c5df157283f",
  "slug": "22",
  "jobUrl": "https://yorkcvs.livevacancies.co.uk/#/jobs/22",
  "apiUrl": "https://api.core-easywebats.com/v1/job/22",
  "title": "Social Prescriber – Respiratory - COPD",
  "description": "<p><strong>Job Role: Social Prescriber</strong></p><p>…</p>",
  "descriptionText": "Job Role: Social Prescriber\nProject: Respiratory - COPD\n…",
  "companyId": "83252488-8c92-49cc-95ea-ecc0ebf13fbc",
  "companyName": null,
  "location": "York",
  "city": "York",
  "county": null,
  "country": "United Kingdom",
  "region": "Yorkshire and the Humber",
  "internalRegion": null,
  "salary": {
    "currency": "GBP",
    "min": 29768,
    "max": 29768,
    "raw": "£29,768"
  },
  "salaryRaw": "£29,768",
  "contractType": null,
  "hours": "37",
  "department": null,
  "positions": "1",
  "categories": [],
  "employmentTypes": [],
  "status": "publish",
  "postedDate": "2026-04-12T09:00:00.000Z",
  "closingDate": "2026-06-02T17:00:00.000Z",
  "modifiedDate": "2026-05-15T14:22:00.000Z",
  "applyType": "email",
  "applyUrl": "https://yorkcvs.livevacancies.co.uk/#/jobs/22",
  "applyEmail": "socialprescribing@yorkcvs.org.uk",
  "externalApplyUrl": null,
  "customApplyUrl": null,
  "brandInfo": { },
  "jobFiles": [],
  "customFields": { "string": {}, "integer": {} },
  "scrapedAt": "2026-05-22T19:42:00.000Z"
}
````

#### 🗂 Key output fields

| Group | Fields |
|---|---|
| **Identifiers** | `type`, `source`, `sourceProvider` (`hireful`), `jobId` (numeric ref), `jobUuid` (hireful UUID), `slug`, `jobUrl`, `apiUrl`, `scrapedAt` |
| **Content** | `title`, `description` (HTML), `descriptionText` (plain) |
| **Dates** | `postedDate` (ISO), `closingDate` (ISO), `modifiedDate` (ISO) |
| **Employer** | `companyId`, `companyName`, `brandInfo` (raw block), `companyLogoUrl` (when in jobFiles) |
| **Location** | `location`, `addressLine1`, `addressLine2`, `city`, `county`, `country`, `region`, `internalRegion` |
| **Compensation** | `salary.{currency, min, max, raw}`, `salaryRaw`, `hours` |
| **Work pattern** | `contractType`, `hours`, `positions`, `department` |
| **Apply flow** | `applyType`, `applyUrl` (SPA URL), `applyEmail`, `externalApplyUrl`, `customApplyUrl` |
| **hireful-specific** | `jobFiles[]` (PDF attachments), `customFields.{string,integer}` (recruiter-defined fields) |

#### ❓ FAQ

**Wait — no browser? How?**
The hireful SaaS bundles a Vue SPA that talks to a public JSON API. The bundle's URL-template strings revealed the API base (`api.core-easywebats.com`) and the list path (`v1/job/all`). The API authenticates by the request's `Origin` header — when we send `Origin: https://yorkcvs.livevacancies.co.uk`, it returns York CVS's jobs.

**Why is `companyName` sometimes null?**
hireful doesn't enforce `company_name` in `brand_info` — it's an optional recruiter-side label. The `description` HTML almost always names the employer in the body. Use `companyId` (UUID) as the stable join key.

**Could you scrape other hireful tenants?**
Yes — every `{tenant}.livevacancies.co.uk` site uses the same API + the same Origin-based auth. Drop us an email to wire up a different tenant.

**Can I scrape private pages or applicant data?**
No. The actor only hits the public job-listing endpoint that any visitor's browser would fetch.

**How do I limit results?**
Set `maxItems`. Currently only 1 vacancy is live; the cap mostly matters for tenants with high volumes.

#### 💬 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>
- Build a similar actor for any other `*.livevacancies.co.uk` tenant (one-day turnaround): 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 York CVS, hireful, EasyWebats Ltd, or any of their subsidiaries or affiliates. All trademarks mentioned are the property of their respective owners.

The scraper accesses only the publicly available JSON API endpoint that the hireful SPA itself calls — no authenticated endpoints, recruiter-only features, or content behind a login. Users are responsible for ensuring their use complies with yorkcvs.livevacancies.co.uk's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organisation.

***

### SEO Keywords

york cvs scraper, scrape yorkcvs.livevacancies.co.uk, hireful api scraper, hireful jobs api, livevacancies.co.uk scraper, livevacancies api, easywebats api scraper, york charity jobs scraper, north yorkshire voluntary sector jobs api, Apify york cvs, vue spa scraper without browser, spa scraper without playwright, reverse-engineered job board api, charityjob alternative scraper, communityfirstyorkshire alternative scraper, vassheffield alternative scraper, uk cvs jobs scraper, hireful tenant scraper, ats api scraper, third sector jobs api

# Actor input Schema

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

Supported shapes — WordPress board: `https://yorkcvs.org.uk/jobs/` (full board) or `https://yorkcvs.org.uk/jobs/<slug>/` (single job). Hireful board: `https://yorkcvs.livevacancies.co.uk/jobs/`. Leave empty to scrape the full yorkcvs.org.uk board.

## `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`.

## `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 (default). Note: this board publishes only a creation date and keeps listings open for months, so a short window often returns nothing — leave empty unless you specifically want fresh postings. Rows whose source has no posted date are always kept.

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

Hard cap on rows pushed to the dataset. yorkcvs.livevacancies.co.uk 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`):

yorkcvs.livevacancies.co.uk does not anti-bot — any proxy (or none) works. Defaults to no proxy for speed.

## Actor input object example

```json
{
  "startUrls": [
    "https://yorkcvs.org.uk/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://yorkcvs.org.uk/jobs/"
    ],
    "proxy": {
        "useApifyProxy": false
    }
};

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

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "York CVS Jobs Scraper",
        "description": "Scrape yorkcvs.livevacancies.co.uk — Vue SPA hosted by hireful, but NO browser needed. Actor reverse-engineered the public JSON API. Each row: title, salary, location, full description HTML, ISO closing date, region, contract type, hours. JSON or CSV out.",
        "version": "0.0",
        "x-build-id": "99s9oLAS741zhfFcR"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~yorkcvs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-yorkcvs-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~yorkcvs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-yorkcvs-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~yorkcvs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-yorkcvs-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": "York CVS job URLs",
                        "type": "array",
                        "description": "Supported shapes — WordPress board: `https://yorkcvs.org.uk/jobs/` (full board) or `https://yorkcvs.org.uk/jobs/<slug>/` (single job). Hireful board: `https://yorkcvs.livevacancies.co.uk/jobs/`. Leave empty to scrape the full yorkcvs.org.uk board.",
                        "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
                    },
                    "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 (default). Note: this board publishes only a creation date and keeps listings open for months, so a short window often returns nothing — leave empty unless you specifically want fresh postings. 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 to the dataset. yorkcvs.livevacancies.co.uk 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": "yorkcvs.livevacancies.co.uk 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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
