# SaaS Competitor Monitor: Pricing, Changelog & Positioning (`dami_studio/saas-competitor-change-monitor`) Actor

Track competitor pricing, plans, changelogs and homepage positioning on a schedule. Get each change as structured data (Pro $49→$79, Free plan dropped, new integration added) plus a weekly brief and Slack/webhook alerts. Typed competitive signals, not raw page diffs.

- **URL**: https://apify.com/dami\_studio/saas-competitor-change-monitor.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** Lead generation, Automation, E-commerce
- **Stats:** 3 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $10.00 / 1,000 page checkeds

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

<p align="center">
  <img src="https://api.apify.com/v2/key-value-stores/2A3wVKcA6VGGXIXDR/records/icon.png?signature=55xsVERuGYkzuEn6VJdQ" alt="SaaS Competitor Change Monitor" width="140" height="140" />
</p>

## SaaS Competitor Change Monitor

Most "website change" monitors tell you that a page changed. They can't tell you *what* changed in business terms. This one can.

Point it at a competitor's pricing page, changelog, and homepage. On a schedule, it reads each page, compares it to the last run, and reports the actual move as a structured event:

- Pro plan went from **$49 to $79/month (+61%)**
- The **Free plan disappeared**
- A feature **moved from Pro up to Enterprise**
- The homepage headline changed from *"Easy analytics"* to *"The AI CRM that closes for you"*
- They **shipped a Slack integration**

You get those as clean JSON, a readable weekly brief, and an optional Slack/Discord/webhook ping. No CSS selectors, no regex, no per-site tuning to babysit.

> **What it does, in one line:** turns competitor pricing, changelog, and positioning pages into typed competitive-intelligence signals (`price_change`, `plan_added`, `plan_removed`, `feature_moved`, `cta_change`, `positioning_shift`, `new_integration`, `changelog_entry`) on every scheduled run.

---

### Who it's for

Product marketers keeping battlecards current. Competitive-intelligence and pricing teams who need a real feed of competitor moves instead of a folder of screenshots. Founders watching ten rivals without paying for Klue or Crayon. If your job involves answering "did a competitor change their pricing or packaging, and what does it mean for us," this is built for that.

If you searched for a **competitor pricing tracker**, a way to **monitor competitor pricing changes automatically**, a **competitor changelog monitor**, **pricing page change alerts**, or **competitive intelligence automation** that outputs structured data and Slack alerts, you're in the right place.

---

### Why it beats a generic page-diff tool

changedetection.io, Visualping, Distill, and Wachete watch pixels or raw text and hand you a diff. That answers "did this page move." It does not answer "did the Pro tier get more expensive," because a diff has no idea what a price is, what a plan is, or that "$49" belongs to the Pro tier.

This actor has a model of what a SaaS pricing page actually is, so:

- **You get typed events, not diffs.** Every change is machine-readable: tier, old value, new value, percentage, signal type. Pipe it straight into Slack, n8n, Zapier, Make, or your warehouse.
- **Cosmetic noise stays quiet.** Currency toggles, monthly/annual switches, A/B copy, and JS re-renders don't fire alerts. Only a real field change does (a price, a plan, a CTA, a cert).
- **Changelogs are first-class.** It catches a rival's feature launches the moment they ship, not just their pricing page. Most trackers ignore changelogs entirely.
- **It reads the commercial meaning.** "Pro $49 → $79 (+61%)", "Free plan removed", "CTA switched to Contact sales" each come with a one-line note on why it matters and what to do about it.

You're not paying $20k a year and a dedicated analyst for that. It's pay-per-event and self-serve.

---

### Straight talk on accuracy

Worth being honest, because most listings aren't:

