# SaaS Competitor Monitor (`apium/saas-competitor-monitor`) Actor

Monthly-friendly competitor monitoring for SaaS pricing pages, changelogs/release notes, docs homepages and careers/jobs pages. Fetches each page, diffs it against the last stored snapshot, and flags exactly what changed so you can wire alerts into Make/n8n/Zapier/Slack.

- **URL**: https://apify.com/apium/saas-competitor-monitor.md
- **Developed by:** [Tommi Sullivan](https://apify.com/apium) (community)
- **Categories:** Marketing, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 page checkeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

## SaaS Competitor Monitor — Pricing, Changelog, Docs & Jobs Change Detection (Pay Per Page-Check)

**Know the moment a competitor changes their pricing, ships a release, rewrites their docs, or opens a new role.** Point this actor at a list of competitor domains, schedule it monthly (or weekly), and get one clean dataset record per competitor per page-type telling you exactly what changed since last time — ready to filter and pipe into Slack, Make, n8n, or Zapier alerts.

> Keywords: competitor monitoring, saas competitive intelligence, pricing page change detection, changelog tracker, website change alert, competitor pricing tracker.

---

### Why this actor

- **Alert-ready by design.** Every dataset record has a `changed` boolean. Filter on `changed == true` and you have a ready-made trigger for any no-code automation tool — no custom diffing logic needed downstream.
- **Fair pay-per-page-check pricing.** No monthly subscription tool to forget about and keep paying for. Schedule this actor once a month and you pay only for the pages actually checked — see [PRICING.md](PRICING.md) for the full $6/1,000 breakdown and why PPE nets out like a subscription without subscription infra.
- **No browser tax.** These are ordinary public marketing/docs/changelog/careers pages, not bot-protected like an app or marketplace backend, so this actor uses a plain HTTP client (`httpx`) instead of a browser or TLS-impersonation stack — keeping the cost per page-check low. See "Fetching approach" below.
- **Real diffs, not just "something changed."** Every changed page gets a human-readable `diff_summary` plus a capped unified diff, so you can see *what* changed without opening the page yourself.

---

### What it does

- Accepts a list of **competitors** (domain/name plus optional explicit URLs for pricing, changelog, docs, and careers pages).
- For any page type without an explicit URL, falls back to a **best-effort guessed path** off the domain (e.g. `/pricing`, `/changelog`, `/docs`, `/careers`) — **TODO-VERIFY:** these guesses are generic and not confirmed against real competitor site structures; supply explicit URLs whenever you know them for reliable results.
- Fetches each page over plain HTTP, strips script/style/nav/header/footer noise, and extracts meaningful text.
- Computes a `content_hash` (sha256) and, if a previous snapshot exists in the actor's key-value store, a unified diff via Python's `difflib`.
- The **first run** for any competitor+page-type always sets `changed=false` and `is_first_run=true` — there's nothing to compare against yet, so it is never treated as an alert-worthy change.
- Pushes one dataset record per competitor per page-type per run, and writes the new snapshot back to the key-value store for next time.
- Respects a global `maxPageChecks` spend cap so a large competitor list can't run away unbounded.

---

### Fetching approach: httpx, no browser

Competitor pricing/changelog/docs/careers pages are normal public marketing sites — they are not protected by bot-detection layers like Datadome the way a scraped app backend or marketplace API might be. There is no need for TLS/JA3 browser impersonation or residential proxies here, so this actor uses a plain [`httpx`](https://www.python-httpx.org/) client. That keeps compute and bandwidth cost low, which is reflected directly in the [pricing](PRICING.md).

**TODO-VERIFY — known limitation:** pages that render their content client-side via JavaScript (a React/Vue SPA whose pricing table is fetched and rendered after the initial HTML loads, for example) will **not** be captured correctly by a plain HTTP GET — the raw HTML payload may be near-empty of the actual pricing content. There is no headless browser in this build. If you notice a competitor's `snapshot_text` looks empty or unrelated to the real page content, that's the likely cause; a future version could add an optional headless-browser fetch path for such sites.

---

### Input

| Field | Type | Description |
|---|---|---|
| `competitors` | array | Competitor objects: `domain`/`name` plus optional `pricingUrl`, `changelogUrl`, `docsUrl`, `careersUrl`. Missing URLs fall back to guessed paths (see above). |
| `pageTypes` | array | Which page types to check: `pricing`, `changelog`, `docs`, `jobs`. Defaults to all four. |
| `maxPageChecks` | integer | Global cap on total page-checks (competitors × page-types) performed and charged per run. Default `200`. |
| `requestTimeoutSecs` | integer | Per-page HTTP timeout in seconds. Default `20`. |
| `maxSnapshotKb` | integer | Caps stored/returned snapshot text size in KB; longer pages are truncated with a note. Default `200`. |
| `proxyConfiguration` | object | **Optional.** Not required by default since these sites aren't typically bot-protected. Enable only if a specific competitor blocks datacenter IPs. |

#### Input example

```json
{
  "competitors": [
    {
      "name": "Acme SaaS",
      "domain": "acme.example.com",
      "pricingUrl": "https://acme.example.com/pricing",
      "changelogUrl": "https://acme.example.com/changelog"
    },
    {
      "name": "Beta Cloud",
      "domain": "betacloud.example.com"
    }
  ],
  "pageTypes": ["pricing", "changelog", "docs", "jobs"],
  "maxPageChecks": 200
}
````

***

### Output

One dataset record per competitor per page-type per run.

| Field | Type | Description |
|---|---|---|
| `domain` | string | Normalised competitor domain. |
| `page_type` | string | `pricing` / `changelog` / `docs` / `jobs`. |
| `url` | string | The URL actually fetched (explicit or guessed). |
| `fetched_at` | string | ISO-8601 UTC fetch timestamp. |
| `content_hash` | string | sha256 hex digest of the extracted page text. |
| `changed` | boolean | **True only if this differs from the last stored snapshot.** Always `false` on the first run. Filter on this for alerts. |
| `is_first_run` | boolean | True if no prior snapshot existed for this competitor+page-type. |
| `diff_summary` | string | Short human-readable summary (e.g. "3 line(s) added, 1 line(s) removed"). Only populated when `changed=true`. |
| `unified_diff` | string | Capped unified diff of old vs. new text. Only populated when `changed=true`. |
| `snapshot_text` | string | Extracted page text (capped at `maxSnapshotKb`, with a truncation note if exceeded). |
| `snapshot_truncated` | boolean | True if `snapshot_text` was cut down to fit the size cap. |
| `http_status` | number | HTTP status code of the fetch. |

#### Output example

```json
{
  "domain": "acme.example.com",
  "page_type": "pricing",
  "url": "https://acme.example.com/pricing",
  "fetched_at": "2026-07-06T09:00:00Z",
  "content_hash": "3b1f...c9",
  "changed": true,
  "is_first_run": false,
  "diff_summary": "2 line(s) added, 1 line(s) removed",
  "unified_diff": "--- https://acme.example.com/pricing (previous)\n+++ https://acme.example.com/pricing (current)\n@@ -4,3 +4,4 @@\n-Starter plan: $10/month\n+Starter plan: $15/month\n+Enterprise plan: contact us",
  "snapshot_text": "Pricing\nStarter plan: $15/month\nPro plan: $30/month\nEnterprise plan: contact us",
  "snapshot_truncated": false,
  "http_status": 200
}
```

***

### Use cases

- **Pricing-change alerts.** Get pinged the moment a competitor raises, lowers, or restructures their pricing tiers.
- **Changelog / release-notes tracking.** Know when a competitor ships a feature that matters to your positioning, without manually checking their changelog every week.
- **Docs-drift monitoring.** Track when a competitor's docs homepage changes significantly (new product area, restructured navigation, new integration highlighted).
- **Hiring-signal tracking.** New roles on a competitor's careers page (e.g. "Enterprise Sales", "ML Engineer") are a leading indicator of their next move.
- **Monthly competitive-intelligence digest.** Schedule this actor once a month and build a standing "what changed" report across your whole competitive set.

***

### Integrations

- **Export** to JSON, CSV, Excel, or Google Sheets.
- **Apify API** — pull results programmatically, schedule monthly/weekly runs.
- **Make / n8n / Zapier** — filter the dataset on `changed == true` and wire straight into a Slack/email/webhook alert. This is the intended integration pattern — see "What it does" above.
- **Apify schedules** — the cleanest way to get "subscription-like" monthly monitoring: schedule the actor to run monthly with the same competitor list, and each run only pays for the page-checks performed. See [PRICING.md](PRICING.md).

***

### FAQ

**Do I need a proxy?**
No, not by default. These are normal public marketing/docs pages, not bot-protected like a scraped marketplace API. `proxyConfiguration` is optional — only turn it on if a specific competitor blocks datacenter IPs.

**What happens on the very first run for a competitor?**
`changed` is always `false` and `is_first_run` is `true` — there's no prior snapshot to compare against yet, so it can never be a false-positive "change" alert. Real change detection starts from the second run onward.

**Will this work on JavaScript-heavy pricing pages?**
Not reliably in this version. If a competitor's page renders its real content client-side via JS, the plain HTTP fetch may miss it. See the "Fetching approach" section above — this is a known `TODO-VERIFY` limitation.

**How accurate are the guessed default paths (`/pricing`, `/changelog`, etc.)?**
Unverified — they're generic best-effort fallbacks. Real sites vary (changelog might be `/release-notes`, careers might be on a separate ATS subdomain like `jobs.lever.co`). Supply explicit URLs in `competitors` whenever you know them.

**How is pricing structured?**
Pay-per-page-check: **$6 per 1,000 page-checks**, no subscription. See [PRICING.md](PRICING.md) for the full cost breakdown and comparison to monitoring-as-a-service tools.

***

### Legality

This actor fetches only **publicly available** marketing/docs/changelog/careers pages — the same pages any visitor's browser would load. It does not log in, bypass paywalls, or access private data. You are responsible for reviewing the target sites' `robots.txt` and terms of service and using this actor in line with applicable law. Not affiliated with or endorsed by any company whose public pages you choose to monitor.

# Actor input Schema

## `competitors` (type: `array`):

One entry per competitor. Provide at least 'domain' or 'name'. Any of pricingUrl / changelogUrl / docsUrl / careersUrl you supply are used as-is; any you leave blank fall back to a best-effort guessed path off the domain (e.g. /pricing, /changelog, /docs, /careers) — TODO-VERIFY: guessed paths are not confirmed against the real site and may 404 or resolve to the wrong page. Supply explicit URLs whenever you know them.

## `pageTypes` (type: `array`):

Which page types to fetch and diff for every competitor. Defaults to all four.

## `maxPageChecks` (type: `integer`):

Hard cap on the total number of page-checks (competitors x page-types) performed and charged in a single run. Protects you from overspending if you paste a very large competitor list. The Actor stops cleanly once reached.

## `requestTimeoutSecs` (type: `integer`):

Per-page HTTP timeout in seconds before giving up on a slow competitor page.

## `maxSnapshotKb` (type: `integer`):

Caps how much extracted text is stored per page snapshot (both in the key-value store and in the dataset record). Longer pages are truncated with a note, which keeps storage and dataset record size sane for very long docs/changelog pages.

## `proxyConfiguration` (type: `object`):

Optional proxy settings. Public SaaS marketing/docs/changelog/careers pages are typically NOT bot-protected, so no proxy is required by default. Enable this only if a specific competitor site blocks datacenter IPs.

## Actor input object example

```json
{
  "competitors": [
    {
      "name": "Example Co",
      "domain": "example.com",
      "pricingUrl": "",
      "changelogUrl": "",
      "docsUrl": "",
      "careersUrl": ""
    }
  ],
  "pageTypes": [
    "pricing",
    "changelog",
    "docs",
    "jobs"
  ],
  "maxPageChecks": 200,
  "requestTimeoutSecs": 20,
  "maxSnapshotKb": 200
}
```

# 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 = {
    "competitors": [
        {
            "name": "Example Co",
            "domain": "example.com",
            "pricingUrl": "",
            "changelogUrl": "",
            "docsUrl": "",
            "careersUrl": ""
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("apium/saas-competitor-monitor").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 = { "competitors": [{
            "name": "Example Co",
            "domain": "example.com",
            "pricingUrl": "",
            "changelogUrl": "",
            "docsUrl": "",
            "careersUrl": "",
        }] }

# Run the Actor and wait for it to finish
run = client.actor("apium/saas-competitor-monitor").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 '{
  "competitors": [
    {
      "name": "Example Co",
      "domain": "example.com",
      "pricingUrl": "",
      "changelogUrl": "",
      "docsUrl": "",
      "careersUrl": ""
    }
  ]
}' |
apify call apium/saas-competitor-monitor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "SaaS Competitor Monitor",
        "description": "Monthly-friendly competitor monitoring for SaaS pricing pages, changelogs/release notes, docs homepages and careers/jobs pages. Fetches each page, diffs it against the last stored snapshot, and flags exactly what changed so you can wire alerts into Make/n8n/Zapier/Slack.",
        "version": "0.1",
        "x-build-id": "hYzBRRIPIMVEViNHi"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/apium~saas-competitor-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-apium-saas-competitor-monitor",
                "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/apium~saas-competitor-monitor/runs": {
            "post": {
                "operationId": "runs-sync-apium-saas-competitor-monitor",
                "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/apium~saas-competitor-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-apium-saas-competitor-monitor",
                "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": [
                    "competitors"
                ],
                "properties": {
                    "competitors": {
                        "title": "Competitors to monitor",
                        "type": "array",
                        "description": "One entry per competitor. Provide at least 'domain' or 'name'. Any of pricingUrl / changelogUrl / docsUrl / careersUrl you supply are used as-is; any you leave blank fall back to a best-effort guessed path off the domain (e.g. /pricing, /changelog, /docs, /careers) — TODO-VERIFY: guessed paths are not confirmed against the real site and may 404 or resolve to the wrong page. Supply explicit URLs whenever you know them."
                    },
                    "pageTypes": {
                        "title": "Page types to check",
                        "type": "array",
                        "description": "Which page types to fetch and diff for every competitor. Defaults to all four.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "pricing",
                                "changelog",
                                "docs",
                                "jobs"
                            ],
                            "enumTitles": [
                                "Pricing",
                                "Changelog / release notes",
                                "Docs homepage",
                                "Careers / jobs"
                            ]
                        },
                        "default": [
                            "pricing",
                            "changelog",
                            "docs",
                            "jobs"
                        ]
                    },
                    "maxPageChecks": {
                        "title": "Max page-checks (total spend cap)",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Hard cap on the total number of page-checks (competitors x page-types) performed and charged in a single run. Protects you from overspending if you paste a very large competitor list. The Actor stops cleanly once reached.",
                        "default": 200
                    },
                    "requestTimeoutSecs": {
                        "title": "Request timeout (seconds)",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Per-page HTTP timeout in seconds before giving up on a slow competitor page.",
                        "default": 20
                    },
                    "maxSnapshotKb": {
                        "title": "Max stored snapshot size (KB)",
                        "minimum": 10,
                        "type": "integer",
                        "description": "Caps how much extracted text is stored per page snapshot (both in the key-value store and in the dataset record). Longer pages are truncated with a note, which keeps storage and dataset record size sane for very long docs/changelog pages.",
                        "default": 200
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration (optional)",
                        "type": "object",
                        "description": "Optional proxy settings. Public SaaS marketing/docs/changelog/careers pages are typically NOT bot-protected, so no proxy is required by default. Enable this only if a specific competitor site blocks datacenter IPs."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
