# Hacker News Scraper (`crawlerbros/hackernews-scraper`) Actor

Scrape Hacker News stories, comments, jobs, and user profiles. Modes: top/new/best/ask/show/jobs/past/item/user/search. Filters: minScore, domainFilter, dateRange, commentMinScore. No proxy, no auth.

- **URL**: https://apify.com/crawlerbros/hackernews-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** News, Developer tools, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 7 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.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.
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

## Hacker News Scraper

Scrape Hacker News stories, comments, jobs, and user profiles via the official Firebase + Algolia public APIs. No login, no cookies, no proxy. Modes for top / new / best / Ask HN / Show HN / Jobs / Past — plus direct item lookup, user profile fetch, and Algolia full-text search.

### What this actor does

- Walks the public Hacker News feeds (top, new, best, ask, show, jobs)
- Fetches individual stories or comment threads by ID
- Pulls user profiles (karma, account age, submitted item count)
- Runs full-text search across HN history via the Algolia HN API
- Builds nested comment trees on demand (`enableCommentHierarchy=true`) or emits flat comment rows otherwise

### Modes

| Mode | What it does |
|---|---|
| `topStories` | Front-page top stories |
| `newStories` | Newest submissions |
| `bestStories` | Best-of recent submissions |
| `askStories` | Ask HN posts |
| `showStories` | Show HN posts |
| `jobStories` | YC company job ads |
| `item` | Direct lookup of specific item IDs |
| `user` | Direct lookup of user profiles |
| `search` | Algolia full-text search across all HN history |

### Output per story

- `id`, `hnUrl`, `type`, `title`
- `url`, `domain` (parsed host)
- `score`, `numComments`, `author`
- `createdAt` (ISO-8601 UTC), `createdAtEpoch`, `ageHours`
- `text` (Ask/Show/Job posts only — HN-flavored markdown converted to plain text)
- `kids` (list of top-level comment IDs)
- `comments[]` (nested replies — only when `enableCommentHierarchy=true`)
- `dead` / `deleted` (boolean — only when true)
- `recordType: "story"`, `scrapedAt`

### Output per comment

- `id`, `hnUrl`, `storyId`, `parentId`, `depth`
- `author`, `text` (HTML → plain text)
- `createdAt`, `createdAtEpoch`, `ageHours`
- `kids` (list of reply IDs), `replies[]` (nested — only when `enableCommentHierarchy=true`)
- `recordType: "comment"`, `scrapedAt`

### Output per user

- `id`, `profileUrl`
- `karma`, `createdAt`, `createdAtEpoch`, `about`
- `submittedCount`, `submitted` (capped at 50 most-recent)
- `recordType: "user"`, `scrapedAt`

Empty fields are omitted from the output (no nulls).

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | enum | `topStories` | `topStories` / `newStories` / `bestStories` / `askStories` / `showStories` / `jobStories` / `item` / `user` / `search` |
| `itemIds` | array | `[]` | When `mode=item`: numeric HN item IDs |
| `usernames` | array | `[]` | When `mode=user`: HN usernames |
| `searchQuery` | string | – | When `mode=search`: full-text query |
| `startUrls` | array | `[]` | HN URLs (`item?id=N` or `user?id=USER`) — auto-routed to itemIds / usernames |
| `enableCommentHierarchy` | boolean | `false` | When true, attach a nested `comments[]` array to each story instead of emitting flat sibling rows |
| `maxItems` | int | `100` | Hard cap on emitted records (1–5000) |
| `maxComments` | int | `0` | Cap comments fetched per story. 0 = skip comments. |
| `maxDepth` | int | `5` | Maximum reply depth when `maxComments > 0`. |
| `minScore` | int | – | Drop stories below this score |
| `domainAllowlist` | array | `[]` | Only emit stories whose URL host contains one of these substrings |
| `domainBlocklist` | array | `[]` | Drop stories whose URL host contains one of these substrings |
| `excludeDeadOrDeleted` | bool | `true` | Drop items flagged dead/deleted by HN |
| `dateRangeFrom` | string | – | Drop items posted before this ISO-date (UTC) |
| `dateRangeTo` | string | – | Drop items posted after this ISO-date (UTC) |
| `commentMinScore` | int | – | Drop comments below this score |
| `commentAuthorFilter` | array | `[]` | Only emit comments by these usernames |
| `minCommentCount` | int | – | Drop stories with fewer than this many comments |

#### Example: top stories with filters

