# App Review Triage Monitor — App Store & Google Play Alerts (`dami_studio/app-review-triage-monitor`) Actor

Monitor App Store + Google Play reviews, auto-classify bugs/billing/feature-requests, cluster recurring themes, detect rating drops, and push alerts to Slack/webhook. Pay-per-event.

- **URL**: https://apify.com/dami\_studio/app-review-triage-monitor.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** Lead generation, Automation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.40 / 1,000 review processeds

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

## App Review Triage Monitor — App Store & Google Play Review Alerts

![App Review Triage Monitor](assets/icon.png)

Watch your apps' reviews on the **App Store and Google Play** in one place. Every
new review gets sorted into a bucket (bug, billing, feature request, praise),
flagged for severity, tagged with the version it's about, and grouped into
recurring themes. When a release introduces a crash or a wave of refund
complaints, you get a short summary in Slack or a webhook instead of finding out
days later.

It's built to run on a schedule and remember what it already saw, so it tells
you what changed, not the same 500 reviews every time.

**Use it if** you ship one or more mobile apps and you'd rather get the reviews
that need action pushed to you, already sorted, than log into two separate
consoles and read them yourself.

### What you can count on

- **The reviews are real.** Every review is pulled straight from Apple's public
  App Store review feed and Google Play. Nothing is summarized away or invented.
  You get the original text, rating, author, date, and version.
- **It's exact.** Reviews are deduplicated by their real review ID, so you never
  see the same one twice and never get a phantom one.
- **The triage is deterministic and transparent.** The same review always lands
  in the same bucket. There's no black box and no AI making things up. You can
  read the rule that fired and the keywords behind every classification, and the
  full original text ships with each result so you can check it yourself.

### Optional: bring your own AI key for sharper triage

You don't need this. Read it only if you want the last bit of accuracy.

The Actor works great out of the box with no key and no setup. Its built-in
classifier handles the clear-cut reviews (real crashes, refund complaints,
genuine praise) and that's most of what you act on. It costs nothing extra and
runs the same every time.

If you want, you can drop your own Anthropic API key into the
`anthropicApiKey` field. When you do, only the roughly 1-in-4 reviews that are
genuinely ambiguous (sarcasm, mixed feedback, no obvious keyword) get a second
look for a more accurate call. The other three-quarters are untouched. It's your
key, billed to your own Anthropic account, used only on your runs, and it costs a
tiny fraction of a cent per review. Leave the field blank and nothing changes.

Short version: free and solid by default, a little sharper on the tricky reviews
if you bring a key.

### Why not just use App Store Connect or Google Play Console?

Those are fine for reading reviews one at a time. This exists for three things
they don't do:

1. **One feed across both stores.** Apple and Google are separate consoles with
   no shared view. This merges them so you stop checking two places.
2. **Alerts into your pipeline, not another dashboard.** The consoles give you
   email and an in-app list. This posts a compact, sorted summary to Slack or a
   webhook the moment a run finishes.
3. **Sorting and theme grouping done for you.** Instead of skimming 40 reviews
   to notice they're all about the same crash, you get one line: "5 new reviews
   mention black screen on v9.1.5."

### What it does

- Pulls recent reviews from the App Store and Google Play and normalizes them
  into one format.
- Sorts every new review into `bug_or_crash`, `billing_complaint`,
  `feature_request`, `praise`, or `other`, with a severity flag and the app
  version it's about.
- Groups similar new reviews into themes, with the version they cluster around.
- Flags rating drops against the previous run.
- Only reports what's new or changed since the last run, so you're not re-reading
  old reviews.
- Writes the results to a dataset, a forwardable HTML and Markdown report, and an
  optional Slack/webhook alert.
- Can track competitor apps too, so you can compare what their users are
  complaining about.

### Input

