# Greenhouse Jobs Scraper (`memo23/greenhouse-jobs-scraper`) Actor

Every job from any Greenhouse board in one run. Paste a boards.greenhouse.io URL or company token → title, requisition ID, full HTML description, location, departments, offices, salary, apply URL. No login, no limits, one flat row per job. Thousands of companies supported.

- **URL**: https://apify.com/memo23/greenhouse-jobs-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Jobs, Automation, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.79 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Greenhouse Jobs Scraper — Any Company

Scrape job postings from **any company's Greenhouse board** — give a board token (e.g. `stripe`) or a `boards.greenhouse.io` URL and get clean structured rows: title, requisition ID, full HTML description, location, departments, offices, salary band (when published), employer, first-published + updated dates, application deadline, language, and the apply URL. One flat row per job.

![How the Greenhouse Jobs Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-greenhouse.png)

### Why this actor

Greenhouse is one of the most widely-used ATSs — **thousands of companies** run their careers page on it (Stripe, Airbnb, Databricks, Figma, GitLab, Robinhood, and many more). This actor turns any of those boards into structured data:

- **Any board, zero per-company code** — paste a board token or URL; if the company is on Greenhouse, it works.
- **Greenhouse's own public board API** — no HTML scraping, no anti-bot, no auth. The whole board (all jobs, full HTML descriptions) comes back in a **single request** — no pagination, no per-job detail fetch.
- **Full job content** — the complete HTML job description, decoded from the API's entity-escaped form into clean markup.
- **Structured org data** — departments and offices per job, plus company name, requisition ID, and the internal job ID.
- **Salary band (USD / GBP / EUR)** — regex-parsed from the description for boards subject to pay-transparency rules (US states, EU).
- **Optional application-form questions** — flip `includeQuestions` on to also pull each job's application questions (and compliance / demographic / location questions).
- **Mixed input** — multiple board tokens, board URLs (`boards.greenhouse.io/{token}`, `job-boards.greenhouse.io/{token}`, embed `?for={token}`), or a direct `/jobs/{id}` URL for a single posting.

### Use cases

- **Talent / competitive intelligence** — track which roles a company is hiring for, where, and in which departments; diff over time to spot ramp-ups or freezes.
- **Recruitment market data** — aggregate openings across many Greenhouse companies into one structured feed.
- **Comp benchmarking** — collect published salary bands by role and location (US/EU transparency).
- **Sales prospecting (HR-tech / staffing)** — find companies hiring in your target functions + geographies.
- **Job-board / aggregator ingestion** — clean rows for downstream pipelines without per-company scrapers.

### Input

| Field | Type | Required | Notes |
|---|---|---|---|
| `boardTokens` | `string[]` | one of these* | Board tokens — the company id in `boards.greenhouse.io/{token}`. E.g. `stripe`, `databricks`, `figma`. |
| `startUrls` | `string[]` | one of these* | Board URLs (`boards.greenhouse.io/stripe`, `job-boards.greenhouse.io/stripe`), embed URLs (`...?for=stripe`), or a direct job URL (`.../jobs/{id}`). Token auto-extracted. |
| `includeQuestions` | `boolean` | no | Also fetch each job's application-form questions (1 extra API call per job). Default `false`. |
| `maxItems` | `integer` | no | Max job rows **per board**. 3 boards × `maxItems: 200` → up to 600 rows. Each row = one paid dataset item. Default `1000`. Free-tier users capped at 100 total. |
| `maxConcurrency` | `integer` | no | Parallel API calls (matters mainly with `includeQuestions`). Default `8`. |
| `maxRequestRetries` | `integer` | no | Per-request retry budget. Default `5`. |
| `proxy` | object | no | Apify Residential (any country) recommended; direct/datacenter also work. |

\* Provide at least one of `boardTokens` or `startUrls`.

#### Example input

