# Google Photos to Drive Backup (`nec/photos-to-drive-backup`) Actor

Download photos from public or shared Google Photos album links and upload them directly to your Google Drive. Automatically transfer images in bulk with no manual saving required.

- **URL**: https://apify.com/nec/photos-to-drive-backup.md
- **Developed by:** [NEC](https://apify.com/nec) (community)
- **Categories:** Automation, Developer tools, Integrations
- **Stats:** 2 total users, 2 monthly users, 0.0% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

from $30.00 / 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

## Google Photos to Drive Backup

**Back up photos from any public Google Photos share link directly to your Google Drive** with automatic folder organization, metadata preservation, and robust error handling.

### 📸 What does Google Photos to Drive Backup do?

This Apify Actor takes a **public Google Photos share link** and downloads every photo from it, then uploads them to a folder in **your Google Drive**. It handles the entire process automatically — loading the share page in a browser, scrolling to discover all photos, downloading them with parallel streams, and uploading to Drive with organized folder structures.

### ✅ Why use Google Photos to Drive Backup?

- 🧡 **Preserve shared memories** — Back up family photo albums, event collections, or travel photos shared via Google Photos before the link expires or gets removed
- 🔄 **Migrate between accounts** — Move photos from one Google account to another without manual downloading
- 🗂️ **Automatic organization** — Photos are sorted into monthly subfolders (2026-01, 2026-02) based on when they were taken
- 🏷️ **Metadata preservation** — Each photo gets a JSON sidecar file with the original URL, date taken, file size, and format
- ⚡ **Handles large collections** — Supports albums with thousands of photos using concurrent downloads and memory-efficient streaming
- 🛡️ **Anti-bot measures** — Uses stealth browser techniques to avoid Google's rate limiting and CAPTCHA challenges

### 🚀 How to use Google Photos to Drive Backup

1. **Get your Google Photos share link** — Open the shared album in Google Photos and copy the share URL
2. **Get your Google Drive folder ID** — Navigate to the destination folder in Google Drive and copy the folder ID from the URL (`https://drive.google.com/drive/folders/{FOLDER_ID}`)
3. **Configure the Actor** — Paste the share link and folder ID into the Actor input
4. **Run it** — Start the Actor. On first run, open the **live view tab** and click "Authorize" to grant Google Drive access through the OAuth consent screen
5. **Done** — Subsequent runs reuse the stored token automatically, no re-authorization needed

### ⚙️ Input

| Field | Type | Required | Default | Description |
|-------|------|----------|---------|-------------|
| `googlePhotosShareLink` | string | Yes | — | Public Google Photos share URL |
| `sharePassword` | string | No | — | Password for protected shares |
| `destinationFolderId` | string | Yes | — | Google Drive folder ID for uploads |
| `googleClientId` | string | No | — | Your Google OAuth 2.0 Client ID |
| `googleClientSecret` | string | No | — | Your Google OAuth 2.0 Client Secret |
| `googleRedirectUri` | string | No | `http://localhost` | OAuth 2.0 redirect URI |
| `oauthRefreshToken` | string | No | — | OAuth2 refresh token (skips interactive auth) |
| `createMonthlySubfolders` | boolean | No | `true` | Organize into YYYY-MM subfolders |
| `maxPhotosToDownload` | integer | No | `100000` | Safety limit for photo count |
| `concurrentDownloads` | integer | No | `4` | Parallel download streams (1-16) |
| `includeMetadataFiles` | boolean | No | `true` | Create .metadata.json sidecars |
| `skipIfDuplicateExists` | boolean | No | `false` | Skip files that already exist |


#### Example input

```json
{
    "googlePhotosShareLink": "https://photos.app.goo.gl/AbCdEfGhIjKlMnOp",
    "destinationFolderId": "1zyx9wvu8tsr7qpo9nml8kji7hug6fed",
    "createMonthlySubfolders": true,
    "concurrentDownloads": 4,
    "includeMetadataFiles": true
}
````

### 📦 Output

The Actor pushes a summary result to the default dataset. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Example output

```json
{
    "success": true,
    "summary": {
        "photosDiscovered": 47,
        "photosDownloaded": 47,
        "photosSkipped": 0,
        "photosFailed": 0,
        "photosUploaded": 47,
        "totalDataDownloaded": 156237824,
        "totalDataUploaded": 156237824,
        "executionTimeMs": 124532
    },
    "errors": [],
    "destinationFolderName": "Google Photos Backup - 2026-05-01 10:30:00",
    "shareLink": "https://photos.app.goo.gl/AbCdEfGhIjKlMnOp",
    "metadataFilesCreated": 47
}
```

### 🗃️ Data fields

| Field | Description |
|-------|-------------|
| `success` | Whether all photos were processed without failures |
| `summary.photosDiscovered` | Total photos found on the share page |
| `summary.photosDownloaded` | Photos successfully downloaded |
| `summary.photosUploaded` | Photos successfully uploaded to Drive |
| `summary.photosSkipped` | Photos skipped (duplicates) |
| `summary.photosFailed` | Photos that failed after retries |
| `summary.totalDataDownloaded` | Total bytes downloaded |
| `summary.totalDataUploaded` | Total bytes uploaded |
| `summary.executionTimeMs` | Total run time in milliseconds |
| `errors` | Array of individual error records |
| `destinationFolderName` | Name of the root backup folder created |
| `metadataFilesCreated` | Number of .metadata.json sidecar files |

### 📁 Google Drive folder structure

The Actor creates an organized folder structure in your Drive:

```
Your Destination Folder/
└── Google Photos Backup - 2026-05-01 10:30:00/
    ├── 2026-01/
    │   ├── IMG_20260115_123456.jpg
    │   ├── IMG_20260115_123456.jpg.metadata.json
    │   └── ...
    ├── 2026-02/
    │   └── ...
    └── undated/
        └── photo_001.jpg
```

When `createMonthlySubfolders` is disabled, all photos go directly into the root backup folder.

### 💡 Tips and advanced options

- **Start small** — Set `maxPhotosToDownload` to 10 for your first run to verify everything works
- **Concurrency tuning** — Use 2-4 concurrent downloads for most cases. Higher values (8-16) are faster but more likely to trigger rate limiting
- **Skip duplicates** — Enable `skipIfDuplicateExists` if you're re-running the Actor on the same album to avoid uploading photos twice
- **Metadata files** — The `.metadata.json` sidecars are useful for tracing photos back to their source. Disable with `includeMetadataFiles: false` if you don't need them
- **Password-protected shares** — Provide the `sharePassword` input if the album requires a password

### 🔐 Google authentication

The Actor supports two ways to authenticate with Google Drive:

#### Interactive flow (recommended for first-time use)

On first run, the Actor opens an authorization page in the **live view tab**. Click "Authorize" and log in with your Google account to grant Drive access. Tokens are stored automatically and reused on all subsequent runs — no re-authorization needed.

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

You can optionally provide `googleClientId` and `googleClientSecret` to use your own Google Cloud project instead of Apify's built-in credentials.

#### Refresh token (for automation and scheduling)

Provide an `oauthRefreshToken` to skip the interactive flow entirely. This is the recommended approach for scheduled runs. You can also provide `googleClientId` and `googleClientSecret` alongside the refresh token to use your own Google Cloud project.

**To get a refresh token:**

1. Go to the [Google Cloud Console](https://console.cloud.google.com/apis/credentials) and create an OAuth 2.0 Client ID (type: Web application)
2. Enable the Google Drive API in your project
3. Visit the [Google OAuth Playground](https://developers.google.com/oauthplayground), click the settings gear, check "Use your own OAuth credentials", and enter your Client ID and Secret
4. Select the `https://www.googleapis.com/auth/drive` scope, authorize, and exchange for tokens
5. Copy the **Refresh Token** (and optionally the Client ID, Client Secret) into the Actor input

#### Credential priority

The Actor resolves credentials in this order:

1. `googleClientId` / `googleClientSecret` / `googleRedirectUri` from Actor input
2. Apify's built-in credentials (interactive flow only)

### ❓ FAQ, disclaimers, and support

**Is this legal?** This Actor accesses publicly shared Google Photos links — the same content anyone with the link can view in a browser. It does not bypass any authentication or access controls. Always ensure you have permission to download and store the shared content.

**Why do I get a CAPTCHA?** Google may present a CAPTCHA challenge if it detects automated access. The Actor uses stealth techniques to minimize this, but it can still happen with large albums or frequent runs. If you encounter a CAPTCHA, wait a few hours before retrying.

**What image quality do I get?** Google Photos public shares serve compressed versions of photos, not the original full-resolution files. This is a limitation of how Google serves shared content.

**Can I schedule regular backups?** Yes — use Apify's built-in scheduling to run the Actor periodically. Enable `skipIfDuplicateExists` to avoid re-uploading photos that are already in your Drive.

**Found a bug or have a feature request?** Open an issue in the Actor's Issues tab on the Apify Console.

# Actor input Schema

## `googlePhotosShareLink` (type: `string`):

Public share link from Google Photos. Supports short form (https://photos.app.goo.gl/...), long form (https://photos.google.com/share/...), and user-scoped (https://photos.google.com/u/N/share/...) URLs.

## `sharePassword` (type: `string`):

Password if the Google Photos share is password-protected. Leave empty for public shares.

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

The ID of the Google Drive folder where photos will be uploaded. Find it in the folder URL: https://drive.google.com/drive/folders/{FOLDER\_ID}

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

Your Google Cloud OAuth 2.0 Client ID. Takes priority over the GOOGLE\_CLIENT\_ID environment variable. Required when using your own Google Cloud project.

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

Your Google Cloud OAuth 2.0 Client Secret. Takes priority over the GOOGLE\_CLIENT\_SECRET environment variable.

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

OAuth 2.0 redirect URI registered in your Google Cloud project. Defaults to http://localhost if not provided.

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

Google OAuth2 refresh token. If provided, skips the interactive authorization flow entirely. Obtain one from the Google OAuth Playground (https://developers.google.com/oauthplayground) using your Client ID and Secret.

## `createMonthlySubfolders` (type: `boolean`):

Organize photos into monthly subfolders (2024-01, 2024-02, etc.) based on the date the photo was taken. Photos without date metadata go into an 'undated' folder.

## `maxPhotosToDownload` (type: `integer`):

Safety limit: stop after downloading this many photos. Useful for testing with large albums. Set to a small number (e.g. 10) on your first run to verify everything works.

## `concurrentDownloads` (type: `integer`):

Number of parallel photo downloads. Higher values are faster but increase the risk of rate limiting. Recommended: 2-4 for most use cases.

## `includeMetadataFiles` (type: `boolean`):

Save a .metadata.json sidecar file alongside each uploaded photo containing the original URL, date taken, file size, and MIME type.

## `skipIfDuplicateExists` (type: `boolean`):

If a file with the same name already exists in the destination folder, skip it instead of uploading a renamed copy. Useful when re-running the Actor on the same album.

## Actor input object example

```json
{
  "googlePhotosShareLink": "https://photos.app.goo.gl/AbCdEfGhIjKlMnOpQrStUvWxYz",
  "destinationFolderId": "1zyx9wvu8tsr7qpo9nml8kji7hug6fed",
  "googleRedirectUri": "http://localhost",
  "createMonthlySubfolders": true,
  "maxPhotosToDownload": 100000,
  "concurrentDownloads": 4,
  "includeMetadataFiles": true,
  "skipIfDuplicateExists": false
}
```

# Actor output Schema

## `dataset` (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 = {
    "googlePhotosShareLink": "https://photos.app.goo.gl/"
};

// Run the Actor and wait for it to finish
const run = await client.actor("nec/photos-to-drive-backup").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 = { "googlePhotosShareLink": "https://photos.app.goo.gl/" }

# Run the Actor and wait for it to finish
run = client.actor("nec/photos-to-drive-backup").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 '{
  "googlePhotosShareLink": "https://photos.app.goo.gl/"
}' |
apify call nec/photos-to-drive-backup --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Photos to Drive Backup",
        "description": "Download photos from public or shared Google Photos album links and upload them directly to your Google Drive. Automatically transfer images in bulk with no manual saving required.",
        "version": "1.0",
        "x-build-id": "TdiKenyRBkK9qp4K5"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/nec~photos-to-drive-backup/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-nec-photos-to-drive-backup",
                "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~photos-to-drive-backup/runs": {
            "post": {
                "operationId": "runs-sync-nec-photos-to-drive-backup",
                "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~photos-to-drive-backup/run-sync": {
            "post": {
                "operationId": "run-sync-nec-photos-to-drive-backup",
                "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": [
                    "googlePhotosShareLink",
                    "destinationFolderId"
                ],
                "properties": {
                    "googlePhotosShareLink": {
                        "title": "📸 Google Photos Share Link",
                        "type": "string",
                        "description": "Public share link from Google Photos. Supports short form (https://photos.app.goo.gl/...), long form (https://photos.google.com/share/...), and user-scoped (https://photos.google.com/u/N/share/...) URLs."
                    },
                    "sharePassword": {
                        "title": "🔒 Share Password (Optional)",
                        "type": "string",
                        "description": "Password if the Google Photos share is password-protected. Leave empty for public shares."
                    },
                    "destinationFolderId": {
                        "title": "📁 Google Drive Destination Folder ID",
                        "type": "string",
                        "description": "The ID of the Google Drive folder where photos will be uploaded. Find it in the folder URL: https://drive.google.com/drive/folders/{FOLDER_ID}"
                    },
                    "googleClientId": {
                        "title": "Google OAuth Client ID",
                        "type": "string",
                        "description": "Your Google Cloud OAuth 2.0 Client ID. Takes priority over the GOOGLE_CLIENT_ID environment variable. Required when using your own Google Cloud project."
                    },
                    "googleClientSecret": {
                        "title": "Google OAuth Client Secret",
                        "type": "string",
                        "description": "Your Google Cloud OAuth 2.0 Client Secret. Takes priority over the GOOGLE_CLIENT_SECRET environment variable."
                    },
                    "googleRedirectUri": {
                        "title": "Google OAuth Redirect URI",
                        "type": "string",
                        "description": "OAuth 2.0 redirect URI registered in your Google Cloud project. Defaults to http://localhost if not provided."
                    },
                    "oauthRefreshToken": {
                        "title": "OAuth Refresh Token",
                        "type": "string",
                        "description": "Google OAuth2 refresh token. If provided, skips the interactive authorization flow entirely. Obtain one from the Google OAuth Playground (https://developers.google.com/oauthplayground) using your Client ID and Secret."
                    },
                    "createMonthlySubfolders": {
                        "title": "🗂️ Create Monthly Subfolders",
                        "type": "boolean",
                        "description": "Organize photos into monthly subfolders (2024-01, 2024-02, etc.) based on the date the photo was taken. Photos without date metadata go into an 'undated' folder.",
                        "default": true
                    },
                    "maxPhotosToDownload": {
                        "title": "Max Photos to Download",
                        "minimum": 1,
                        "maximum": 100000,
                        "type": "integer",
                        "description": "Safety limit: stop after downloading this many photos. Useful for testing with large albums. Set to a small number (e.g. 10) on your first run to verify everything works.",
                        "default": 100000
                    },
                    "concurrentDownloads": {
                        "title": "⚡ Concurrent Downloads",
                        "minimum": 1,
                        "maximum": 16,
                        "type": "integer",
                        "description": "Number of parallel photo downloads. Higher values are faster but increase the risk of rate limiting. Recommended: 2-4 for most use cases.",
                        "default": 4
                    },
                    "includeMetadataFiles": {
                        "title": "🏷️ Include Metadata Files",
                        "type": "boolean",
                        "description": "Save a .metadata.json sidecar file alongside each uploaded photo containing the original URL, date taken, file size, and MIME type.",
                        "default": true
                    },
                    "skipIfDuplicateExists": {
                        "title": "Skip Duplicate Files",
                        "type": "boolean",
                        "description": "If a file with the same name already exists in the destination folder, skip it instead of uploading a renamed copy. Useful when re-running the Actor on the same album.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
