# TikTok Comments Scraper (`outspoken_strategy/tiktok-comments-scraper`) Actor

Scrape the comments of one or MANY TikTok videos in a single run. Returns text, author, likes, thread structure (parent/reply) and the source video itself. No login, no cookies — uses a real browser so TikTok signs its own API requests.

- **URL**: https://apify.com/outspoken\_strategy/tiktok-comments-scraper.md
- **Developed by:** [code craker](https://apify.com/outspoken_strategy) (community)
- **Categories:** Social media, News, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $30.00 / 1,000 results

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

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## TikTok Comments Scraper

Apify actor that scrapes the comments of one or **many** TikTok videos in a single
run and exports them as structured data.

This actor drives a real Chrome (Playwright) so TikTok's own JavaScript signs its
API requests, then intercepts the `/api/comment/list/` (and
`/api/comment/list/reply/`) responses — the same browser-interception pattern as the
Reddit and YouTube comment scrapers.

### ⚠️ A logged-in session is required

Unlike TikTok's public hashtag/search feeds (which our
`tiktok-post-search-scraper` reads logged-out), **the comment endpoint is
auth-gated.** For a logged-out guest, TikTok answers `/api/comment/list/` with an
empty `HTTP 200` body **no matter how clean the exit IP is** — verified across many
fresh residential IPs. The video's comment panel then silently falls back to the
"You may like" tab and no comments load. This is the same gating we found on
Facebook comments.

So provide a **logged-in TikTok session** via the `cookies` input (export it with a
"Get cookies.txt" / EditThisCookie-style browser extension while signed in to
tiktok.com). With a session the comment API returns real data; without one, a run
still succeeds but collects only the source video(s) and **0 comments**, logging a
clear warning. For a fully hands-off option, use a vendor
(`clockworks/tiktok-comments-scraper`) that maintains accounts server-side, and keep
this actor as the session-backed fallback (see Integration below).

### Features

- **Batched**: pass many video URLs and they are all scraped in ONE run
  (`maxComments` applies per video). Results are pushed after each video, so an abort
  keeps everything collected so far.
- Any video reference works: `tiktok.com/@user/video/<id>`, photo posts, or a bare
  numeric video id. (Short `vm.tiktok.com` links are not supported — use the full URL.)
- Replies included with thread structure (`parentCommentId` + `replyLevel`), or
  top-level comments only (`includeReplies: false`).
- The source video is emitted too (flagged `is_source_post: true`) with caption,
  author and engagement counts; disable with `includeSourcePost: false`.
- Anti-detection built in: stealth fingerprint, residential-proxy preflight, and
  relaunch on a fresh IP with a per-video retry when TikTok serves a captcha / empty
  responses.

### Input

