# PII Redactor - Detect & Mask Emails, Phones, SSNs, Cards (`nibble/pii-redactor`) Actor

Redact or pseudonymously mask PII (emails, phones, SSNs, credit cards, IPs, names, addresses) in user-supplied text, CSV, or JSON. Outputs cleaned data plus a redaction log.

- **URL**: https://apify.com/nibble/pii-redactor.md
- **Developed by:** [Simon Fletcher](https://apify.com/nibble) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 record scanneds

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 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/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

PII Redactor **detects and removes personal data** — emails, phone numbers, US Social Security numbers, credit-card numbers, IP addresses, IBANs, and **names, organizations & locations** — from **text, CSV, or JSON that you supply**. Names, organizations and locations are found with a real **NER model (Microsoft Presidio + spaCy)**, so it catches genuine names and places rather than matching a fixed wordlist. It returns the cleaned data plus a detailed **redaction log** (what type of PII was found, where, and how many). It is **privacy-positive**: it *removes* personal data, it never scrapes or harvests it.

> **Set the run memory to at least 2 GB.** The NER model (Presidio + spaCy `en_core_web_sm`) needs ~1–2 GB of RAM. The Actor ships with a default of 2048 MB; if you lower it in the Apify Console the run may fail to load the model.

Run it in the cloud on the [Apify platform](https://apify.com) with API access, scheduling, and integrations, or call it from an AI agent over the Apify MCP.

### What does PII Redactor do?

You give it content you are authorized to process — a support-ticket export, a CSV of form submissions, a JSON log dump, a block of pasted text — and it produces a **sanitized copy** with every detected piece of PII either:

- **redacted** — replaced with a type tag such as `[EMAIL_REDACTED]`, or
- **masked** — replaced with a **stable pseudonymous token** such as `[EMAIL_3f9a2b1c]`, where the *same* value always maps to the *same* token, so you keep referential integrity (join / group / count on the token) without ever exposing the raw value.

Alongside the cleaned data you get a **redaction log** that records the PII **type, character position, and counts** — never the raw value — so you have an auditable trail of what was removed.

#### What it detects

| Type | Method | Notes |
|------|--------|-------|
| Email addresses | Presidio built-in | High precision |
| Phone numbers | Presidio built-in (`phonenumbers`) | North-American + international formats |
| US SSN | Pattern recognizer | Dashed / spaced `123-45-6789` form |
| Credit cards | Presidio built-in + **Luhn check** | Validated to cut false positives |
| IP addresses | Presidio built-in | IPv4 and IPv6 |
| IBAN | Presidio built-in | International bank account numbers |
| Names / people | **NER** (Presidio + spaCy) | Real names, e.g. `Aleksandr Vovchenko`, not just a wordlist |
| Locations / places | **NER** (Presidio + spaCy) | Cities, countries, regions, e.g. `Berlin` |
| Organizations | **NER** (Presidio + spaCy) — **opt-in** | Company names; excluded from the default set (see below) |
| US postal addresses | Pattern recognizer | e.g. `1600 Pennsylvania Avenue` |

> **Organizations are opt-in.** The small NER model over-eagerly tags label words and brands (e.g. `SSN`, `Visa`) as organizations, so `org` is left out of the default detection set to keep output high-precision. Add `org` to **PII types to detect** when you specifically want company names removed.

### Why use PII Redactor?

- **Compliance & data minimization** — strip PII from datasets before sharing them with vendors, analysts, or LLM training/eval pipelines (GDPR / CCPA data-minimization).
- **Safe AI pipelines** — sanitize prompts, logs, and documents before they hit a third-party model.
- **Support / CRM exports** — clean ticket and chat exports for analytics without leaking customer identities.
- **Referential integrity when you need it** — mask mode lets you analyze patterns (how many messages per customer) without knowing who the customer is.
- **Real NER, not a wordlist** — names, organizations, and locations are detected by a Microsoft Presidio + spaCy model, so genuine (including non-English) names and places are caught, not just a fixed list.
- **Low maintenance** — it processes only data you supply and never touches websites, so nothing breaks when a site changes.

### How to use PII Redactor

1. Open the Actor and go to the **Input** tab.
2. Choose a **Mode**: `redact` (remove) or `mask` (stable pseudonymous tokens).
3. Provide your content one of three ways: paste into **Input text**, give an **Input URL** to your own file, or pass an inline **Records** array.
4. (Optional) Restrict **PII types to detect**, restrict which **Fields to scan** for CSV/JSON, or set a **Mask salt** for per-tenant token isolation.
5. Click **Start** and download the cleaned results plus redaction log from the **Output** tab (JSON, CSV, Excel, or HTML).

### Input

| Field | Type | Description |
|-------|------|-------------|
| `mode` | string | `redact` or `mask`. Default `redact`. |
| `redactionTypes` | array | Subset of `email, phone, ssn, credit_card, ip, iban, name, location, address, org`. Empty = default set (everything except `org`). |
| `inputFormat` | string | `text`, `csv`, or `json` — how to parse `inputText` / a fetched file. |
| `inputText` | string | Inline content to clean. |
| `inputUrl` | string | URL to **your own** text/CSV/JSON file (used only if no inline content). |
| `records` | array | Inline array of strings/objects to clean directly (takes precedence). |
| `fields` | array | For objects, restrict scanning to these field names. |
| `maskSalt` | string | Optional secret salt for pseudonymous tokens in `mask` mode. |

#### Input example

```json
{
    "mode": "redact",
    "inputFormat": "text",
    "inputText": "Reach John Smith at john@acme.com or (212) 555-0147. SSN 078-05-1120."
}
````

### Output

One dataset item per **non-empty** input record. Each item holds the cleaned content plus the redaction log.

```json
{
    "index": 0,
    "mode": "redact",
    "redacted": "Reach [NAME_REDACTED] at [EMAIL_REDACTED] or [PHONE_REDACTED]. SSN [SSN_REDACTED].",
    "redactionCount": 4,
    "redactionsByType": { "name": 1, "email": 1, "phone": 1, "ssn": 1 },
    "redactions": [
        { "type": "name",  "start": 6,  "end": 16, "replacement": "[NAME_REDACTED]" },
        { "type": "email", "start": 20, "end": 33, "replacement": "[EMAIL_REDACTED]" },
        { "type": "phone", "start": 37, "end": 51, "replacement": "[PHONE_REDACTED]" },
        { "type": "ssn",   "start": 57, "end": 68, "replacement": "[SSN_REDACTED]" }
    ]
}
```

For CSV/JSON object records, `redacted` mirrors the input object with each string field cleaned, and each redaction carries the `field` it was found in. You can download the dataset in **JSON, CSV, Excel, or HTML**.

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| `index` | integer | Position of the record in your input. |
| `mode` | string | `redact` or `mask`. |
| `redacted` | string | object | The cleaned content. |
| `redactionCount` | integer | Total PII instances removed in this record. |
| `redactionsByType` | object | Counts grouped by PII type. |
| `redactions` | array | Per-match log: `type`, `start`, `end`, `replacement`, and `field` (for objects). Never contains the raw PII value. |

### Pricing / cost estimation

This Actor is billed **pay-per-event**: you are charged **once per non-empty record processed** — never for blank rows, non-text values, or failed rows. The engine now runs a spaCy NER model (loaded once per run), so allow ~2 GB of memory and expect modestly higher per-record compute than a pure-regex pass; batching many records into one run amortizes the one-time model-load cost. See `PRICING.md` for the unit-economics rationale.

### Tips & advanced options

- **Batch large jobs** via the `records` array or a CSV/JSON `inputUrl` — one run cleans thousands of records.
- **Restrict `redactionTypes`** to only what you need for higher precision and clearer logs.
- **Use `maskSalt` per customer/tenant** so pseudonymous tokens can't be correlated across tenants.
- **`mask` vs `redact`**: choose `mask` when downstream analytics must still group/join by the (now anonymous) value; choose `redact` when you simply want the PII gone.

### FAQ, limitations & support

- **Does it scrape anything?** No. It only processes data **you** supply (inline, or a URL to your own file). It never harvests personal data.
- **Is the raw PII ever stored?** No. The redaction log records only the PII *type*, *position*, and *counts* — not the value. In `mask` mode the token is a one-way hash.
- **How accurate is name / organization / location detection?** Structured types (email, phone, SSN, credit card, IP, IBAN) are high-precision. Names, organizations, and locations use a Microsoft Presidio + spaCy NER model — far better recall than a wordlist (it catches real, including non-English, names) but still statistical: it can miss lowercase or unusual mentions and occasionally over- or under-tag, especially organizations (which is why `org` is opt-in). The model is the small `en_core_web_sm` (chosen to keep the image and memory reasonable). Review the redaction log for sensitive workloads.
- **Which formats?** Plain text, CSV (with header), and JSON (array or object).
- **Feedback / bugs?** Use the **Issues** tab. Custom detectors or formats can be added on request.

# Actor input Schema

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

How to handle detected PII. 'redact' replaces each match with a type tag like \[EMAIL\_REDACTED]. 'mask' replaces it with a STABLE pseudonymous token like \[EMAIL\_3f9a2b1c] — the same value always maps to the same token, so you keep referential integrity without exposing the raw data.

## `redactionTypes` (type: `array`):

Which categories of PII to detect. Structured types (email, phone, SSN, credit card, IP, IBAN) are high-precision. Names, organizations, and locations are detected with a Microsoft Presidio + spaCy NER model, so real names/places are caught (not just a wordlist). Leave empty to detect the default set. NOTE: 'org' is OPT-IN — the small NER model over-tags label words and brand names as organizations, so it is excluded from the default set; add it explicitly if you need it.

## `inputFormat` (type: `string`):

How to interpret 'Input text' or a fetched 'Input URL' file. 'text' treats the whole blob as one document. 'csv' parses rows (header required) and scans string cells. 'json' parses a JSON array (each item = one record) or object.

## `inputText` (type: `string`):

The content to clean, pasted inline. Interpreted according to 'Input format'. Use this OR 'Input URL' OR 'Records'.

## `inputUrl` (type: `string`):

A URL to YOUR OWN text/CSV/JSON file to clean. Fetched only when no inline content is given. This Actor never scrapes third-party sites — supply only data you are authorized to process.

## `records` (type: `array`):

An inline JSON array to clean directly. Each item may be a string or an object; for objects, every string field is scanned (or only those listed in 'Fields to scan'). Takes precedence over 'Input text' / 'Input URL'.

## `fields` (type: `array`):

For CSV/JSON object records, restrict scanning to these field names. Leave empty to scan every string field.

## `maskSalt` (type: `string`):

Optional secret string used when 'mask' mode derives pseudonymous tokens. Use a per-customer salt to make tokens non-correlatable across tenants. Same salt + same value = same token.

## Actor input object example

```json
{
  "mode": "redact",
  "redactionTypes": [
    "email",
    "phone",
    "ssn",
    "credit_card",
    "ip",
    "iban",
    "name",
    "location",
    "address"
  ],
  "inputFormat": "text",
  "inputText": "Contact John Smith at john.doe@example.com or call (555) 123-4567. SSN 123-45-6789. Card 4111 1111 1111 1111. Server 192.168.1.100."
}
```

# Actor output Schema

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "inputText": "Contact John Smith at john.doe@example.com or call (555) 123-4567. SSN 123-45-6789. Card 4111 1111 1111 1111. Server 192.168.1.100."
};

// Run the Actor and wait for it to finish
const run = await client.actor("nibble/pii-redactor").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 = { "inputText": "Contact John Smith at john.doe@example.com or call (555) 123-4567. SSN 123-45-6789. Card 4111 1111 1111 1111. Server 192.168.1.100." }

# Run the Actor and wait for it to finish
run = client.actor("nibble/pii-redactor").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 '{
  "inputText": "Contact John Smith at john.doe@example.com or call (555) 123-4567. SSN 123-45-6789. Card 4111 1111 1111 1111. Server 192.168.1.100."
}' |
apify call nibble/pii-redactor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "PII Redactor - Detect & Mask Emails, Phones, SSNs, Cards",
        "description": "Redact or pseudonymously mask PII (emails, phones, SSNs, credit cards, IPs, names, addresses) in user-supplied text, CSV, or JSON. Outputs cleaned data plus a redaction log.",
        "version": "0.1",
        "x-build-id": "W5T3i1xMjnxswJdEN"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/nibble~pii-redactor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-nibble-pii-redactor",
                "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/nibble~pii-redactor/runs": {
            "post": {
                "operationId": "runs-sync-nibble-pii-redactor",
                "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/nibble~pii-redactor/run-sync": {
            "post": {
                "operationId": "run-sync-nibble-pii-redactor",
                "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": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "redact",
                            "mask"
                        ],
                        "type": "string",
                        "description": "How to handle detected PII. 'redact' replaces each match with a type tag like [EMAIL_REDACTED]. 'mask' replaces it with a STABLE pseudonymous token like [EMAIL_3f9a2b1c] — the same value always maps to the same token, so you keep referential integrity without exposing the raw data.",
                        "default": "redact"
                    },
                    "redactionTypes": {
                        "title": "PII types to detect",
                        "type": "array",
                        "description": "Which categories of PII to detect. Structured types (email, phone, SSN, credit card, IP, IBAN) are high-precision. Names, organizations, and locations are detected with a Microsoft Presidio + spaCy NER model, so real names/places are caught (not just a wordlist). Leave empty to detect the default set. NOTE: 'org' is OPT-IN — the small NER model over-tags label words and brand names as organizations, so it is excluded from the default set; add it explicitly if you need it.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "email",
                                "phone",
                                "ssn",
                                "credit_card",
                                "ip",
                                "iban",
                                "name",
                                "location",
                                "address",
                                "org"
                            ],
                            "enumTitles": [
                                "Email addresses",
                                "Phone numbers",
                                "US SSN",
                                "Credit cards",
                                "IP addresses (v4/v6)",
                                "IBAN bank codes",
                                "Names / people (NER)",
                                "Locations / places (NER)",
                                "US postal addresses",
                                "Organizations (NER, opt-in)"
                            ]
                        },
                        "default": [
                            "email",
                            "phone",
                            "ssn",
                            "credit_card",
                            "ip",
                            "iban",
                            "name",
                            "location",
                            "address"
                        ]
                    },
                    "inputFormat": {
                        "title": "Input format",
                        "enum": [
                            "text",
                            "csv",
                            "json"
                        ],
                        "type": "string",
                        "description": "How to interpret 'Input text' or a fetched 'Input URL' file. 'text' treats the whole blob as one document. 'csv' parses rows (header required) and scans string cells. 'json' parses a JSON array (each item = one record) or object.",
                        "default": "text"
                    },
                    "inputText": {
                        "title": "Input text",
                        "type": "string",
                        "description": "The content to clean, pasted inline. Interpreted according to 'Input format'. Use this OR 'Input URL' OR 'Records'."
                    },
                    "inputUrl": {
                        "title": "Input URL (your own file)",
                        "type": "string",
                        "description": "A URL to YOUR OWN text/CSV/JSON file to clean. Fetched only when no inline content is given. This Actor never scrapes third-party sites — supply only data you are authorized to process."
                    },
                    "records": {
                        "title": "Records (inline array)",
                        "type": "array",
                        "description": "An inline JSON array to clean directly. Each item may be a string or an object; for objects, every string field is scanned (or only those listed in 'Fields to scan'). Takes precedence over 'Input text' / 'Input URL'."
                    },
                    "fields": {
                        "title": "Fields to scan (objects only)",
                        "type": "array",
                        "description": "For CSV/JSON object records, restrict scanning to these field names. Leave empty to scan every string field.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maskSalt": {
                        "title": "Mask salt (optional)",
                        "type": "string",
                        "description": "Optional secret string used when 'mask' mode derives pseudonymous tokens. Use a per-customer salt to make tokens non-correlatable across tenants. Same salt + same value = same token."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