```json
{
  "boardTokens": ["stripe", "figma"],
  "startUrls": ["https://boards.greenhouse.io/databricks"],
  "maxItems": 500,
  "includeQuestions": false,
  "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
````

### How it works

1. **Resolve boards** — your `boardTokens` + any tokens extracted from `startUrls` become the board set; a `/jobs/{id}` URL targets one posting.
2. **One call per board** — `GET /v1/boards/{token}/jobs?content=true` returns every job with full content. No pagination.
3. **Map + dedupe + emit** — each job → flat row; HTML entities decoded; salary regex-parsed; deduped by (board, jobId); pushed to the dataset.
4. **Optional enrichment** — with `includeQuestions`, each job also gets a `/jobs/{id}?questions=true` call for its application-form fields.

### Output schema

Every row has `rowType: "job"`. Real sample (Figma board):

```jsonc
{
  "rowType": "job",
  "jobId": "5822886004",
  "internalJobId": "5061458004",
  "requisitionId": "2178",
  "boardToken": "figma",
  "company": "Figma",

  "title": "Account Executive, Enterprise",
  "location": "San Francisco, CA",
  "departments": ["Sales"],
  "offices": ["San Francisco, CA"],

  "description": "<div class=\"content-intro\"><p>Figma is growing…</p></div>",  // decoded HTML

  "salary": {                                  // regex-parsed; null when none published
    "rawText": "$165,000 - $231,000 USD",
    "min": 165000, "max": 231000, "currency": "USD", "period": null
  },

  "firstPublished": "2026-04-17T12:21:54-04:00",
  "updatedAt": "2026-04-17T12:25:57-04:00",
  "applicationDeadline": null,
  "language": "en",

  "jobUrl":   "https://boards.greenhouse.io/figma/jobs/5822886004",
  "applyUrl": "https://boards.greenhouse.io/figma/jobs/5822886004",
  "applyType": "internal",                     // "internal" = greenhouse-hosted; "external" = company's own careers domain

  "metadata": null,                            // board custom fields, when present
  "questionCount": null,                       // number of application questions (when includeQuestions=true)
  "scrapedAt": "2026-06-02T…Z"
}
```

### Key output fields

| Field | Meaning |
|---|---|
| `jobId` / `internalJobId` / `requisitionId` | Greenhouse public id / internal id / the company's own req number. |
| `boardToken` / `company` | The board it came from + the employer name. |
| `departments` / `offices` | Greenhouse's structured org tags for the role. |
| `description` | Full job description as clean HTML (entities decoded). |
| `salary` | Regex-parsed band (min/max/currency/period); `null` when the board doesn't publish pay. |
| `applyUrl` / `applyType` | The job/apply URL; `internal` = hosted on greenhouse.io, `external` = redirects to the company's own site. |
| `questionCount` | Application-form question count (only when `includeQuestions` is on). |

### FAQ

**What's a "board token"?**
It's the company identifier in the board URL — `boards.greenhouse.io/{token}` (e.g. `stripe`). You can paste the token directly, the full board URL, the `job-boards.greenhouse.io` form, an embed `?for={token}` URL, or a direct `/jobs/{id}` link — the token is extracted automatically.

**How do I find a company's token?**
Open the company's careers page; if jobs link to `boards.greenhouse.io/{something}` or `job-boards.greenhouse.io/{something}`, that `{something}` is the token. Many company career sites embed Greenhouse and show `?for={token}` in the board URL.

**Does it get the full description?**
Yes — the board API's `content=true` mode returns the complete HTML description for every job in one call. We decode the entity-escaped HTML so `description` is clean markup.

**Why is `salary` sometimes null?**
Greenhouse itself doesn't have a structured salary field on the public board API — pay appears in the description text only for boards subject to transparency laws (US states like CA/CO/NY/WA, EU). We regex-parse it when present; otherwise `salary` is `null`. We never synthesize.

**What does `includeQuestions` add?**
A per-job call to `/jobs/{id}?questions=true`, which returns the application-form questions plus compliance / demographic / location questions. It's off by default because it adds one HTTP call per job; turn it on if you need the application schema.

**What does each dataset-item charge cover?**
One job row with all fields. `maxItems` is per board, so `maxItems: 100` across 3 boards = up to 300 charges. The Apify Store pricing event is `apify-default-dataset-item`.

**My run returned fewer rows than the careers page shows — why?**
Usually the `maxItems` per-board cap, or the board genuinely has fewer *open* roles than a stale page suggests. The API's `meta.total` is the source of truth and the actor logs it per board.

### Support

- **Bugs / feature requests** — open an issue on the GitHub repo.
- **Custom exports / extra fields (e.g. parsed pay from metadata, department filters)** — drop a note via the Apify Store contact form.
- **Other actors** — see my Apify Store profile for the rest of the catalog.

***

### ⚠️ Disclaimer

This Actor is an independent tool and is **not affiliated with, endorsed by, or sponsored by** Greenhouse Software, Inc. or the companies whose boards it can read. All trademarks mentioned are the property of their respective owners.

The scraper reads only **publicly available** job postings served by Greenhouse's public job-board API (`boards-api.greenhouse.io`) — the same endpoint that powers each company's public careers page. No login, no CAPTCHA solving, no access to recruiter/admin APIs. It rate-limits via a concurrency cap (default 8).

Users are responsible for:

- Complying with Greenhouse's and each company's terms of use
- Following GDPR, CCPA, and your jurisdiction's data-protection laws when storing or processing scraped postings
- Not contacting candidates or employees referenced in postings
- Not republishing scraped data in a way that competes with Greenhouse or its customers

***

### SEO Keywords

greenhouse scraper, scrape greenhouse jobs, greenhouse board scraper, boards.greenhouse.io scraper, greenhouse job board api, greenhouse ats scraper, greenhouse api jobs, scrape company careers page, ats job scraper, multi-company job scraper, tech jobs scraper, startup jobs scraper, stripe jobs scraper, databricks jobs scraper, job postings api, requisition data scraper, hiring intelligence, talent intelligence, recruitment market data, comp benchmarking, salary data scraper, apify greenhouse, careers page api, job description scraper

# Actor input Schema

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

Paste the company's Greenhouse careers URL — the easiest way to start. Accepts `https://boards.greenhouse.io/{company}`, `https://job-boards.greenhouse.io/{company}`, embed URLs (`...?for={company}`), or a single job URL (`.../jobs/{id}`) to scrape just that one posting. Add as many companies as you like.

