# Google Drive Folder Copier (`nec/google-drive-copier`) Actor

Copy entire folders and files from any public or shared Google Drive link directly into your Google Drive. Supports large files, nested folders, and automated structure replication — no manual downloads required.

- **URL**: https://apify.com/nec/google-drive-copier.md
- **Developed by:** [NEC](https://apify.com/nec) (community)
- **Categories:** Automation, Developer tools, Integrations
- **Stats:** 1 total users, 0 monthly users, 7.3% runs succeeded, 2 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

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

### 📋 What does Google Drive Copier do?

**Google Drive Copier** lets you copy files and folders from a **public or shared Google Drive link** directly into your personal Google Drive account. Just paste a share link, specify where you want the files, and the Actor handles the rest — recursive folder traversal, conflict resolution, file type filtering, and progress tracking. Run it on the [Apify platform](https://apify.com) to take advantage of scheduling, API access, and integrations with other tools.

### 💡 Why use Google Drive Copier?

- **Bulk copy shared content** — Copy entire folder structures with hundreds of files in one run, no manual downloading and re-uploading
- **Preserve folder structure** — Recreates the exact folder hierarchy from the source in your destination, or flatten everything into one folder
- **Smart conflict handling** — Choose to skip, overwrite, or rename files when duplicates exist
- **Filter by file type** — Copy only PDFs, spreadsheets, or any specific file types you need
- **Track every file** — Get a detailed dataset showing every file copied, skipped, or failed with direct links to the destination
- **Schedule recurring copies** — Set up automated runs to keep your Drive in sync with shared content

### 🚀 How to use Google Drive Copier

1. **Get a Google Drive share link** — Right-click a folder or file in Google Drive → Share → Copy link. The link should look like `https://drive.google.com/drive/folders/...`
2. **Find your destination folder ID** — Open the destination folder in Google Drive. The folder ID is the last part of the URL: `drive.google.com/drive/folders/YOUR_FOLDER_ID`
3. **Configure the Actor** — Go to the Input tab and paste the share link and destination folder ID
4. **Run the Actor** — Click Start. On the first run, you'll need to authorize Google Drive access via the Live View tab
5. **Authorize Google Drive** — Open the Live View tab, click "Sign in with Google", complete the consent screen, then paste the authorization code back into the form
6. **Check results** — Go to the Output tab to see every file that was copied with status and destination links

<img src="./docs/live-view.png" style="width:800px;" alt="Live View">


> 💾 Authorization is a one-time step. Future runs reuse the saved tokens automatically.

**Headless / automated runs:** If you already have a Google OAuth refresh token, paste it into the `oauthRefreshToken` field to skip the interactive consent screen entirely.

### ⚙️ Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `publicDriveLink` | String | ✅ Yes | Google Drive share link (folder or file) |
| `destinationFolderId` | String | ✅ Yes | Your destination folder ID from the Drive URL |
| `conflictResolution` | String | No | What to do with duplicates: `skip`, `overwrite`, or `rename` (default: `rename`) |
| `maxFolderDepth` | Integer | No | How deep to traverse nested folders, 1–10 (default: `10`) |
| `copyFilesOnly` | Boolean | No | Skip folder structure, put all files in the destination folder (default: `false`) |
| `fileTypeFilter` | String | No | Comma-separated extensions to include, e.g. `pdf,docx,xlsx`. Empty copies all |
| `maxFilesPerRun` | Integer | No | Safety limit on files per run, 1–10,000 (default: `10000`) |
| `oauthRefreshToken` | String | No | Pre-obtained OAuth refresh token — skips the interactive sign-in flow. Used when `googleClientId`/`googleClientSecret` are not provided. Stored as a secret. |

#### Example input

```json
{
    "publicDriveLink": "https://drive.google.com/drive/folders/1abc2def3ghi4jkl5mno6pqr7stu8vwx",
    "destinationFolderId": "1zyx9wvu8tsr7qpo9nml8kji7hug6fed",
    "conflictResolution": "rename",
    "maxFolderDepth": 10,
    "fileTypeFilter": "pdf,docx"
}
````

**Headless example (using a refresh token):**

```json
{
    "publicDriveLink": "https://drive.google.com/drive/folders/1abc2def3ghi4jkl5mno6pqr7stu8vwx",
    "destinationFolderId": "1zyx9wvu8tsr7qpo9nml8kji7hug6fed",
    "oauthRefreshToken": "1//0gABCDEF..."
}
```

### 📦 Output

Each copied file is stored as a separate record in the dataset. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Example output

```json
{
    "name": "quarterly-report.pdf",
    "type": "file",
    "status": "copied",
    "sourceId": "1abc2def3ghi4jkl",
    "destinationId": "9xyz8wvu7tsr6qpo",
    "mimeType": "application/pdf",
    "sizeBytes": 2458624,
    "skipReason": "",
    "error": "",
    "destinationUrl": "https://drive.google.com/file/d/9xyz8wvu7tsr6qpo/view"
}
```

A run summary with aggregate counts is also saved in the key-value store under the `SUMMARY` key.

### 🗂️ Data table

| Field | Description |
|-------|-------------|
| `name` | File or folder name |
| `type` | `file` or `folder` |
| `status` | `copied`, `skipped`, or `failed` |
| `sourceId` | Google Drive ID of the source item |
| `destinationId` | Google Drive ID of the copied item |
| `mimeType` | MIME type (e.g. `application/pdf`) |
| `sizeBytes` | File size in bytes |
| `skipReason` | Why the file was skipped: `duplicate`, `filtered`, or `maxFilesReached` |
| `error` | Error message if the copy failed |
| `destinationUrl` | Direct link to the copied file in your Drive |

### 🔧 Tips and advanced options

- **Use `copyFilesOnly: true`** to flatten a deeply nested folder structure into a single destination folder
- **Use `fileTypeFilter`** to selectively copy only the file types you need (e.g. `pdf,xlsx` to grab only documents and spreadsheets)
- **Set `maxFilesPerRun`** to a lower number for testing or to control costs on large folders
- **Execution time estimates**: Copying 100 files typically takes 2–3 minutes; 1,000 files takes 15–30 minutes (varies by file sizes and API quota)
- **Conflict resolution strategies:**
  - `rename` (default) — adds `(1)`, `(2)` etc. to duplicate filenames
  - `skip` — leaves existing files untouched
  - `overwrite` — replaces existing files with the new copy
- **Automate without a browser** — Provide an `oauthRefreshToken` to run fully headlessly, ideal for scheduled or API-triggered runs
- **Schedule runs** using Apify's scheduling feature to periodically sync shared content into your Drive

### ❓ FAQ, disclaimers, and support

#### Is this legal?

This Actor copies files that are shared with you via Google Drive's sharing features. You are responsible for ensuring you have the right to copy the content. The Actor respects Google Drive's API terms of service and rate limits.

#### What permissions does it need?

The Actor requests full Google Drive access (`drive` scope) to read shared files and create copies in your account. You can revoke access at any time from your [Google Account permissions page](https://myaccount.google.com/permissions).

#### How do I get an OAuth refresh token?

You can obtain a refresh token using the [Google OAuth Playground](https://developers.google.com/oauthplayground):

1. Select the `https://www.googleapis.com/auth/drive` scope
2. Authorize and exchange the authorization code for tokens
3. Copy the **Refresh token** value and paste it into the `oauthRefreshToken` input field

#### Where are my Google tokens stored?

OAuth tokens are stored securely in a named key-value store called `google-oauth-tokens-drive` within your Apify account. This storage is encrypted and only accessible by your Actor runs. You can delete this store at any time to force re-authentication on the next run.

#### What if my run times out?

The Actor handles interruptions gracefully. If aborted, it saves a partial summary with accurate counts of everything processed so far. You can run it again — use `conflictResolution: skip` to avoid re-copying files that were already transferred.

#### Troubleshooting

**Q: "Destination folder is not accessible" error**

- Verify the folder ID is correct (copy from the Drive URL: `drive.google.com/drive/folders/YOUR_FOLDER_ID`)
- Check that you have write permissions to the destination folder
- Ensure the folder hasn't been deleted or moved

**Q: "Rate limit exceeded" errors**

- Google Drive has a 10,000 API request limit per user per day
- Large folder copies may need to be split across multiple runs
- Use `maxFilesPerRun` to limit requests per run

**Q: Files are missing from the copied folder**

- Check if they were filtered by file type (`fileTypeFilter`)
- Verify they weren't skipped due to duplicate naming
- Check the Actor's output dataset for details on each file

**Q: "Google Drive API is not enabled" error**

- Go to [Google Cloud Console](https://console.cloud.google.com/apis/library/drive.googleapis.com)
- Click **Enable** to activate the Google Drive API
- Try running the Actor again

#### Known limitations

- Google Drive API daily quota is 10,000 requests per user. Very large folders (10,000+ files) may require multiple runs
- Maximum folder nesting depth is 10 levels
- Files up to 5 GB are supported
- The Actor cannot copy Google Docs/Sheets/Slides native formats — these are copied as-is using the Drive copy API

#### Support

Found a bug or have a feature request? Open an issue in the Issues tab on the Actor page.

# Actor input Schema

## `publicDriveLink` (type: `string`):

Public share link to the Google Drive folder or file you want to copy. Right-click any file or folder in Drive → Share → Copy link.

## `destinationFolderId` (type: `string`):

Your Google Drive destination folder ID. Open the target folder in Drive and copy the ID from the URL: drive.google.com/drive/folders/FOLDER\_ID

## `conflictResolution` (type: `string`):

What to do when a file or folder with the same name already exists in the destination. 'Rename' adds (1), (2) etc. to avoid overwriting.

## `maxFolderDepth` (type: `integer`):

Maximum folder nesting level to copy. 1 = top-level items only, 10 = full depth. Increase for deeply nested folder structures.

## `copyFilesOnly` (type: `boolean`):

When enabled, all files are copied directly into the destination folder without recreating the original folder hierarchy. Useful for consolidating scattered files.

## `fileTypeFilter` (type: `string`):

Comma-separated file extensions to include (e.g. 'pdf,docx,xlsx'). Only files matching these extensions will be copied. Leave empty to copy all file types.

## `maxFilesPerRun` (type: `integer`):

Safety limit: stop after copying this many files. Useful for testing or controlling costs on large folders. Set lower for a trial run.

## `googleClientId` (type: `string`):

Optional: Your own Google OAuth 2.0 Client ID. Only needed if you want to use your own Google Cloud project instead of the built-in credentials. Create one at console.cloud.google.com/apis/credentials.

## `googleClientSecret` (type: `string`):

Optional: Your own Google OAuth 2.0 Client Secret. Required only when providing a custom Google Client ID above.

## `googleRedirectUri` (type: `string`):

OAuth redirect URI. Only change this if using your own Google Cloud credentials and a custom redirect URI.

## `oauthRefreshToken` (type: `string`):

Optional: A pre-obtained Google OAuth refresh token. When provided (and googleClientId/googleClientSecret are not set), this token authenticates the Actor directly — no browser sign-in required. Ideal for scheduled or API-triggered runs. Get a token from developers.google.com/oauthplayground using the drive scope.

## Actor input object example

```json
{
  "publicDriveLink": "https://drive.google.com/drive/folders/1abc2def3ghi4jkl5mno6pqr7stu8vwx",
  "destinationFolderId": "1zyx9wvu8tsr7qpo9nml8kji7hug6fed",
  "conflictResolution": "rename",
  "maxFolderDepth": 10,
  "copyFilesOnly": false,
  "fileTypeFilter": "pdf,docx,xlsx",
  "maxFilesPerRun": 10000,
  "googleClientId": "123456789-abcdef.apps.googleusercontent.com",
  "googleRedirectUri": "http://localhost"
}
```

# Actor output Schema

## `copiedFiles` (type: `string`):

No description

## `summary` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("nec/google-drive-copier").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("nec/google-drive-copier").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 '{}' |
apify call nec/google-drive-copier --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Drive Folder Copier",
        "description": "Copy entire folders and files from any public or shared Google Drive link directly into your Google Drive. Supports large files, nested folders, and automated structure replication — no manual downloads required.",
        "version": "1.0",
        "x-build-id": "vuPiZavjSHaIIbfWJ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/nec~google-drive-copier/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-nec-google-drive-copier",
                "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/nec~google-drive-copier/runs": {
            "post": {
                "operationId": "runs-sync-nec-google-drive-copier",
                "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/nec~google-drive-copier/run-sync": {
            "post": {
                "operationId": "run-sync-nec-google-drive-copier",
                "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": [
                    "publicDriveLink",
                    "destinationFolderId"
                ],
                "properties": {
                    "publicDriveLink": {
                        "title": "🔗 Public Drive Link",
                        "pattern": "^https://drive\\.google\\.com/(drive/folders/|file/d/)[a-zA-Z0-9_-]+(/.*)?$",
                        "type": "string",
                        "description": "Public share link to the Google Drive folder or file you want to copy. Right-click any file or folder in Drive → Share → Copy link."
                    },
                    "destinationFolderId": {
                        "title": "📁 Destination Folder ID",
                        "pattern": "^[a-zA-Z0-9_-]+$",
                        "type": "string",
                        "description": "Your Google Drive destination folder ID. Open the target folder in Drive and copy the ID from the URL: drive.google.com/drive/folders/FOLDER_ID"
                    },
                    "conflictResolution": {
                        "title": "⚡ Conflict Resolution",
                        "enum": [
                            "skip",
                            "overwrite",
                            "rename"
                        ],
                        "type": "string",
                        "description": "What to do when a file or folder with the same name already exists in the destination. 'Rename' adds (1), (2) etc. to avoid overwriting.",
                        "default": "rename"
                    },
                    "maxFolderDepth": {
                        "title": "🗂️ Max Folder Depth",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Maximum folder nesting level to copy. 1 = top-level items only, 10 = full depth. Increase for deeply nested folder structures.",
                        "default": 10
                    },
                    "copyFilesOnly": {
                        "title": "📄 Copy Files Only (Flatten Structure)",
                        "type": "boolean",
                        "description": "When enabled, all files are copied directly into the destination folder without recreating the original folder hierarchy. Useful for consolidating scattered files.",
                        "default": false
                    },
                    "fileTypeFilter": {
                        "title": "🔍 File Type Filter",
                        "type": "string",
                        "description": "Comma-separated file extensions to include (e.g. 'pdf,docx,xlsx'). Only files matching these extensions will be copied. Leave empty to copy all file types."
                    },
                    "maxFilesPerRun": {
                        "title": "🛑 Max Files Per Run",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Safety limit: stop after copying this many files. Useful for testing or controlling costs on large folders. Set lower for a trial run.",
                        "default": 10000
                    },
                    "googleClientId": {
                        "title": "🔑 Google Client ID",
                        "type": "string",
                        "description": "Optional: Your own Google OAuth 2.0 Client ID. Only needed if you want to use your own Google Cloud project instead of the built-in credentials. Create one at console.cloud.google.com/apis/credentials."
                    },
                    "googleClientSecret": {
                        "title": "🔒 Google Client Secret",
                        "type": "string",
                        "description": "Optional: Your own Google OAuth 2.0 Client Secret. Required only when providing a custom Google Client ID above."
                    },
                    "googleRedirectUri": {
                        "title": "↩️ Google Redirect URI",
                        "type": "string",
                        "description": "OAuth redirect URI. Only change this if using your own Google Cloud credentials and a custom redirect URI."
                    },
                    "oauthRefreshToken": {
                        "title": "🤖 OAuth Refresh Token (Headless Auth)",
                        "type": "string",
                        "description": "Optional: A pre-obtained Google OAuth refresh token. When provided (and googleClientId/googleClientSecret are not set), this token authenticates the Actor directly — no browser sign-in required. Ideal for scheduled or API-triggered runs. Get a token from developers.google.com/oauthplayground using the drive scope."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