```json
{
    "urls": [
        "https://www.tiktok.com/@nasa/video/7401234567890123456",
        "https://www.tiktok.com/@bbc/video/7409999999999999999"
    ],
    "maxComments": 100,
    "includeReplies": true,
    "includeSourcePost": true,
    "region": "US",
    "cookies": [ { "name": "sessionid", "value": "…", "domain": ".tiktok.com", "path": "/" } ],
    "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" }
}
````

`cookies` accepts the exported cookie array (objects with `name`/`value`/`domain`)
or a raw `name=value; name2=value2` Cookie-header string. It is optional but
strongly recommended — see the session note above.

`startUrls` (`[{ "url": ... }]`) is accepted as an alternative to `urls`.
`resultsLimit` and `maxReplies` are accepted as aliases for `maxComments`.

### Output

One dataset item per comment. Every item carries `videoId` / `aweme_id` /
`videoWebUrl` / `postUrl` / `postId` / `inputUrl`, so comments from a multi-video run
are always attributable to their source video.

```json
{
    "id": "7500000000000000001",
    "cid": "7500000000000000001",
    "text": "First! love this",
    "createTimeISO": "2026-07-01T09:30:12.000Z",
    "diggCount": 152,   "likesCount": 152,
    "replyCommentTotal": 3, "repliesCount": 3,
    "uniqueId": "fan1",
    "author": {
        "name": "Fan One", "username": "fan1", "id": "111",
        "profileUrl": "https://www.tiktok.com/@fan1", "avatar": "https://a/av.jpg"
    },
    "videoId": "7401234567890123456",
    "aweme_id": "7401234567890123456",
    "videoWebUrl": "https://www.tiktok.com/@nasa/video/7401234567890123456",
    "parentCommentId": null,
    "repliesToId": null,
    "replyLevel": 0,
    "isReply": false,
    "postId": "7401234567890123456",
    "inputUrl": "https://www.tiktok.com/@nasa/video/7401234567890123456",
    "is_source_post": false
}
```

- `parentCommentId` is `null` for a top-level comment; otherwise the id of the
  comment it replies to. TikTok reply ids point at the parent (nested replies point
  at the reply they answer).
- `createTimeISO` is exact — TikTok exposes real comment timestamps.

### Integration (scraping-tool)

Drop-in for the existing TikTok comment path — the output matches the
`clockworks/tiktok-comments-scraper` shape that `saveCommentsWithPostLink()` and
`_matchCommentToPost()` already read (`cid`, `text`, `createTimeISO`, `diggCount`,
`replyCommentTotal`, `uniqueId`, `videoWebUrl`, `aweme_id`, `repliesToId`).

Because the comment endpoint is auth-gated (see the session note above), make the
**vendor the primary** (it maintains accounts server-side, so it needs no session
from us) and use **this actor as the session-backed fallback** — the same
arrangement as the Facebook comment path. When you have a maintained TikTok session
in the store, pass it as `cookies`.

```js
// ACTOR_FALLBACKS in scrapingService.js — vendor primary, ours as the fallback
'clockworks/tiktok-comments-scraper': 'outspoken_strategy/tiktok-comments-scraper',
```

```js
// scrapingService.scrapeCommentsBatch — tiktok branch
} else if (actor === 'outspoken_strategy/tiktok-comments-scraper') {
    delete input.startUrls;
    input.urls = urls;
    input.maxComments = cappedComments(input.maxComments ?? resultsLimit);
    input.includeSourcePost = input.includeSourcePost ?? false;
    input.includeReplies = input.includeReplies ?? false; // match FB: top-level only
    input.cookies = input.cookies ?? getTikTokSessionCookies(); // required: comment API is auth-gated
    input.proxyConfiguration = input.proxyConfiguration ?? { useApifyProxy: true, apifyProxyGroups: ['RESIDENTIAL'], apifyProxyCountry: 'US' };
}
```

`_postMatchKey('tiktok', videoWebUrl)` extracts the id via `/\/video\/(\d+)/`, and
every comment also carries `videoId`/`aweme_id` — so attribution works unchanged.

### Local development

```bash
npm install
echo '{ "urls": ["https://www.tiktok.com/@tiktok/video/7106594312292453675"], "maxComments": 30, "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "US" } }' > storage/key_value_stores/default/INPUT.json
npm start
```

TikTok flags IPs that make many requests, so local runs from a home IP may be served
empty responses — the actor is designed to run on Apify residential proxies. Deploy
with `apify push`. Remember that without a `cookies` session the comment API returns
empty bodies (see the session note at the top), so a cookie-less run will collect
only the source video(s).

# Actor input Schema

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

URLs of the TikTok videos whose comments you want to scrape — one or MANY videos per run. Use full video URLs like https://www.tiktok.com/@user/video/7401234567890123456 (photo posts and a bare numeric video id also work). Short links (vm.tiktok.com/...) are not supported. De-duplicated by video.

## `startUrls` (type: `array`):

Alternative way to provide the video URLs as a request list of { "url": ... } objects. Merged with "urls" and de-duplicated by video.

## `maxComments` (type: `integer`):

Maximum number of comments to fetch PER video (replies count towards this limit). The source video itself is also emitted (flagged is\_source\_post) and does not count.

## `includeReplies` (type: `boolean`):

Also fetch replies to comments (with parentCommentId/replyLevel set) by expanding the "View more replies" links. Top-level comments are collected first; replies fill the remaining maxComments budget. Uncheck to keep only top-level comments.

## `includeSourcePost` (type: `boolean`):

Also emit one dataset item for the video itself (flagged is\_source\_post: true) with its caption, author and engagement counts. Uncheck to get comments only.

## `region` (type: `string`):

Two-letter country code for the proxy exit region (e.g. US, GB, ZW). Keep it stable.

## `cookies` (type: `array`):

A logged-in TikTok session (export with a Get cookies.txt / EditThisCookie style extension while signed in to tiktok.com). REQUIRED for reliable results: TikTok gates its comment API for logged-out guests and returns empty responses regardless of the proxy IP, so without a session most runs collect 0 comments. Provide the exported cookie array (objects with name/value/domain).

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

Proxy to route traffic through. Residential proxies with a country set are strongly required — TikTok blocks datacenter IPs and serves empty API responses / captcha to flagged exits, so the actor preflights IPs and retries on fresh ones.

## `headless` (type: `boolean`):

Uncheck to run a headed browser (useful only for local debugging).

## Actor input object example

```json
{
  "urls": [
    "https://www.tiktok.com/@tiktok/video/7106594312292453675"
  ],
  "startUrls": [],
  "maxComments": 100,
  "includeReplies": true,
  "includeSourcePost": true,
  "region": "US",
  "cookies": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "headless": true
}
```

# 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://www.tiktok.com/@tiktok/video/7106594312292453675"
    ],
    "startUrls": [],
    "cookies": [],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("outspoken_strategy/tiktok-comments-scraper").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://www.tiktok.com/@tiktok/video/7106594312292453675"],
    "startUrls": [],
    "cookies": [],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("outspoken_strategy/tiktok-comments-scraper").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://www.tiktok.com/@tiktok/video/7106594312292453675"
  ],
  "startUrls": [],
  "cookies": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call outspoken_strategy/tiktok-comments-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=outspoken_strategy/tiktok-comments-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "TikTok Comments Scraper",
        "description": "Scrape the comments of one or MANY TikTok videos in a single run. Returns text, author, likes, thread structure (parent/reply) and the source video itself. No login, no cookies — uses a real browser so TikTok signs its own API requests.",
        "version": "0.0",
        "x-build-id": "CjHUB5UyW0ZDEroj0"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/outspoken_strategy~tiktok-comments-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-outspoken_strategy-tiktok-comments-scraper",
                "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/outspoken_strategy~tiktok-comments-scraper/runs": {
            "post": {
                "operationId": "runs-sync-outspoken_strategy-tiktok-comments-scraper",
                "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/outspoken_strategy~tiktok-comments-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-outspoken_strategy-tiktok-comments-scraper",
                "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",
                "properties": {
                    "urls": {
                        "title": "Video URLs",
                        "type": "array",
                        "description": "URLs of the TikTok videos whose comments you want to scrape — one or MANY videos per run. Use full video URLs like https://www.tiktok.com/@user/video/7401234567890123456 (photo posts and a bare numeric video id also work). Short links (vm.tiktok.com/...) are not supported. De-duplicated by video.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Video URLs (request list)",
                        "type": "array",
                        "description": "Alternative way to provide the video URLs as a request list of { \"url\": ... } objects. Merged with \"urls\" and de-duplicated by video.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxComments": {
                        "title": "Max comments per video",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of comments to fetch PER video (replies count towards this limit). The source video itself is also emitted (flagged is_source_post) and does not count.",
                        "default": 100
                    },
                    "includeReplies": {
                        "title": "Include replies",
                        "type": "boolean",
                        "description": "Also fetch replies to comments (with parentCommentId/replyLevel set) by expanding the \"View more replies\" links. Top-level comments are collected first; replies fill the remaining maxComments budget. Uncheck to keep only top-level comments.",
                        "default": true
                    },
                    "includeSourcePost": {
                        "title": "Include the source video",
                        "type": "boolean",
                        "description": "Also emit one dataset item for the video itself (flagged is_source_post: true) with its caption, author and engagement counts. Uncheck to get comments only.",
                        "default": true
                    },
                    "region": {
                        "title": "Region",
                        "type": "string",
                        "description": "Two-letter country code for the proxy exit region (e.g. US, GB, ZW). Keep it stable.",
                        "default": "US"
                    },
                    "cookies": {
                        "title": "TikTok session cookies",
                        "type": "array",
                        "description": "A logged-in TikTok session (export with a Get cookies.txt / EditThisCookie style extension while signed in to tiktok.com). REQUIRED for reliable results: TikTok gates its comment API for logged-out guests and returns empty responses regardless of the proxy IP, so without a session most runs collect 0 comments. Provide the exported cookie array (objects with name/value/domain)."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy to route traffic through. Residential proxies with a country set are strongly required — TikTok blocks datacenter IPs and serves empty API responses / captcha to flagged exits, so the actor preflights IPs and retries on fresh ones.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "US"
                        }
                    },
                    "headless": {
                        "title": "Run browser headless",
                        "type": "boolean",
                        "description": "Uncheck to run a headed browser (useful only for local debugging).",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