## `boardTokens` (type: `array`):

Optional — instead of a full URL you can paste just the company's board token. That's the last part of its Greenhouse URL: in `boards.greenhouse.io/stripe` the token is `stripe`. Examples: `stripe`, `databricks`, `figma`. Use either this OR the URL field above.

## `includeQuestions` (type: `boolean`):

Also fetch each job's application-form questions (plus compliance / demographic / location questions) via one extra API call per job. Slower and more requests — off by default.

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

Maximum job rows emitted **per board**. 3 boards × `maxItems: 200` → up to 600 rows. Each row is one paid dataset item. Default 1000. Free-tier users are capped at 100 total rows.

## `maxConcurrency` (type: `integer`):

Parallel API calls (matters mainly when application-form questions are on). Greenhouse's API has no anti-bot — 5–10 is comfortable. Default 8.

## `maxRequestRetries` (type: `integer`):

Per-request retry budget on transient errors. Each retry rotates the proxy session. Default 5.

## `proxy` (type: `object`):

Apify Residential (any country) recommended. Greenhouse's API tolerates direct + datacenter IPs too, but residential is the safe default.

## Actor input object example

```json
{
  "startUrls": [
    "https://boards.greenhouse.io/stripe"
  ],
  "boardTokens": [],
  "includeQuestions": false,
  "maxItems": 1000,
  "maxConcurrency": 8,
  "maxRequestRetries": 5,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "startUrls": [
        "https://boards.greenhouse.io/stripe"
    ],
    "boardTokens": [],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/greenhouse-jobs-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 = {
    "startUrls": ["https://boards.greenhouse.io/stripe"],
    "boardTokens": [],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/greenhouse-jobs-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 '{
  "startUrls": [
    "https://boards.greenhouse.io/stripe"
  ],
  "boardTokens": [],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call memo23/greenhouse-jobs-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Greenhouse Jobs Scraper",
        "description": "Every job from any Greenhouse board in one run. Paste a boards.greenhouse.io URL or company token → title, requisition ID, full HTML description, location, departments, offices, salary, apply URL. No login, no limits, one flat row per job. Thousands of companies supported.",
        "version": "0.1",
        "x-build-id": "vIUfp8ktteq5nMRFd"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~greenhouse-jobs-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-greenhouse-jobs-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/memo23~greenhouse-jobs-scraper/runs": {
            "post": {
                "operationId": "runs-sync-memo23-greenhouse-jobs-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/memo23~greenhouse-jobs-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-greenhouse-jobs-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": {
                    "startUrls": {
                        "title": "Greenhouse board URLs",
                        "type": "array",
                        "description": "Paste the company's Greenhouse careers URL — the easiest way to start. Accepts `https://boards.greenhouse.io/{company}`, `https://job-boards.greenhouse.io/{company}`, embed URLs (`...?for={company}`), or a single job URL (`.../jobs/{id}`) to scrape just that one posting. Add as many companies as you like.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "boardTokens": {
                        "title": "Board tokens (alternative to URLs)",
                        "type": "array",
                        "description": "Optional — instead of a full URL you can paste just the company's board token. That's the last part of its Greenhouse URL: in `boards.greenhouse.io/stripe` the token is `stripe`. Examples: `stripe`, `databricks`, `figma`. Use either this OR the URL field above.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "includeQuestions": {
                        "title": "Include application-form questions",
                        "type": "boolean",
                        "description": "Also fetch each job's application-form questions (plus compliance / demographic / location questions) via one extra API call per job. Slower and more requests — off by default.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Max jobs per board",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum job rows emitted **per board**. 3 boards × `maxItems: 200` → up to 600 rows. Each row is one paid dataset item. Default 1000. Free-tier users are capped at 100 total rows.",
                        "default": 1000
                    },
                    "maxConcurrency": {
                        "title": "Max parallel requests",
                        "minimum": 1,
                        "maximum": 15,
                        "type": "integer",
                        "description": "Parallel API calls (matters mainly when application-form questions are on). Greenhouse's API has no anti-bot — 5–10 is comfortable. Default 8.",
                        "default": 8
                    },
                    "maxRequestRetries": {
                        "title": "Max request retries",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Per-request retry budget on transient errors. Each retry rotates the proxy session. Default 5.",
                        "default": 5
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify Residential (any country) recommended. Greenhouse's API tolerates direct + datacenter IPs too, but residential is the safe default.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
