# Website Release QA: SEO, Links & Screenshots (`sassy_labs/website-release-qa`) Actor

Check 1–10 public pages before launch. Render in Chromium, capture screenshots, test redirects and internal links, and verify SEO, indexability, image-alt, landmark, and form-label rules with deterministic pass, fail, or unknown evidence.

- **URL**: https://apify.com/sassy\_labs/website-release-qa.md
- **Developed by:** [Sassy Labs](https://apify.com/sassy_labs) (community)
- **Categories:** SEO tools, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $50.00 / 1,000 page auditeds

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

## Website Release QA

**Website Release QA** is a deterministic, browser-rendered website audit tool
for pre-launch checks, releases, campaigns, migrations, and client handoffs.
Add 1–10 public URLs and get screenshots plus explicit `pass`, `fail`, or
`unknown` evidence for delivery, redirects, internal links, SEO metadata,
indexability, image alt coverage, page landmarks, and form labels.

Use it before a production release, landing-page campaign, domain migration,
or client handoff when you need a repeatable release receipt rather than a
generic score. The Actor never logs in or submits forms, does not intentionally
perform write actions, and does not ask a language model to interpret the
result. Browser routing blocks non-read-only HTTP methods; the Actor issues GET
navigations and bounded HEAD/GET link probes, so target sites must treat those
methods as read-only.

Current package release: **0.2.0**. The Apify Actor definition uses the
corresponding major/minor version **0.2**.

Live Store listing:
https://apify.com/sassy_labs/website-release-qa

### Checks

For each page, release 0.2.0 checks:

- final HTTP status and redirect count;
- document title and meta-description length;
- canonical URL presence, validity, and optional same-origin enforcement;
- H1 count;
- meta robots and `X-Robots-Tag` `noindex` directives;
- bounded unique same-origin links;
- image `alt` attribute coverage, including explicit empty decorative alts;
- a `main` or `role=main` landmark;
- accessible names for non-hidden controls inside forms; and
- a Chromium viewport screenshot saved to the run's key-value store.

The first dataset record is the run-level overview. Every subsequent item is a
detailed finding. The `overview` dataset view is optimized for scanning status,
severity, category, observed evidence, and screenshot links.

### Example input

```json
{
  "urls": [
    "https://example.com/",
    "https://example.com/about"
  ],
  "maxRedirects": 5,
  "maxInternalLinksPerPage": 20,
  "minTitleChars": 10,
  "maxTitleChars": 60,
  "minMetaDescriptionChars": 50,
  "maxMetaDescriptionChars": 160,
  "minImageAltCoveragePercent": 95,
  "requireCanonical": true,
  "requireSameOriginCanonical": true,
  "requireSingleH1": true,
  "requireMainLandmark": true,
  "requireFormLabels": true,
  "captureScreenshots": true,
  "viewportWidth": 1440,
  "viewportHeight": 900
}
````

One to ten URLs are accepted. Internal links are deduplicated, fragment-free,
same-origin only, and capped at 50 per page. Link probes use `HEAD`, falling
back to a one-byte ranged `GET` when a server rejects `HEAD`.

### Output contract

The overview record contains:

- overall `status`;
- pass, fail, unknown, page, finding, and screenshot totals;
- one status per requested page; and
- the exact thresholds used.

Finding records contain a stable `checkId`, category, severity, expected rule,
observed result, short evidence array, final URL, and screenshot key/link when
applicable.

`unknown` is used when the Actor cannot safely or conclusively run a check. It
does not silently convert network, DNS, rendering, or screenshot failures into
a pass.

When a maximum run charge cannot cover another page, that URL is not opened.
Its only finding is `budget_limit` with `status: unknown` and `audited: false`.
The overview separately reports requested, processed, and budget-limited URL
counts, so an unpaid page is never presented as audited.

### Concrete example output

This abridged output came from the verified 17 July 2026
`check-landing-page-before-launch` example against `https://example.com/`.
The page rendered and produced a screenshot; the failing checks remained
visible instead of being forced green.

```json
{
  "recordType": "overview",
  "status": "fail",
  "summary": "Release QA found 3 failing check(s) across 1 page(s)",
  "totals": {
    "requestedUrls": 1,
    "processedUrls": 1,
    "budgetLimitedUrls": 0,
    "findings": 12,
    "screenshots": 1,
    "pass": 9,
    "fail": 3,
    "unknown": 0
  }
}
```

One detailed record was:

```json
{
  "recordType": "finding",
  "status": "fail",
  "checkId": "main_landmark",
  "category": "accessibility",
  "severity": "medium",
  "summary": "No main content landmark was found",
  "expected": "At least one main or role=main landmark",
  "observed": "0 main, 0 navigation, 0 banner, 0 contentinfo landmarks",
  "audited": true
}
```

The screenshot is stored as `SCREENSHOT_001` in the run's default key-value
store. Volatile timestamps and storage URLs are omitted from this example.

### Current Apify pricing

The live Store listing uses pure pay-per-event pricing with exactly two events:

- `apify-actor-start`: the official platform-managed synthetic event at its
  default **USD 0.00005** price. Apify charges it automatically and covers the
  first five seconds of compute; the Actor must never charge it manually;
- `page-audited`: **USD 0.05** once per URL, charged before browser or link
  work begins.

That makes event charges USD 0.05005 for one page, USD 0.25005 for five pages,
and USD 0.50005 for the ten-page maximum.

`page-audited` is the primary event. `apify-default-dataset-item` and the
obsolete custom `audit-start` event are not configured, so detailed findings
cannot create a second charge. Platform usage is included in the event price.

The runtime validates the production PPE event configuration, but it does not
manually charge the synthetic start. It inspects every custom-page
`ChargeResult`: a failed page charge stops the run before that URL is processed.
A successful charge remains valid even when it exhausts the remaining event
budget; that already-paid page is still audited, while later pages are marked
budget-limited.

The public configuration was verified on 17 July 2026 with limited
permissions, hidden source files, Standby disabled, 1024 MB minimum/default
memory, and a 2048 MB maximum. Owner cloud preflights for 1, 5, and 10 pages
reported total platform usage of approximately USD 0.00063, USD 0.00109, and
USD 0.00332. Those runs are cost and reliability evidence, not customer demand
or revenue.

This charging design follows Apify's current
[pay-per-event guidance](https://docs.apify.com/actors/publishing/monetize/pay-per-event),
including the synthetic start event, `ChargeResult` budget checks, and the
optional platform-usage pass-through setting.

### Safety boundary

- Only public HTTP(S) URLs on ports 80 and 443 are accepted.
- URL credentials, localhost, internal hostnames, and private, reserved,
  link-local, multicast, and otherwise non-public IP addresses are rejected.
- Browser traffic is forced through a loopback-only guard proxy. The proxy
  resolves every destination itself and connects to the validated public IP,
  preventing Chromium from bypassing the DNS decision.
- Redirect destinations and sampled links are revalidated.
- Service workers and downloads are disabled.
- Runs are bounded to ten pages, fifty sampled links per page, eight link
  requests at once, and sixty seconds per navigation or probe.
- No account, cookie, customer credential, API key, proxy subscription, or
  model call is required.

### What it does not claim

This is a focused release checklist, not a complete WCAG audit, legal
compliance opinion, Core Web Vitals test, visual-regression system, malware
scanner, or proof that search engines will index a page. It does not log in,
submit forms, click consent dialogs, or intentionally perform a write action.
Browser routing blocks methods other than GET, HEAD, and OPTIONS. The Actor
still issues GET navigations and bounded HEAD/GET link probes, and it does not
crawl beyond the configured link sample.

Dynamic pages are rendered with JavaScript, but results can still differ when a
site personalizes content, geo-blocks cloud browsers, requires authentication,
or delays important UI beyond `DOMContentLoaded` and a short bounded
network-idle wait. Those cases remain visible as failures or unknowns.

### Local verification

Prerequisites: Node.js 22.19+.

```powershell
npm ci
npm run verify
npx --yes apify-cli@1.7.1 validate-schema
```

For a live local screenshot, install the matching Chromium once:

```powershell
npx playwright install chromium
npm run demo
```

On Windows, an existing stable Chrome install can be used without downloading
Chromium:

```powershell
$env:WEBSITE_QA_BROWSER_CHANNEL = "chrome"
npm run demo
Remove-Item Env:WEBSITE_QA_BROWSER_CHANNEL
```

The demo makes read-only requests to `https://example.com/`, writes its PNG
under `output/playwright/`, and prints the run overview. Unit tests inject
network and browser fixtures and do not depend on public websites.

#### Local pay-per-event boundary check

Local PPE test events explicitly charged by Actor code cost USD 1 each. The
following USD 1 cap permits exactly one custom `page-audited` event. The
platform-managed synthetic start is deliberately not emitted by Actor code or
the local charging log. The second URL must remain unaudited and appear as an
explicit budget-limited result:

```powershell
$env:ACTOR_TEST_PAY_PER_EVENT = "true"
$env:ACTOR_USE_CHARGING_LOG_DATASET = "true"
$env:ACTOR_MAX_TOTAL_CHARGE_USD = "1"
$env:WEBSITE_QA_BROWSER_CHANNEL = "chrome"
npx --yes apify-cli@1.7.1 run --purge --input-file demo/ppe-input.json
npm run verify-ppe-log
Remove-Item Env:ACTOR_TEST_PAY_PER_EVENT
Remove-Item Env:ACTOR_USE_CHARGING_LOG_DATASET
Remove-Item Env:ACTOR_MAX_TOTAL_CHARGE_USD
Remove-Item Env:WEBSITE_QA_BROWSER_CHANNEL
```

The charging log is written to `storage/datasets/charging_log/`. It must contain
exactly one `page-audited` event. The default dataset overview must report one
processed URL, one budget-limited URL, and one page event charged. Neither a
manual start event nor a synthetic dataset event is permitted. Named local
charging logs can survive Apify's `--purge`; `verify-ppe-log` therefore scopes
its assertion to the current default-dataset overview timestamp.

The Actor requires at least 1024 MB of memory, matching Apify's browser-Actor
guidance. The cloud Docker image pins Node.js 22 and Playwright 1.61.1 to the
matching Apify Chromium image for reproducible builds.

# Actor input Schema

## `urls` (type: `array`):

One to ten public HTTP(S) pages. Duplicate entries are audited once. Local, private-network, credential-bearing, and non-standard-port URLs are rejected.

## `timeoutSeconds` (type: `integer`):

Maximum navigation or internal-link request time.

## `maxRedirects` (type: `integer`):

A page or sampled link fails its redirect check if this limit is exceeded.

## `maxInternalLinksPerPage` (type: `integer`):

Maximum unique same-origin links checked from each rendered page. Set to zero to disable link requests.

## `internalLinkConcurrency` (type: `integer`):

Maximum simultaneous bounded link probes.

## `minTitleChars` (type: `integer`):

Fail when the normalized document title is shorter than this value.

## `maxTitleChars` (type: `integer`):

Fail when the normalized document title is longer than this value.

## `minMetaDescriptionChars` (type: `integer`):

Fail when the normalized meta description is shorter than this value.

## `maxMetaDescriptionChars` (type: `integer`):

Fail when the normalized meta description is longer than this value.

## `minImageAltCoveragePercent` (type: `integer`):

Percentage of img elements that must include an alt attribute. Empty alt attributes count as explicit decorative treatment.

## `requireCanonical` (type: `boolean`):

Fail when no valid HTTP(S) canonical link is present.

## `requireSameOriginCanonical` (type: `boolean`):

Fail when a canonical URL points to a different origin.

## `requireSingleH1` (type: `boolean`):

When disabled, at least one H1 is still required.

## `requireMainLandmark` (type: `boolean`):

Require at least one main element or role=main landmark.

## `requireFormLabels` (type: `boolean`):

Require every non-hidden form control to have a label or accessible name.

## `captureScreenshots` (type: `boolean`):

Save one PNG viewport screenshot per successfully rendered page to the run's key-value store.

## `viewportWidth` (type: `integer`):

Chromium viewport width used for rendering and screenshots.

## `viewportHeight` (type: `integer`):

Chromium viewport height used for rendering and screenshots.

## Actor input object example

```json
{
  "urls": [
    "https://example.com/"
  ],
  "timeoutSeconds": 20,
  "maxRedirects": 5,
  "maxInternalLinksPerPage": 20,
  "internalLinkConcurrency": 4,
  "minTitleChars": 10,
  "maxTitleChars": 60,
  "minMetaDescriptionChars": 50,
  "maxMetaDescriptionChars": 160,
  "minImageAltCoveragePercent": 95,
  "requireCanonical": true,
  "requireSameOriginCanonical": true,
  "requireSingleH1": true,
  "requireMainLandmark": true,
  "requireFormLabels": true,
  "captureScreenshots": true,
  "viewportWidth": 1440,
  "viewportHeight": 900
}
```

# Actor output Schema

## `overview` (type: `string`):

Compact overall verdict, counts, page statuses, and applied thresholds.

## `results` (type: `string`):

The first dataset item is the run overview. Remaining items are explicit pass, fail, or unknown findings.

## `screenshots` (type: `string`):

Viewport PNG records named SCREENSHOT\_001, SCREENSHOT\_002, and so on.

# 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 = {
    "urls": [
        "https://example.com/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sassy_labs/website-release-qa").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 = { "urls": ["https://example.com/"] }

# Run the Actor and wait for it to finish
run = client.actor("sassy_labs/website-release-qa").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 '{
  "urls": [
    "https://example.com/"
  ]
}' |
apify call sassy_labs/website-release-qa --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Website Release QA: SEO, Links & Screenshots",
        "description": "Check 1–10 public pages before launch. Render in Chromium, capture screenshots, test redirects and internal links, and verify SEO, indexability, image-alt, landmark, and form-label rules with deterministic pass, fail, or unknown evidence.",
        "version": "0.2",
        "x-build-id": "LuBv99nOCgAho3kD6"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/sassy_labs~website-release-qa/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-sassy_labs-website-release-qa",
                "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/sassy_labs~website-release-qa/runs": {
            "post": {
                "operationId": "runs-sync-sassy_labs-website-release-qa",
                "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/sassy_labs~website-release-qa/run-sync": {
            "post": {
                "operationId": "run-sync-sassy_labs-website-release-qa",
                "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",
                "required": [
                    "urls"
                ],
                "properties": {
                    "urls": {
                        "title": "Public page URLs",
                        "minItems": 1,
                        "maxItems": 10,
                        "type": "array",
                        "description": "One to ten public HTTP(S) pages. Duplicate entries are audited once. Local, private-network, credential-bearing, and non-standard-port URLs are rejected.",
                        "items": {
                            "type": "string",
                            "minLength": 8,
                            "maxLength": 2048
                        }
                    },
                    "timeoutSeconds": {
                        "title": "Page timeout",
                        "minimum": 3,
                        "maximum": 60,
                        "type": "integer",
                        "description": "Maximum navigation or internal-link request time.",
                        "default": 20
                    },
                    "maxRedirects": {
                        "title": "Maximum redirects",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "A page or sampled link fails its redirect check if this limit is exceeded.",
                        "default": 5
                    },
                    "maxInternalLinksPerPage": {
                        "title": "Internal links checked per page",
                        "minimum": 0,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Maximum unique same-origin links checked from each rendered page. Set to zero to disable link requests.",
                        "default": 20
                    },
                    "internalLinkConcurrency": {
                        "title": "Internal-link concurrency",
                        "minimum": 1,
                        "maximum": 8,
                        "type": "integer",
                        "description": "Maximum simultaneous bounded link probes.",
                        "default": 4
                    },
                    "minTitleChars": {
                        "title": "Minimum title length",
                        "minimum": 0,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Fail when the normalized document title is shorter than this value.",
                        "default": 10
                    },
                    "maxTitleChars": {
                        "title": "Maximum title length",
                        "minimum": 1,
                        "maximum": 300,
                        "type": "integer",
                        "description": "Fail when the normalized document title is longer than this value.",
                        "default": 60
                    },
                    "minMetaDescriptionChars": {
                        "title": "Minimum meta-description length",
                        "minimum": 0,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Fail when the normalized meta description is shorter than this value.",
                        "default": 50
                    },
                    "maxMetaDescriptionChars": {
                        "title": "Maximum meta-description length",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Fail when the normalized meta description is longer than this value.",
                        "default": 160
                    },
                    "minImageAltCoveragePercent": {
                        "title": "Minimum image alt coverage",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Percentage of img elements that must include an alt attribute. Empty alt attributes count as explicit decorative treatment.",
                        "default": 95
                    },
                    "requireCanonical": {
                        "title": "Require canonical URL",
                        "type": "boolean",
                        "description": "Fail when no valid HTTP(S) canonical link is present.",
                        "default": true
                    },
                    "requireSameOriginCanonical": {
                        "title": "Require same-origin canonical",
                        "type": "boolean",
                        "description": "Fail when a canonical URL points to a different origin.",
                        "default": true
                    },
                    "requireSingleH1": {
                        "title": "Require exactly one H1",
                        "type": "boolean",
                        "description": "When disabled, at least one H1 is still required.",
                        "default": true
                    },
                    "requireMainLandmark": {
                        "title": "Require a main landmark",
                        "type": "boolean",
                        "description": "Require at least one main element or role=main landmark.",
                        "default": true
                    },
                    "requireFormLabels": {
                        "title": "Require accessible form labels",
                        "type": "boolean",
                        "description": "Require every non-hidden form control to have a label or accessible name.",
                        "default": true
                    },
                    "captureScreenshots": {
                        "title": "Capture viewport screenshots",
                        "type": "boolean",
                        "description": "Save one PNG viewport screenshot per successfully rendered page to the run's key-value store.",
                        "default": true
                    },
                    "viewportWidth": {
                        "title": "Viewport width",
                        "minimum": 320,
                        "maximum": 1920,
                        "type": "integer",
                        "description": "Chromium viewport width used for rendering and screenshots.",
                        "default": 1440
                    },
                    "viewportHeight": {
                        "title": "Viewport height",
                        "minimum": 320,
                        "maximum": 1440,
                        "type": "integer",
                        "description": "Chromium viewport height used for rendering and screenshots.",
                        "default": 900
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
