# Shopify Competitor Monitor & Product Research (`phantom_coder/shopify-competitor-monitor`) Actor

Monitor competitor Shopify stores for price changes, new product launches, and app stack updates. Run it on a schedule - you only see what changed, delivered as an AI digest.

- **URL**: https://apify.com/phantom\_coder/shopify-competitor-monitor.md
- **Developed by:** [Phantom Coder](https://apify.com/phantom_coder) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $9.00 / 1,000 change detecteds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Shopify Competitor Monitor & Product Research

Know what your competitors launched, discounted, or changed this week - before your customers do.

E-commerce brands, D2C teams, and agencies use this Actor to:

- **Catch competitor product launches the week they happen** - not three weeks later when you notice them on social media
- **Know when a competitor drops prices** so you can decide in hours, not days
- **See which apps competitors are adding** - a new SMS tool or loyalty program is a signal about where they're investing

A Shopify price tracker and store monitor that goes further than raw data - it only shows you what actually changed since the last run.

---

### Who is it for

- **D2C brands** - track what competitors in your category are launching and pricing
- **E-commerce agencies** - monitor client competitors across dozens of stores on a single schedule
- **Retail buyers and merchandisers** - watch market pricing signals across a curated set of brands
- **Wholesale and private label brands** - see which products competitors are discontinuing (potential gaps to fill)
- **Growth and marketing teams** - track when competitors add or drop retention tools like Klaviyo, Attentive, or ReCharge

---

### Why it's different: smart baseline comparison

Most Shopify scrapers give you the full product catalog every run - thousands of items you have to diff yourself.

This Actor doesn't work that way.

On the first run for each store, it saves a snapshot of the full catalog. On every subsequent run, it compares the current state against that snapshot and **only surfaces what changed** - new products, price moves, discontinued lines, and app stack changes.

This means:
- A store with 50,000 products generates the same-size change feed as one with 500 - you only see what moved
- You only see changes that happened since your last run
- Your dataset only contains actionable intelligence - not a data dump

The baseline persists across runs indefinitely, so your feed stays fresh no matter how long you've been monitoring.

---

### What it detects

#### New product launches

Detects new products by cross-referencing your saved baseline - only products that genuinely weren't there before are surfaced.

**Example:**
> Gymshark added "Apex Seamless Leggings - Focus Pink" at $68. Category: Leggings.

**Example:**
> Allbirds launched 3 new colorways of the Tree Runner at $109 each.

#### Price changes

Every variant price is tracked. When the minimum price on any product changes, a `price_change` event is recorded with the old and new price, plus the percentage change.

**Example:**
> Allbirds dropped Men's Tree Runners from $98 to $78 (-20%).

**Example:**
> Gymshark raised the Crest Hoodie from $60 to $70 (+17%).

#### App stack changes

Recognizes 30+ common Shopify apps by their digital footprint. When an app appears or disappears, it records the change.

**Example:**
> Fashion Nova added Attentive (SMS marketing). First time they've had an SMS tool.

**Example:**
> Allbirds removed Hotjar.

#### Collection filtering (for large stores)

Stores like Fashion Nova have 25,000+ products across 500+ collections. Instead of fetching everything, you can specify exactly which collections to monitor - `dresses`, `tops`, `bottoms` - and the Actor only tracks changes within those collections.

Use `listCollections: true` to discover what collection handles a store uses before setting up monitoring.

---

### Pricing

Pay Per Event - you only pay for what gets processed.

| Event | Free | Starter | Scale | Business |
|---|---|---|---|---|
| Actor start | $0.00005 | $0.00005 | $0.00005 | $0.00005 |
| Store analyzed | $0.0080 | $0.0070 | $0.0060 | $0.0050 |
| Per 1,000 products fetched | $0.0040 | $0.0030 | $0.0020 | $0.0010 |
| Change detected | $0.0120 | $0.0110 | $0.0100 | $0.0090 |

**What triggers each charge:**

- **Actor start** - once per run
- **Store analyzed** - once per store per run, whether or not anything changed
- **Per 1,000 products fetched** - every run, based on catalog size. A 5,000-product store = 5 charges per run. Disable price tracking if you only care about new launches - the Actor will then only fetch products that are new since the last run, which is usually just a handful
- **Change detected** - only when a change is actually found. Zero charges on a quiet week

**Typical monthly cost (Starter plan, weekly runs):**

| Setup | Monthly |
|---|---|
| 3 stores, small catalogs | ~$0.25 |
| 10 stores, mixed sizes | ~$0.80 |
| 20 stores with collection filtering | ~$2.10 |
| 50 stores with collection filtering | ~$4.00 |

**Compare to alternatives:**
- PPSPY: $79/month
- Snoopie: $19/month (limited stores)
- Storeleads: $200+/month
- This Actor: ~$4/month for 50 stores, with no store limit

The first run charges for Actor start, store analysis, and product fetching only - no change-detection charges, since there is no previous baseline to compare against yet.

---

### Setup

<ol>
<li>Open the Actor and click <strong>Start</strong></li>
<li>Add the Shopify store URLs you want to monitor under <strong>Competitor store URLs</strong></li>
<li>Optional: run once with <strong>List available collections</strong> enabled to discover collection handles for large stores, then add the ones you care about to <strong>Collections to monitor</strong></li>
<li>Click <strong>Start</strong> to save the baseline snapshot</li>
<li>Go to <strong>Settings - Schedules</strong> and create a weekly schedule</li>
<li>Optional: add your Groq API key under <strong>Settings - Environment variables</strong> to get an AI-written digest at the end of each run</li>
</ol>

> **The first run produces no change events.** It only saves a baseline snapshot. Changes appear from the second run onwards - this is expected behavior, not an error.

---

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `stores` | string[] | required | Shopify store URLs to monitor |
| `collections` | string[] | - | Collection handles to limit monitoring (e.g., `leggings`, `dresses`). Leave empty for full catalog |
| `listCollections` | boolean | `false` | Discovery mode - lists all available collection handles instead of monitoring |
| `trackProductChanges` | boolean | `true` | Detect new and discontinued products |
| `trackPriceChanges` | boolean | `true` | Detect price changes. Disable if you only care about new launches - uses a faster, cheaper fetch method that only pulls new products rather than the full catalog |
| `trackAppStack` | boolean | `true` | Detect added/removed apps |
| `maxProductsPerStore` | integer | - | Cap the product fetch per store - useful for controlling costs on huge catalogs |

#### Environment variables

Set once in Actor settings, not per run:

| Variable | Description |
|---|---|
| `GROQ_API_KEY` | Groq API key for AI digest at end of each run. Free at console.groq.com. The model is preconfigured - no other variables needed. |

---

### Output schema

**Product change:**

```json
{
  "store": "https://gymshark.com",
  "storeDomain": "gymshark.com",
  "changeType": "new_product",
  "productTitle": "Apex Seamless Leggings - Focus Pink",
  "productType": "Leggings",
  "productUrl": "https://gymshark.com/products/apex-seamless-leggings-focus-pink",
  "oldValue": null,
  "newValue": 68.00,
  "changePercent": null,
  "detectedAt": "2026-06-01T08:00:00.000Z"
}
````

**Price change:**

```json
{
  "store": "https://allbirds.com",
  "storeDomain": "allbirds.com",
  "changeType": "price_change",
  "productTitle": "Men's Tree Runners",
  "productUrl": "https://allbirds.com/products/mens-tree-runners",
  "oldValue": 98.00,
  "newValue": 78.00,
  "changePercent": -20,
  "detectedAt": "2026-06-01T08:00:00.000Z"
}
```

**App stack change:**

```json
{
  "store": "https://fashionnova.com",
  "storeDomain": "fashionnova.com",
  "changeType": "app_added",
  "appName": "Attentive",
  "detectedAt": "2026-06-01T08:00:00.000Z"
}
```

**Run summary (always the last item):**

```json
{
  "changeType": "run_summary",
  "storesChecked": 10,
  "totalChanges": 14,
  "message": "Checked 10 stores, found 14 changes."
}
```

If `GROQ_API_KEY` is set and changes were found, an AI digest is included before the summary:

> - Gymshark launched 4 new products in the seamless leggings category at $58-68
> - Allbirds dropped prices on 4 running shoe variants by 15-20%, likely a seasonal clearance
> - Fashion Nova added Attentive - their first SMS marketing tool

On the first run, each store produces a `baseline_saved` item confirming how many products and apps are being tracked, and a `run_summary` at the end. No changes are reported.

On subsequent runs where nothing changed, each store produces a `no_changes` item so you can confirm the store was checked even when the output is quiet.

**Collection discovery (when `listCollections: true`):**

```json
{
  "storeDomain": "gymshark.com",
  "handle": "leggings",
  "title": "Leggings",
  "productsCount": 142
}
```

You can download the dataset in JSON, CSV, Excel, or HTML from the **Storage** tab.

***

### Limitations

1. Works only on Shopify stores - not WooCommerce, Magento, or other platforms.
2. App detection identifies apps by their digital footprint on the store homepage. Apps loaded exclusively via server-side rendering or injected after a user interaction may not be detected.
3. The first run for each store saves a baseline only - no changes are reported until the second run.
4. Discontinued products are detected by their absence from the catalog. If a product is temporarily out of stock but not removed, it will not appear as discontinued.
5. Collection filtering requires knowing the exact collection handles in advance. Run with **List available collections** first if you are unsure.
6. Stores that block automated requests entirely will produce a `store_error` entry rather than change data.

***

### Scheduling

Weekly runs are sufficient for most use cases - competitor product launches and meaningful price changes happen on weekly cycles.

**Recommended schedule (every Monday at 8am):**

```
0 8 * * 1
```

**Daily monitoring (if you track fast-moving categories like flash sales):**

```
0 8 * * *
```

Set schedules under **Settings - Schedules** in the Apify Console. The Actor will run automatically and only add new items to your dataset when something changes.

***

### Privacy and ethical use

This Actor accesses publicly available product and pricing data on Shopify storefronts - the same data visible to any shopper. It does not access private accounts, order data, customer information, or anything behind a login.

Use it only for legitimate competitive research. Do not use it to scrape personal data or target stores in ways that violate their terms of service. Rate limiting is built in to avoid placing unnecessary load on monitored stores.

***

### FAQ

**How often should I run it?**
Weekly for most e-commerce use cases - product launches and significant price changes happen on weekly cycles. Daily is supported but rarely necessary.

**What happens on the first run?**
The Actor fetches the full catalog for each store and saves a baseline snapshot. You get a `baseline_saved` confirmation per store but no change events. From the second run onwards, only what changed appears in the dataset.

**Is this the same as a Shopify spy tool?**
It does what PPSPY or Snoopie do, but as a scriptable Actor you can schedule, filter by collection, pipe results to Slack or Notion via webhooks, and query the data via API. You own everything.

**What if a store has too many products?**
When a store has a very large catalog, the results will include a recommendation to use the **Collections to monitor** field or set **Max products per store**. Both options let you monitor the categories you actually care about without fetching tens of thousands of irrelevant products.

**Does this work on any Shopify store?**
Any store on the Shopify platform, including custom domains. If a store blocks data access entirely, a `store_error` row appears in the dataset so you know which ones need attention.

**Found a bug or want to request an app fingerprint?**
Open an issue in the Issues tab. Custom solutions and enterprise monitoring setups are available on request.

# Actor input Schema

## `stores` (type: `array`):

List of Shopify store URLs to monitor (e.g. https://gymshark.com). Add one URL per line.

## `trackProductChanges` (type: `boolean`):

Detect when competitors launch or discontinue products.

## `trackPriceChanges` (type: `boolean`):

Detect when competitors change product prices. Disable if you only care about new and discontinued products - the Actor will use a faster method that only fetches new products, significantly reducing cost on large stores.

## `trackAppStack` (type: `boolean`):

Detect when competitors add or remove apps (Klaviyo, Yotpo, ReCharge, etc.).

## `collections` (type: `array`):

Limit monitoring to specific collection handles (e.g. 'dresses', 'tops', 'leggings'). Recommended for stores with more than 15,000 products — leaving this empty on large stores will be slow and may miss some data. Not sure which handles exist? Enable 'List available collections' first.

## `listCollections` (type: `boolean`):

Instead of monitoring, output all available collection handles for each store. Use this to discover which handles to put in the 'Collections to monitor' field above.

## `maxProductsPerStore` (type: `integer`):

Cap the number of products fetched per store. Useful for controlling costs on large stores like Fashion Nova (25,000+ products). Leave empty to fetch all products.

## Actor input object example

```json
{
  "stores": [
    "https://gymshark.com"
  ],
  "trackProductChanges": true,
  "trackPriceChanges": true,
  "trackAppStack": true,
  "listCollections": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

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

// Run the Actor and wait for it to finish
const run = await client.actor("phantom_coder/shopify-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 = { "stores": ["https://gymshark.com"] }

# Run the Actor and wait for it to finish
run = client.actor("phantom_coder/shopify-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 '{
  "stores": [
    "https://gymshark.com"
  ]
}' |
apify call phantom_coder/shopify-competitor-monitor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Shopify Competitor Monitor & Product Research",
        "description": "Monitor competitor Shopify stores for price changes, new product launches, and app stack updates. Run it on a schedule - you only see what changed, delivered as an AI digest.",
        "version": "0.1",
        "x-build-id": "SEtH4yHqfWhDSdIaA"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/phantom_coder~shopify-competitor-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-phantom_coder-shopify-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/phantom_coder~shopify-competitor-monitor/runs": {
            "post": {
                "operationId": "runs-sync-phantom_coder-shopify-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/phantom_coder~shopify-competitor-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-phantom_coder-shopify-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": [
                    "stores"
                ],
                "properties": {
                    "stores": {
                        "title": "🛍️ Competitor store URLs",
                        "type": "array",
                        "description": "List of Shopify store URLs to monitor (e.g. https://gymshark.com). Add one URL per line.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "trackProductChanges": {
                        "title": "📦 Track new and removed products",
                        "type": "boolean",
                        "description": "Detect when competitors launch or discontinue products.",
                        "default": true
                    },
                    "trackPriceChanges": {
                        "title": "💰 Track price changes",
                        "type": "boolean",
                        "description": "Detect when competitors change product prices. Disable if you only care about new and discontinued products - the Actor will use a faster method that only fetches new products, significantly reducing cost on large stores.",
                        "default": true
                    },
                    "trackAppStack": {
                        "title": "🔧 Track app stack changes",
                        "type": "boolean",
                        "description": "Detect when competitors add or remove apps (Klaviyo, Yotpo, ReCharge, etc.).",
                        "default": true
                    },
                    "collections": {
                        "title": "📂 Collections to monitor (optional)",
                        "type": "array",
                        "description": "Limit monitoring to specific collection handles (e.g. 'dresses', 'tops', 'leggings'). Recommended for stores with more than 15,000 products — leaving this empty on large stores will be slow and may miss some data. Not sure which handles exist? Enable 'List available collections' first.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "listCollections": {
                        "title": "🔍 List available collections",
                        "type": "boolean",
                        "description": "Instead of monitoring, output all available collection handles for each store. Use this to discover which handles to put in the 'Collections to monitor' field above.",
                        "default": false
                    },
                    "maxProductsPerStore": {
                        "title": "⚙️ Max products per store (optional)",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Cap the number of products fetched per store. Useful for controlling costs on large stores like Fashion Nova (25,000+ products). Leave empty to fetch all products."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