```json
{
  "mode": "topStories",
  "maxItems": 50,
  "minScore": 100,
  "domainBlocklist": ["twitter.com", "x.com"],
  "excludeDeadOrDeleted": true
}
````

#### Example: full-text search

```json
{
  "mode": "search",
  "searchQuery": "rust async runtime",
  "maxItems": 100,
  "minScore": 50
}
```

#### Example: story with comment tree

```json
{
  "mode": "item",
  "itemIds": ["12345678"],
  "maxComments": 200,
  "maxDepth": 3,
  "enableCommentHierarchy": true
}
```

### Use cases

- **Trend monitoring** — track which domains hit the front page each week
- **Comment intelligence** — pull every comment for an Ask HN thread to study reactions
- **YC job-ads digest** — weekly extract of `jobStories` for the careers newsletter
- **User research** — fetch a user's submission history + karma stats for outreach
- **Search-driven enrichment** — feed Algolia search results into a downstream tagger

### FAQ

**Does it require a login or cookies?**  No. Both Firebase and Algolia HN APIs are fully public.

**Is a proxy needed?**  No. The actor works from datacenter IPs without any proxy.

**Why are some stories missing a `url`?**  Ask HN / Show HN posts are self-text — they have a `text` field instead of a `url`. The omit-empty contract drops the `url` field on these.

**Why does `commentMinScore` not filter much?**  Hacker News rarely exposes per-comment scores. When the field is missing the comment is kept.

**What's the difference between `maxItems` and `maxComments`?**  `maxItems` caps the total emitted records (stories + comments + users combined). `maxComments` caps how deep the actor goes into each story's comment tree per story.

**How fresh is the data?**  Real-time. Both APIs serve the live HN database.

# Actor input Schema

## `mode` (type: `string`):

What to scrape. `topStories` / `newStories` / `bestStories` / `askStories` / `showStories` / `jobStories` walk the public feeds. `item` fetches specific item IDs (`itemIds`). `user` fetches profiles (`usernames`). `search` uses the Algolia HN API (`searchQuery`).

## `itemIds` (type: `array`):

Direct Hacker News item IDs (numeric strings or integers). Used when mode=`item`.

## `usernames` (type: `array`):

Hacker News usernames. Used when mode=`user`.

## `searchQuery` (type: `string`):

Free-text query passed to the Algolia HN search API.

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

Hacker News URLs to scrape directly. Supports `news.ycombinator.com/item?id=N` and `news.ycombinator.com/user?id=USER`. Each URL is converted to an item or user fetch.

## `enableCommentHierarchy` (type: `boolean`):

When true, attach a nested `comments[]` array to each story (recursive replies). When false, comments are emitted as flat sibling records (one per row, with `parentId` and `depth`).

## `maxItems` (type: `integer`):

Hard cap on emitted records (stories + comments + users combined).

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

Cap on comments fetched per story. 0 = no comments. Default 0 (skip comments).

## `maxDepth` (type: `integer`):

Maximum reply depth when fetching comments (only applies when `maxComments` > 0). Root comments are depth 0.

## `minScore` (type: `integer`):

Drop stories with fewer points than this. Comments are unaffected.

## `domainAllowlist` (type: `array`):

Only emit stories whose URL host contains one of these substrings (case-insensitive). e.g. \['github.com','arxiv.org'].

## `domainBlocklist` (type: `array`):

Drop stories whose URL host contains one of these substrings. e.g. \['twitter.com','x.com'].

## `excludeDeadOrDeleted` (type: `boolean`):

Drop items flagged `dead: true` or `deleted: true` by Hacker News.

## `dateRangeFrom` (type: `string`):

Drop items posted before this date (UTC). Empty = no lower bound.

## `dateRangeTo` (type: `string`):

Drop items posted after this date (UTC). Empty = no upper bound.

## `commentMinScore` (type: `integer`):

Drop comments below this score. (Note: HN exposes comment scores only sporadically; comments without a score are kept.)

## `commentAuthorFilter` (type: `array`):

Only emit comments authored by one of these usernames (case-insensitive substring match).

## `minCommentCount` (type: `integer`):

Drop stories with fewer than this many comments.

## Actor input object example

```json
{
  "mode": "topStories",
  "itemIds": [],
  "usernames": [],
  "startUrls": [],
  "enableCommentHierarchy": false,
  "maxItems": 100,
  "maxComments": 0,
  "maxDepth": 5,
  "domainAllowlist": [],
  "domainBlocklist": [],
  "excludeDeadOrDeleted": true,
  "commentAuthorFilter": []
}
```

# 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 = {
    "mode": "topStories",
    "itemIds": [],
    "usernames": [],
    "startUrls": [],
    "enableCommentHierarchy": false,
    "maxItems": 100,
    "maxComments": 0,
    "maxDepth": 5,
    "domainAllowlist": [],
    "domainBlocklist": [],
    "excludeDeadOrDeleted": true,
    "commentAuthorFilter": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/hackernews-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 = {
    "mode": "topStories",
    "itemIds": [],
    "usernames": [],
    "startUrls": [],
    "enableCommentHierarchy": False,
    "maxItems": 100,
    "maxComments": 0,
    "maxDepth": 5,
    "domainAllowlist": [],
    "domainBlocklist": [],
    "excludeDeadOrDeleted": True,
    "commentAuthorFilter": [],
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/hackernews-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 '{
  "mode": "topStories",
  "itemIds": [],
  "usernames": [],
  "startUrls": [],
  "enableCommentHierarchy": false,
  "maxItems": 100,
  "maxComments": 0,
  "maxDepth": 5,
  "domainAllowlist": [],
  "domainBlocklist": [],
  "excludeDeadOrDeleted": true,
  "commentAuthorFilter": []
}' |
apify call crawlerbros/hackernews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Hacker News Scraper",
        "description": "Scrape Hacker News stories, comments, jobs, and user profiles. Modes: top/new/best/ask/show/jobs/past/item/user/search. Filters: minScore, domainFilter, dateRange, commentMinScore. No proxy, no auth.",
        "version": "1.0",
        "x-build-id": "RkbQDT2Z3x4b78DTO"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crawlerbros~hackernews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crawlerbros-hackernews-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/crawlerbros~hackernews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crawlerbros-hackernews-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/crawlerbros~hackernews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crawlerbros-hackernews-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",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "topStories",
                            "newStories",
                            "bestStories",
                            "askStories",
                            "showStories",
                            "jobStories",
                            "item",
                            "user",
                            "search"
                        ],
                        "type": "string",
                        "description": "What to scrape. `topStories` / `newStories` / `bestStories` / `askStories` / `showStories` / `jobStories` walk the public feeds. `item` fetches specific item IDs (`itemIds`). `user` fetches profiles (`usernames`). `search` uses the Algolia HN API (`searchQuery`).",
                        "default": "topStories"
                    },
                    "itemIds": {
                        "title": "Item IDs (mode=item)",
                        "type": "array",
                        "description": "Direct Hacker News item IDs (numeric strings or integers). Used when mode=`item`.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "usernames": {
                        "title": "Usernames (mode=user)",
                        "type": "array",
                        "description": "Hacker News usernames. Used when mode=`user`.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchQuery": {
                        "title": "Search query (mode=search)",
                        "type": "string",
                        "description": "Free-text query passed to the Algolia HN search API."
                    },
                    "startUrls": {
                        "title": "Start URLs (optional)",
                        "type": "array",
                        "description": "Hacker News URLs to scrape directly. Supports `news.ycombinator.com/item?id=N` and `news.ycombinator.com/user?id=USER`. Each URL is converted to an item or user fetch.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "enableCommentHierarchy": {
                        "title": "Build comment tree",
                        "type": "boolean",
                        "description": "When true, attach a nested `comments[]` array to each story (recursive replies). When false, comments are emitted as flat sibling records (one per row, with `parentId` and `depth`).",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Hard cap on emitted records (stories + comments + users combined).",
                        "default": 100
                    },
                    "maxComments": {
                        "title": "Max comments per story",
                        "minimum": 0,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Cap on comments fetched per story. 0 = no comments. Default 0 (skip comments).",
                        "default": 0
                    },
                    "maxDepth": {
                        "title": "Max comment depth",
                        "minimum": 0,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum reply depth when fetching comments (only applies when `maxComments` > 0). Root comments are depth 0.",
                        "default": 5
                    },
                    "minScore": {
                        "title": "Min story score",
                        "minimum": 0,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Drop stories with fewer points than this. Comments are unaffected."
                    },
                    "domainAllowlist": {
                        "title": "Domain allowlist",
                        "type": "array",
                        "description": "Only emit stories whose URL host contains one of these substrings (case-insensitive). e.g. ['github.com','arxiv.org'].",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "domainBlocklist": {
                        "title": "Domain blocklist",
                        "type": "array",
                        "description": "Drop stories whose URL host contains one of these substrings. e.g. ['twitter.com','x.com'].",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "excludeDeadOrDeleted": {
                        "title": "Exclude dead/deleted",
                        "type": "boolean",
                        "description": "Drop items flagged `dead: true` or `deleted: true` by Hacker News.",
                        "default": true
                    },
                    "dateRangeFrom": {
                        "title": "Date range from (ISO YYYY-MM-DD)",
                        "type": "string",
                        "description": "Drop items posted before this date (UTC). Empty = no lower bound."
                    },
                    "dateRangeTo": {
                        "title": "Date range to (ISO YYYY-MM-DD)",
                        "type": "string",
                        "description": "Drop items posted after this date (UTC). Empty = no upper bound."
                    },
                    "commentMinScore": {
                        "title": "Min comment score",
                        "minimum": 0,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Drop comments below this score. (Note: HN exposes comment scores only sporadically; comments without a score are kept.)"
                    },
                    "commentAuthorFilter": {
                        "title": "Comment author allowlist",
                        "type": "array",
                        "description": "Only emit comments authored by one of these usernames (case-insensitive substring match).",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "minCommentCount": {
                        "title": "Min number of comments",
                        "minimum": 0,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Drop stories with fewer than this many comments."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