```json
{
  "apps": [
    {
      "label": "My App",
      "appStoreUrl": "https://apps.apple.com/us/app/my-app/id1234567890",
      "playStoreUrl": "https://play.google.com/store/apps/details?id=com.myapp"
    }
  ],
  "competitorApps": [],
  "maxReviewsPerRun": 100,
  "onlyNewSinceLastRun": true,
  "country": "us",
  "detectBugsCrashes": true,
  "detectBillingComplaints": true,
  "detectFeatureRequests": true,
  "detectRatingDrops": true,
  "clusterThemes": true,
  "weeklyReport": true,
  "webhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ"
}
````

Give each app an App Store URL, a Google Play URL, or both. One store is fine;
two get unified. A Slack incoming-webhook URL works directly in `webhookUrl`.

| Field | Type | Default | What it does |
|---|---|---|---|
| `apps` | array | — | The apps to watch (label + App Store and/or Play URL). |
| `competitorApps` | array | `[]` | Competitor apps to compare review themes against. |
| `maxReviewsPerRun` | integer | `100` | How many reviews to pull per app per store, newest first. |
| `onlyNewSinceLastRun` | boolean | `true` | Report only reviews that are new or changed. |
| `country` | string | `"us"` | Two-letter store country (us, gb, de, fr, jp, and so on). |
| `detectBugsCrashes` | boolean | `true` | Flag bug and crash reviews as urgent. |
| `detectBillingComplaints` | boolean | `true` | Flag billing and refund reviews as urgent. |
| `detectFeatureRequests` | boolean | `true` | Count feature requests on their own. |
| `detectRatingDrops` | boolean | `true` | Alert when the rating drops vs the last run. |
| `clusterThemes` | boolean | `true` | Group similar reviews into themes. |
| `weeklyReport` | boolean | `true` | Write an HTML and Markdown report to the run's storage. |
| `webhookUrl` | string | `""` | Post a summary here after each run (Slack works as-is). |

### Output

You get one digest record per app plus one record per new review. Here's a
trimmed digest:

```json
{
  "type": "app_digest",
  "label": "My App",
  "sync_status": "ok",
  "stores": ["app_store", "google_play"],
  "new_count": 23,
  "bucket_counts": {
    "bug_or_crash": 4, "billing_complaint": 2, "feature_request": 5,
    "praise": 9, "other": 3
  },
  "urgent_count": 3,
  "urgent_items": [
    {
      "store": "google_play", "rating": 1, "version": "9.1.5",
      "bucket": "bug_or_crash", "severity": "high",
      "text": "App opens to a black screen and repeats since the update."
    }
  ],
  "clusters": [
    { "theme": "black screen", "mentions": 4, "dominant_version": "9.1.5",
      "summary": "4 new reviews mention 'black screen' (re: v9.1.5)" }
  ],
  "rating_before": 4.61, "rating_after": 4.49, "rating_change": -0.12,
  "rating_drop_alert": true
}
```

Each new review is stored with its full text and its triage attached, and an
HTML/Markdown report lands in the run's key-value store as `REPORT.html` and
`REPORT.md`. The webhook payload is `{ "text": "<Slack-ready summary>",
"summary": { ...full run... } }`.

### Run it on a schedule

This is meant to run on a schedule. That's what turns it into a monitor.

- Daily coverage: a schedule with cron `0 9 * * *` (9am every day).
- Right after a release: run every few hours for the first couple of days
  (`0 */4 * * *`).

Each run only looks at reviews that showed up since the last one, so running it
often stays cheap.

### Who it's for

- **Indie developers** who want a Slack ping when a release breaks something,
  without babysitting two consoles.
- **Small studios** running a handful of apps that want one sorted feed and a
  report to forward after each release.
- **Agencies** watching client apps who need per-app digests and rating-drop
  alerts they can route into client channels.

### Pricing

You pay per event, only for what a run actually does:

| Event | Price | When it happens |
|---|---|---|
| `actor-start` | $0.005 | Once per run |
| `app-checked` | $0.01 | Per app per run |
| `review-processed` | $0.001 | Per new review sorted |
| `ai-triage-generated` | $0.005 | Per app that gets a triage digest |
| `report-generated` | $0.05 | When a report is written |

Because only new reviews are processed, a daily run on a small app costs cents.

### FAQ

**Does it handle both stores?** Yes. Give an app an App Store URL, a Google Play
URL, or both. Two stores get merged into one feed.

**Will it alert me about the same review twice?** No. With `onlyNewSinceLastRun`
on (the default), each run reports only reviews that are new or changed since the
last run.

**Does it need a browser?** No. Apple's review feed is plain JSON over HTTP, and
Google Play is read with a maintained scraper. No headless browser.

**How are rating drops measured?** Against a combined, volume-weighted rating
across both stores, saved from the previous run.

**What happens if one store fails?** Each app is handled on its own. A failure is
reported for that app and the run keeps going.

**Does it fetch developer replies?** Google Play replies are included. Apple's
public review feed doesn't expose them.

### Keywords

App review monitoring, App Store review tracker, Google Play review tracker, app
review alerts, Slack review alerts, review webhook, app review classification, bug
detection from reviews, app rating monitor, app crash reports from reviews,
mobile app feedback monitoring, App Store Connect alternative, Google Play Console
alternative, cross-store review aggregator, post-release review monitoring,
competitor review tracking, indie app developer tools, app review API.

If you're looking for a way to monitor App Store and Google Play reviews and get
them automatically sorted into bugs, billing complaints, and feature requests
with alerts to Slack, this Actor does exactly that. Point it at your app's store
URLs, set it on a daily schedule, and connect a webhook.

# Actor input Schema

## `apps` (type: `array`):

Each app: an optional label plus an App Store URL and/or a Google Play URL. You can monitor one store or both — reviews are unified.

## `competitorApps` (type: `array`):

Same shape as 'apps'. If provided, the run includes a comparison of competitors' new-review theme volume.

## `maxReviewsPerRun` (type: `integer`):

Upper bound on reviews fetched per app per store, most-recent first. The diff means you only pay to triage the NEW ones.

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

Emit and triage only reviews that are new or changed since the last scheduled run (recommended — this is what makes it a monitor, not a dumper).

## `country` (type: `string`):

Two-letter store country code (e.g. us, gb, de, fr, jp). Applies to both stores.

## `detectBugsCrashes` (type: `boolean`):

Surface bug/crash reviews as urgent items (with text + version).

## `detectBillingComplaints` (type: `boolean`):

Surface billing/refund/subscription reviews as urgent items.

## `detectFeatureRequests` (type: `boolean`):

Count feature-request reviews separately.

## `detectRatingDrops` (type: `boolean`):

Alert when an app's blended (cross-store) rating drops vs the last snapshot.

## `clusterThemes` (type: `boolean`):

Group similar new reviews (e.g. '5 new reviews mention login failure after v4.2').

## `weeklyReport` (type: `boolean`):

Write a forwardable HTML + Markdown triage report to the run's key-value store (REPORT.html / REPORT.md).

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

Optional. POST a compact JSON summary here after each run. A Slack incoming-webhook URL works directly (uses the 'text' field).

## `anthropicApiKey` (type: `string`):

Totally optional. The Actor already works great with no key — its built-in classifier sorts every review for free, with zero setup. If you add your own Anthropic key, only the ~1-in-4 ambiguous reviews (sarcasm, mixed feedback, no clear keyword) get a sharper second look for a more accurate call. Your key, billed to your own Anthropic account, private to your runs. Get one at console.anthropic.com. Leave blank to stay 100% free and rules-based.

## `useLLMTriage` (type: `boolean`):

On by default, but it does nothing unless you add your own Anthropic key above. Set to off to force the free built-in classifier even if a key is present.

## Actor input object example

```json
{
  "apps": [
    {
      "label": "My App",
      "appStoreUrl": "https://apps.apple.com/us/app/instagram/id389801252",
      "playStoreUrl": "https://play.google.com/store/apps/details?id=com.instagram.android"
    }
  ],
  "competitorApps": [],
  "maxReviewsPerRun": 100,
  "onlyNewSinceLastRun": true,
  "country": "us",
  "detectBugsCrashes": true,
  "detectBillingComplaints": true,
  "detectFeatureRequests": true,
  "detectRatingDrops": true,
  "clusterThemes": true,
  "weeklyReport": true,
  "webhookUrl": "",
  "useLLMTriage": 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 = {
    "apps": [
        {
            "label": "My App",
            "appStoreUrl": "https://apps.apple.com/us/app/instagram/id389801252",
            "playStoreUrl": "https://play.google.com/store/apps/details?id=com.instagram.android"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/app-review-triage-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 = { "apps": [{
            "label": "My App",
            "appStoreUrl": "https://apps.apple.com/us/app/instagram/id389801252",
            "playStoreUrl": "https://play.google.com/store/apps/details?id=com.instagram.android",
        }] }

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/app-review-triage-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 '{
  "apps": [
    {
      "label": "My App",
      "appStoreUrl": "https://apps.apple.com/us/app/instagram/id389801252",
      "playStoreUrl": "https://play.google.com/store/apps/details?id=com.instagram.android"
    }
  ]
}' |
apify call dami_studio/app-review-triage-monitor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "App Review Triage Monitor — App Store & Google Play Alerts",
        "description": "Monitor App Store + Google Play reviews, auto-classify bugs/billing/feature-requests, cluster recurring themes, detect rating drops, and push alerts to Slack/webhook. Pay-per-event.",
        "version": "0.1",
        "x-build-id": "MuNBvKeUE4hr5lDKU"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/dami_studio~app-review-triage-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-dami_studio-app-review-triage-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~app-review-triage-monitor/runs": {
            "post": {
                "operationId": "runs-sync-dami_studio-app-review-triage-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~app-review-triage-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-dami_studio-app-review-triage-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": [
                    "apps"
                ],
                "properties": {
                    "apps": {
                        "title": "Apps to monitor",
                        "type": "array",
                        "description": "Each app: an optional label plus an App Store URL and/or a Google Play URL. You can monitor one store or both — reviews are unified."
                    },
                    "competitorApps": {
                        "title": "Competitor apps (optional)",
                        "type": "array",
                        "description": "Same shape as 'apps'. If provided, the run includes a comparison of competitors' new-review theme volume.",
                        "default": []
                    },
                    "maxReviewsPerRun": {
                        "title": "Max reviews per app per run",
                        "minimum": 10,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Upper bound on reviews fetched per app per store, most-recent first. The diff means you only pay to triage the NEW ones.",
                        "default": 100
                    },
                    "onlyNewSinceLastRun": {
                        "title": "Only new since last run",
                        "type": "boolean",
                        "description": "Emit and triage only reviews that are new or changed since the last scheduled run (recommended — this is what makes it a monitor, not a dumper).",
                        "default": true
                    },
                    "country": {
                        "title": "Store country",
                        "type": "string",
                        "description": "Two-letter store country code (e.g. us, gb, de, fr, jp). Applies to both stores.",
                        "default": "us"
                    },
                    "detectBugsCrashes": {
                        "title": "Flag bugs & crashes",
                        "type": "boolean",
                        "description": "Surface bug/crash reviews as urgent items (with text + version).",
                        "default": true
                    },
                    "detectBillingComplaints": {
                        "title": "Flag billing complaints",
                        "type": "boolean",
                        "description": "Surface billing/refund/subscription reviews as urgent items.",
                        "default": true
                    },
                    "detectFeatureRequests": {
                        "title": "Flag feature requests",
                        "type": "boolean",
                        "description": "Count feature-request reviews separately.",
                        "default": true
                    },
                    "detectRatingDrops": {
                        "title": "Detect rating drops",
                        "type": "boolean",
                        "description": "Alert when an app's blended (cross-store) rating drops vs the last snapshot.",
                        "default": true
                    },
                    "clusterThemes": {
                        "title": "Cluster recurring themes",
                        "type": "boolean",
                        "description": "Group similar new reviews (e.g. '5 new reviews mention login failure after v4.2').",
                        "default": true
                    },
                    "weeklyReport": {
                        "title": "Generate report artifact",
                        "type": "boolean",
                        "description": "Write a forwardable HTML + Markdown triage report to the run's key-value store (REPORT.html / REPORT.md).",
                        "default": true
                    },
                    "webhookUrl": {
                        "title": "Webhook / Slack URL",
                        "type": "string",
                        "description": "Optional. POST a compact JSON summary here after each run. A Slack incoming-webhook URL works directly (uses the 'text' field).",
                        "default": ""
                    },
                    "anthropicApiKey": {
                        "title": "Your Anthropic API key (optional accuracy boost)",
                        "type": "string",
                        "description": "Totally optional. The Actor already works great with no key — its built-in classifier sorts every review for free, with zero setup. If you add your own Anthropic key, only the ~1-in-4 ambiguous reviews (sarcasm, mixed feedback, no clear keyword) get a sharper second look for a more accurate call. Your key, billed to your own Anthropic account, private to your runs. Get one at console.anthropic.com. Leave blank to stay 100% free and rules-based."
                    },
                    "useLLMTriage": {
                        "title": "Enable the AI boost when a key is present",
                        "type": "boolean",
                        "description": "On by default, but it does nothing unless you add your own Anthropic key above. Set to off to force the free built-in classifier even if a key is present.",
                        "default": 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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