- **The signals are deterministic.** They come from rules that compare two structured snapshots, not from an LLM guessing what changed. Same input, same output. The optional AI step only rewrites the "why it matters" sentence and runs solely on pages that actually changed.
- **It's built to under-report, not over-report.** SaaS pages have no standard markup, so on an unusual layout the extractor will skip a tier it can't read cleanly rather than invent a wrong one. A missed tier produces no signal; it does not produce a false one. Enterprise / "Contact sales" tiers with no public price are tracked by name, never given a made-up number.
- **The first run is always a baseline** (no signals). Real signals start on the second run, once there's something to compare against. That's how a monitor is supposed to work.
- **A blocked or unreachable page is reported as `failed` and skipped.** One bad target never takes down the rest of the run, and it never overwrites the last good snapshot.

This has been run against live pricing pages (Plausible, Linear) end to end: it stores a baseline, returns nothing on an unchanged run, and emits a correct `price_change` when a tier actually moves.

---

### Input

```json
{
  "competitors": [
    {
      "name": "Acme",
      "pricingUrl": "https://acme.com/pricing",
      "changelogUrl": "https://acme.com/changelog",
      "homepageUrl": "https://acme.com",
      "docsUrl": ""
    }
  ],
  "watch": ["pricing", "changelog", "positioning", "integrations"],
  "onlyNewSinceLastRun": true,
  "generateAiSignals": true,
  "weeklyBrief": true,
  "webhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ",
  "proxyConfiguration": { "useApifyProxy": true }
}
````

| Field | What it does |
|---|---|
| `competitors` | The list to watch: a name plus any of `pricingUrl`, `changelogUrl`, `homepageUrl`, `docsUrl`. Leave a URL blank to skip it. |
| `watch` | Which page types to track: `pricing`, `changelog`, `positioning`, `integrations`. |
| `onlyNewSinceLastRun` | Emit only what changed, instead of re-dumping everything every run. Keeps scheduled runs cheap. |
| `generateAiSignals` | Sharpen the "why it matters" line with an LLM. Runs only on changed pages. Needs an `ANTHROPIC_API_KEY` env var; falls back to built-in rules if it's missing. You do **not** need an API key for the tool to work. |
| `weeklyBrief` | Build a readable HTML + Markdown brief of every move this run. |
| `webhookUrl` | Slack, Discord, or any JSON endpoint. Slack/Discord formatting is detected automatically. |
| `proxyConfiguration` | Proxy used to fetch pages. Apify Proxy is recommended. |

***

### Output

One record per changed page, plus the weekly brief. A signal looks like this:

```json
{
  "competitor": "Acme",
  "signal_type": "price_change",
  "detail": "Pro: $49/month → $79/month (+61%)",
  "before": "$49",
  "after": "$79",
  "why_it_matters": "Acme raised Pro by 61% — revisit your value-vs-price comparison and refresh the battlecard.",
  "page_type": "pricing",
  "url": "https://acme.com/pricing",
  "detected_at": "2026-06-09T08:00:00Z",
  "is_changed": true
}
```

| `signal_type` | Meaning |
|---|---|
| `price_change` | A tier's price moved (with the % change). |
| `plan_added` / `plan_removed` | A pricing tier appeared or disappeared. |
| `feature_moved` | A feature shifted between tiers (e.g. Free → Pro). |
| `cta_change` | A call-to-action changed (e.g. self-serve → "Contact sales"). |
| `positioning_shift` | The homepage hero / H1 narrative changed. |
| `new_integration` | A new integration was announced. |
| `changelog_entry` | A new release / changelog item shipped. |

The weekly brief is saved to the Key-Value Store (`weekly-brief-html` / `weekly-brief`) and linked in the dataset. It's the thing a marketing team forwards internally on a Monday.

***

### Run it on a schedule (that's the whole point)

A monitor only pays off when it runs on its own. In the Console: open the actor, go to **Schedules**, create one, add your saved input, and pick a cadence.

- Pricing and positioning change slowly, so weekly is plenty: `0 8 * * 1` (Monday 08:00).
- Changelogs move faster, so every two or three days works well: `0 8 */2 * *`.

The first scheduled run captures the baseline. Every run after that sends you only the new moves.

***

### Questions people actually ask

**How do I track a competitor's pricing changes automatically?**
Add their `pricingUrl`, schedule the actor weekly, and you'll get a `price_change` signal with the exact tier, old and new price, and percentage whenever a tier moves.

**Can I monitor a competitor's changelog or release notes?**
Yes. Add `changelogUrl` and include `changelog` in `watch`. New entries become `changelog_entry` signals, and newly announced integrations become `new_integration`.

**How is this different from changedetection.io?**
changedetection.io reports that a page changed (a raw diff). This reports what changed commercially, as structured data you can route into other tools, and it stays quiet on cosmetic churn that diff tools flag as false alarms.

**Do I need an OpenAI or Anthropic API key?**
No. Signals and a solid "why it matters" come from built-in rules at zero API cost. Add `ANTHROPIC_API_KEY` only if you want the AI to phrase the insight more sharply, and even then it runs only on pages that changed.

**Does it handle JavaScript-heavy pricing pages?**
Yes. Static pages are fetched over plain HTTP; pages that need rendering are loaded in headless Chromium automatically.

**Will it get blocked?**
Use Apify Proxy. A blocked page is reported as `failed` and skipped, and it never wipes the last good snapshot or breaks the run.

***

### SaaS Competitor Change Monitor vs. the alternatives

| | This actor | changedetection.io / Visualping / Distill | Klue / Crayon |
|---|---|---|---|
| Output | Typed signals (`price_change`, `plan_removed`…) | Raw text/visual diff | Curated battlecards |
| Understands pricing pages | Yes | No | Yes |
| Noise from toggles / A/B copy | Suppressed | Frequent false alarms | Low (human-curated) |
| Changelog tracking | First-class | Manual, per URL | Yes |
| Structured history per competitor | Yes (JSON) | Snapshots only | Dashboards |
| Cost | Pay-per-event | Free–$$ | $20k+/yr + analyst |
| Setup | Paste URLs, schedule | Selectors + regex | Sales call |

***

### Pricing

Pay-per-event: a fraction of a cent per page checked, and a couple of cents per signal actually delivered. A run where nothing changed costs almost nothing, so you only really pay when there's real intelligence to act on. Full breakdown and the cost math are in `MONETIZATION.md`.

# Actor input Schema

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

The competitors to monitor. For each, provide a name and the URLs you want watched. Leave a URL empty to skip that page type for that competitor.

## `watch` (type: `array`):

Which page types to monitor. 'pricing' tracks tiers/prices/CTAs/features, 'changelog' tracks release entries, 'positioning' tracks homepage hero & CTA, 'integrations' scans docs/changelog for new integrations.

## `onlyNewSinceLastRun` (type: `boolean`):

Emit only the deltas (new/changed targets) instead of a full re-dump every run. This is what makes scheduled runs cheap and useful.

## `generateAiSignals` (type: `boolean`):

Use a small LLM to sharpen the 'why it matters' analysis on each detected change. Runs ONLY on changed pages (never on unchanged ones). Requires the ANTHROPIC\_API\_KEY environment variable; falls back to deterministic rules if absent.

## `weeklyBrief` (type: `boolean`):

Produce a readable HTML/Markdown brief summarizing every competitor move this run, stored in the Key-Value Store and linked in the dataset.

## `webhookUrl` (type: `string`):

Slack, Discord, or generic webhook to receive a compact summary of new signals. Slack/Discord formatting is auto-detected.

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

Proxy used to fetch competitor pages. Apify Proxy is recommended to avoid blocks and geo-pricing skew.

## Actor input object example

```json
{
  "competitors": [
    {
      "name": "Acme",
      "pricingUrl": "https://acme.com/pricing",
      "changelogUrl": "https://acme.com/changelog",
      "homepageUrl": "https://acme.com",
      "docsUrl": ""
    }
  ],
  "watch": [
    "pricing",
    "changelog",
    "positioning",
    "integrations"
  ],
  "onlyNewSinceLastRun": true,
  "generateAiSignals": true,
  "weeklyBrief": true,
  "webhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Findings/results are stored in the default dataset (one row per item).

# 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": "Acme",
            "pricingUrl": "https://acme.com/pricing",
            "changelogUrl": "https://acme.com/changelog",
            "homepageUrl": "https://acme.com",
            "docsUrl": ""
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/saas-competitor-change-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": "Acme",
            "pricingUrl": "https://acme.com/pricing",
            "changelogUrl": "https://acme.com/changelog",
            "homepageUrl": "https://acme.com",
            "docsUrl": "",
        }] }

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/saas-competitor-change-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": "Acme",
      "pricingUrl": "https://acme.com/pricing",
      "changelogUrl": "https://acme.com/changelog",
      "homepageUrl": "https://acme.com",
      "docsUrl": ""
    }
  ]
}' |
apify call dami_studio/saas-competitor-change-monitor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "SaaS Competitor Monitor: Pricing, Changelog & Positioning",
        "description": "Track competitor pricing, plans, changelogs and homepage positioning on a schedule. Get each change as structured data (Pro $49→$79, Free plan dropped, new integration added) plus a weekly brief and Slack/webhook alerts. Typed competitive signals, not raw page diffs.",
        "version": "0.1",
        "x-build-id": "Gilheqh7xJ6iWbSsT"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/dami_studio~saas-competitor-change-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-dami_studio-saas-competitor-change-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/dami_studio~saas-competitor-change-monitor/runs": {
            "post": {
                "operationId": "runs-sync-dami_studio-saas-competitor-change-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/dami_studio~saas-competitor-change-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-dami_studio-saas-competitor-change-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",
                        "type": "array",
                        "description": "The competitors to monitor. For each, provide a name and the URLs you want watched. Leave a URL empty to skip that page type for that competitor."
                    },
                    "watch": {
                        "title": "What to watch",
                        "type": "array",
                        "description": "Which page types to monitor. 'pricing' tracks tiers/prices/CTAs/features, 'changelog' tracks release entries, 'positioning' tracks homepage hero & CTA, 'integrations' scans docs/changelog for new integrations.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "pricing",
                                "changelog",
                                "positioning",
                                "integrations"
                            ],
                            "enumTitles": [
                                "Pricing",
                                "Changelog",
                                "Positioning (homepage)",
                                "Integrations"
                            ]
                        },
                        "default": [
                            "pricing",
                            "changelog",
                            "positioning",
                            "integrations"
                        ]
                    },
                    "onlyNewSinceLastRun": {
                        "title": "Only new since last run",
                        "type": "boolean",
                        "description": "Emit only the deltas (new/changed targets) instead of a full re-dump every run. This is what makes scheduled runs cheap and useful.",
                        "default": true
                    },
                    "generateAiSignals": {
                        "title": "Generate AI insights",
                        "type": "boolean",
                        "description": "Use a small LLM to sharpen the 'why it matters' analysis on each detected change. Runs ONLY on changed pages (never on unchanged ones). Requires the ANTHROPIC_API_KEY environment variable; falls back to deterministic rules if absent.",
                        "default": true
                    },
                    "weeklyBrief": {
                        "title": "Generate weekly competitive brief",
                        "type": "boolean",
                        "description": "Produce a readable HTML/Markdown brief summarizing every competitor move this run, stored in the Key-Value Store and linked in the dataset.",
                        "default": true
                    },
                    "webhookUrl": {
                        "title": "Webhook URL (optional)",
                        "type": "string",
                        "description": "Slack, Discord, or generic webhook to receive a compact summary of new signals. Slack/Discord formatting is auto-detected.",
                        "default": ""
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy used to fetch competitor pages. Apify Proxy is recommended to avoid blocks and geo-pricing skew.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
