# Website Change Tracker — Competitor Monitoring (`inovaflow/website-change-tracker`) Actor

Watches the competitor websites you choose, uses AI to explain what changed and how important it is, and sends you a plain-English digest plus instant alerts in Slack, with a permanent archive in Notion. Just paste the sites to watch — Slack and Notion are optional.

- **URL**: https://apify.com/inovaflow/website-change-tracker.md
- **Developed by:** [inovaflow](https://apify.com/inovaflow) (community)
- **Categories:** Automation, Other, AI
- **Stats:** 4 total users, 3 monthly users, 77.8% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.05 / actor start

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 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

**Know the moment a competitor changes their pricing, ships a feature, or starts hiring — without checking a single page yourself.**

Competitors move quietly: they bump a price, add an Enterprise tier, post three senior roles, soften a tagline — and you hear about it weeks later from a prospect. Checking by hand doesn't scale.

So this Actor watches for you. Paste the pages to track; on every run it opens each one in a real browser, compares it to the last snapshot, and uses AI to tell you **what changed and how big a deal it is** (a 1–5 score). You get a **Slack digest** on your schedule, **instant alerts** for urgent moves, and a **growing Notion archive** of every change. Slack and Notion are optional.

> 🧪 **Early access.** Priced lean — a **$0.05** per-run start fee, plus your Apify usage for the crawl, plus a small **per-summary AI charge** (free with your own AI key). No per-page or per-change markup. See [Costs](#costs). Something off? Open an issue on the **Issues** tab. 🙏

### Who it's for

- **Founders & product marketers** — *"tell me the day a rival changes pricing or packaging."*
- **Competitive intelligence** — a weekly *"what moved across our competitor set"* in one Slack channel.
- **Sales & RevOps** — an instant ping on a new partnership, marquee customer, or leadership change.
- **Recruiters** — watch careers pages for hiring sprees and new roles or regions.
- **Content & SEO** — catch rivals' new posts, changelogs, and announcements early.

### What you get

- **Changes, read for you** — each page is diffed against last time and summarized in a sentence (*"Pro plan rose $49→$59 and an Enterprise tier was added"*), with a **1–5 significance score** so cosmetic edits don't drown out real moves.
- **A digest, not a list** — on your schedule, Slack gets a grouped *"what moved"* rundown, scannable in 30 seconds.
- **Instant alerts** — set a threshold and get a Slack ping the moment a change lands at or above it.
- **A Notion archive** — every change becomes a row in a **Website Changes** database the Actor builds for you. Searchable, filterable, yours.
- **Company briefs** — the first time it sees a competitor, it can write a one-time brief (positioning, pricing, product focus, hiring signals).

### Set it up in 2 minutes

1. **Add the pages.** Paste competitor URLs, one per line — the only required field. A bare domain (`competitor.com`) works; a root URL watches the **whole site** (up to 50 pages/run); a path like `competitor.com/pricing` watches **just that section**.
2. **Pick your AI** *(optional)*. Default **Claude Haiku 4.5** on our key needs no setup. Switch to **Sonnet** for sharper reads, or **GPT/Gemini** with your own key.
3. **Add Slack** *(optional)*. In **Apify Console → Settings → Integrations → MCP Connectors**, add `https://mcp.slack.com/mcp` and authorize it; invite the bot to your channel. Then set **Slack connector** + **Slack channel**.
4. **Add Notion** *(optional)*. Add `https://mcp.notion.com/mcp` and pick it in **Notion connector** — the Actor builds the database for you. To keep it in a specific page, paste that page's **ID** in **Notion page ID** (the 32-char code at the end of its URL); leave blank for your workspace root.
5. **Schedule it.** On the **Schedule** tab, run it **daily at (or after) your digest hour** (UTC) — daily runs catch changes, and the run on your digest day also posts the rundown.

### Input

Only **Pages to watch** is required; everything else has sensible defaults.

| Field | What it is | Default |
| --- | --- | --- |
| **Pages to watch** (`urls`) | Competitor URLs, one per line (bare domain, root, or path) | — (**required**) |
| **Digest frequency** (`rundownFrequency`) | Slack digest cadence: daily or weekly | weekly |
| **Send time / day** (`rundownHour`, `weeklyRundownDay`) | When the digest goes out (UTC) | 9:00, Monday |
| **Immediate critical alerts** (`criticalAlertLevel`) | Instant Slack alert at/above a significance | Never |
| **Company analysis brief** (`companyAnalysis`) | One-time competitor brief: never / on first run / force now | Never |
| **Slack connector + channel** (`slackConnector`, `slackChannel`) | Authorized Slack MCP connector and target channel | — (skip = no Slack) |
| **Notion connector** (`notionConnector`) | Authorized Notion MCP connector | — (skip = no Notion) |
| **Notion page ID** (`notionParentPage`) | Page ID (32-char code from its URL) to build the database inside; blank = workspace root | — |
| **AI model + key** (`model`, `llmApiKey`) | Which AI writes summaries; key required for GPT/Gemini, optional for Claude | Claude Haiku 4.5 |
| **Reset baseline** (`resetBaseline`) | Wipe snapshots and re-baseline every page | off |
| **Proxy** (`proxyConfiguration`) | Proxy for fetching pages; Residential for anti-bot sites | Apify Proxy on |

### Output

One row per page per run — a `baseline` row the first time a page is seen, then a `changed` row whenever a real diff is found:

```json
{
  "url": "https://competitor.com/pricing",
  "status": "changed",
  "changeType": "pricing",
  "significance": 4,
  "summary": "The Pro plan rose from $49 to $59/month and a new Enterprise tier was added.",
  "evidence": ["- $49/month", "+ $59/month", "+ Enterprise — contact sales"],
  "checkedAt": "2026-06-08T09:00:12.000Z"
}
````

Key fields: **`status`** (`baseline` / `changed`), **`changeType`** (pricing, product, partnership, hiring, messaging, content, legal, cosmetic, other), **`significance`** (1 cosmetic → 5 major), **`summary`**, **`evidence`** (telling diff lines), and **`diff`** (the full diff behind it). Download as **JSON, CSV, Excel, or HTML** from the **Output** tab.

### Costs

Pay only when you run — no subscription, no per-result markup:

- **$0.05 per run start** — one baseline fee (billed even with your own AI key).
- **Apify platform usage** (compute + proxy) for the crawl — the main variable cost, since it renders each page in a real browser. Scales with pages tracked and run frequency.
- **A small AI charge per summary** — **$0.02 (Haiku)** or **$0.06 (Sonnet)**, one flat charge per write-up (each change, the digest, each brief). **$0 with your own Anthropic key, or with GPT/Gemini** (you pay that provider directly).

The **first run writes no summaries** (just a baseline per page), so it's only the start fee + crawl. **Tips:** track specific paths over whole sites, keep the default **Haiku**, and run **daily, not hourly**.

### Use it from your AI assistant (MCP)

This Actor **uses** MCP connectors for delivery — Slack (digests + alerts) and Notion (the archive) — authorized once in **Apify Console → Settings → Integrations → MCP Connectors**, so it never sees your tokens. You can also **run the Actor itself** from any MCP client (Claude, Cursor, …) via the **Apify MCP server** (`https://mcp.apify.com`) with your Apify token — just ask *"what changed on my competitors this week?"*

### FAQ

**Why no changes on the first run?** It stores a baseline first (you'll see a `baseline` row per page). Change detection starts on the second run, once there's something to compare against.

**Why didn't my digest arrive?** Digests only send on a run **at or after** your chosen UTC hour (and, for weekly, on your day). Schedule the Actor to run **daily at your digest hour** — the simplest reliable setup.

**Do I have to set up the Notion database?** No — the Actor builds it. By default it lands at your workspace root; paste a **Notion page ID** to keep it inside that page instead.

**Can I use my own AI account?** Yes. GPT/Gemini **require** your key; for Claude it's optional (blank = built-in key, or paste your Anthropic key to bill your own account and skip our AI charge).

**A site is behind anti-bot protection?** Switch **Proxy** to Residential. If a page still returns no content, the log flags a possible block.

**Is this allowed?** It reads publicly accessible pages, like a browser does. Review each target's Terms of Service, robots policy, and your local laws first, and don't collect personal or restricted data.

**Bugs, requests, or custom tweaks?** Open an issue on the **Issues** tab — we read every one. 🙏

# Actor input Schema

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

Required. The competitor pages to watch, one URL per row. A root URL crawls up to 50 pages on that site; a path URL watches only that section.

## `rundownFrequency` (type: `string`):

How often the Slack digest is sent. Match your Actor schedule to this cadence.

## `rundownHour` (type: `integer`):

UTC hour (0–23) at which the digest is sent. Default is 9 (9:00 AM UTC).

## `weeklyRundownDay` (type: `string`):

Day of the week (UTC) for the weekly digest. Ignored when frequency is Daily.

## `criticalAlertLevel` (type: `string`):

Minimum change significance that triggers an immediate Slack alert. Leave at Never to use only the scheduled digest.

## `companyAnalysis` (type: `string`):

Generates a one-time positioning brief per competitor from already-captured pages. Leave at Never for change tracking only.

## `slackConnector` (type: `string`):

Your authorized Slack MCP connector. Leave empty to skip Slack delivery.

## `slackChannel` (type: `string`):

Slack channel or DM to post to (e.g. #competitor-watch). Leave empty to skip posting.

## `notionConnector` (type: `string`):

Your authorized Notion MCP connector. Leave empty to skip Notion archiving.

## `notionParentPage` (type: `string`):

Notion page where the archive databases are created. Leave empty to create them at your workspace root.

## `model` (type: `string`):

Which AI writes the change summaries. The default works with zero setup.

## `llmApiKey` (type: `string`):

API key for GPT, Gemini, or Claude 'with your own key' models. Leave empty when using the default built-in Claude.

## `resetBaseline` (type: `boolean`):

Wipes stored snapshots and recaptures every page fresh. This run records a new baseline but reports no changes and sends no alerts.

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

Proxy used to fetch pages. Switch to Residential for sites behind Cloudflare or similar bot protection.

## Actor input object example

```json
{
  "urls": [
    "https://competitor.com/",
    "https://other.com/pricing"
  ],
  "rundownFrequency": "weekly",
  "rundownHour": 9,
  "weeklyRundownDay": "monday",
  "criticalAlertLevel": "never",
  "companyAnalysis": "never",
  "slackChannel": "#competitor-watch",
  "notionParentPage": "1a2b3c4d5e6f7081920a1b2c3d4e5f60",
  "model": "claude-haiku-4-5-20251001",
  "resetBaseline": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `changes` (type: `string`):

One row per detected change — each with the AI's classification, significance score, summary, and supporting evidence. Baseline and unchanged pages produce no rows.

# 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://competitor.com/"
    ],
    "model": "claude-haiku-4-5-20251001"
};

// Run the Actor and wait for it to finish
const run = await client.actor("inovaflow/website-change-tracker").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://competitor.com/"],
    "model": "claude-haiku-4-5-20251001",
}

# Run the Actor and wait for it to finish
run = client.actor("inovaflow/website-change-tracker").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://competitor.com/"
  ],
  "model": "claude-haiku-4-5-20251001"
}' |
apify call inovaflow/website-change-tracker --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Website Change Tracker — Competitor Monitoring",
        "description": "Watches the competitor websites you choose, uses AI to explain what changed and how important it is, and sends you a plain-English digest plus instant alerts in Slack, with a permanent archive in Notion. Just paste the sites to watch — Slack and Notion are optional.",
        "version": "0.1",
        "x-build-id": "WTKzzYP1oHVMKg5kw"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/inovaflow~website-change-tracker/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-inovaflow-website-change-tracker",
                "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/inovaflow~website-change-tracker/runs": {
            "post": {
                "operationId": "runs-sync-inovaflow-website-change-tracker",
                "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/inovaflow~website-change-tracker/run-sync": {
            "post": {
                "operationId": "run-sync-inovaflow-website-change-tracker",
                "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": "Pages to watch",
                        "type": "array",
                        "description": "Required. The competitor pages to watch, one URL per row. A root URL crawls up to 50 pages on that site; a path URL watches only that section.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "rundownFrequency": {
                        "title": "Digest frequency",
                        "enum": [
                            "daily",
                            "weekly"
                        ],
                        "type": "string",
                        "description": "How often the Slack digest is sent. Match your Actor schedule to this cadence.",
                        "default": "weekly"
                    },
                    "rundownHour": {
                        "title": "Send time (UTC hour, 0–23)",
                        "minimum": 0,
                        "maximum": 23,
                        "type": "integer",
                        "description": "UTC hour (0–23) at which the digest is sent. Default is 9 (9:00 AM UTC).",
                        "default": 9
                    },
                    "weeklyRundownDay": {
                        "title": "Weekly digest day",
                        "enum": [
                            "monday",
                            "tuesday",
                            "wednesday",
                            "thursday",
                            "friday",
                            "saturday",
                            "sunday"
                        ],
                        "type": "string",
                        "description": "Day of the week (UTC) for the weekly digest. Ignored when frequency is Daily.",
                        "default": "monday"
                    },
                    "criticalAlertLevel": {
                        "title": "Immediate critical alerts",
                        "enum": [
                            "never",
                            "low",
                            "medium",
                            "high"
                        ],
                        "type": "string",
                        "description": "Minimum change significance that triggers an immediate Slack alert. Leave at Never to use only the scheduled digest.",
                        "default": "never"
                    },
                    "companyAnalysis": {
                        "title": "Company analysis brief",
                        "enum": [
                            "never",
                            "on-first-run",
                            "force-now"
                        ],
                        "type": "string",
                        "description": "Generates a one-time positioning brief per competitor from already-captured pages. Leave at Never for change tracking only.",
                        "default": "never"
                    },
                    "slackConnector": {
                        "title": "Slack connector",
                        "type": "string",
                        "description": "Your authorized Slack MCP connector. Leave empty to skip Slack delivery."
                    },
                    "slackChannel": {
                        "title": "Slack channel",
                        "type": "string",
                        "description": "Slack channel or DM to post to (e.g. #competitor-watch). Leave empty to skip posting."
                    },
                    "notionConnector": {
                        "title": "Notion connector",
                        "type": "string",
                        "description": "Your authorized Notion MCP connector. Leave empty to skip Notion archiving."
                    },
                    "notionParentPage": {
                        "title": "Notion page (link or ID, optional)",
                        "type": "string",
                        "description": "Notion page where the archive databases are created. Leave empty to create them at your workspace root."
                    },
                    "model": {
                        "title": "AI model",
                        "enum": [
                            "claude-haiku-4-5-20251001",
                            "claude-haiku-4-5-20251001-byok",
                            "claude-sonnet-4-6",
                            "claude-sonnet-4-6-byok",
                            "gpt-4o-mini",
                            "gpt-4o",
                            "gemini-1.5-flash",
                            "gemini-1.5-pro"
                        ],
                        "type": "string",
                        "description": "Which AI writes the change summaries. The default works with zero setup.",
                        "default": "claude-haiku-4-5-20251001"
                    },
                    "llmApiKey": {
                        "title": "Your own AI API key",
                        "type": "string",
                        "description": "API key for GPT, Gemini, or Claude 'with your own key' models. Leave empty when using the default built-in Claude."
                    },
                    "resetBaseline": {
                        "title": "Reset baseline",
                        "type": "boolean",
                        "description": "Wipes stored snapshots and recaptures every page fresh. This run records a new baseline but reports no changes and sends no alerts.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy used to fetch pages. Switch to Residential for sites behind Cloudflare or similar bot protection.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
