# ZIP Extractor (`mikolabs/zip-extractor`) Actor

Upload any file type or provide a URL, automatically extract archives (ZIP, RAR, TAR, 7Z), categorize files intelligently, and get structured output in milliseconds with download links. Supports flexible storage policies (permanent or expiry-based) with automatic cleanup.

- **URL**: https://apify.com/mikolabs/zip-extractor.md
- **Developed by:** [mikolabs](https://apify.com/mikolabs) (community)
- **Categories:** Developer tools, Other, Automation
- **Stats:** 5 total users, 1 monthly users, 0.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## Zip Extractor Actor (Apify)

<p align="center">
  <a href="https://apify.com/mikolabs/zip-extractor">
    <img src="https://img.shields.io/badge/Apify-Zip%20Extractor-blue?logo=apify&logoColor=white" />
  </a>
  <a href="https://www.python.org/">
    <img src="https://img.shields.io/badge/Python-3.10+-3776AB?logo=python&logoColor=white" />
  </a>
  <a href="LICENSE">
    <img src="https://img.shields.io/badge/License-MIT-green" />
  </a>
  <img src="https://img.shields.io/badge/Status-Production%20Ready-success" />
</p>

---


A comprehensive Apify Actor that accepts **any file type** (uploaded or via URL), automatically extracts archives, categorizes files intelligently, and provides structured output with download and review capabilities.

### 🌟 Key Features

- **Universal File Support**: Upload or provide URLs for any file type
- **Smart Archive Extraction**: Automatically detects and extracts ZIP, RAR, TAR, 7Z, GZIP, BZIP2, XZ archives
- **Intelligent Categorization**: Files are grouped into categories (images, videos, documents, data, code, etc.)
- **Flexible Storage Policies**: Choose permanent storage or set expiration times (TTL or absolute date)
- **Public Download Links**: Every file gets a direct download URL
- **Preview Generation**: Automatic thumbnail generation for images
- **Structured Output**: JSON output grouped by file type for easy UI integration
- **Cleanup Automation**: Scheduled cleanup Actor to delete expired files
- **Size Protection**: Configurable limits to prevent storage abuse

### 📦 Supported Archive Formats

| Format | Extensions | Notes |
|--------|------------|-------|
| ZIP | `.zip` | Full support (built-in) |
| TAR | `.tar`, `.tar.gz`, `.tgz` | Full support (built-in) |
| GZIP | `.gz` | Single file compression |
| BZIP2 | `.bz2` | Single file compression |
| XZ | `.xz` | Single file compression |
| RAR | `.rar` | Requires unrar (included in Docker) |
| 7-Zip | `.7z` | Full support via py7zr |

### 📂 File Categories

Files are automatically categorized into:

- **Images**: JPG, PNG, GIF, WebP, SVG, BMP, TIFF, ICO
- **Videos**: MP4, AVI, MKV, MOV, WMV, FLV, WebM
- **Audio**: MP3, WAV, OGG, FLAC, AAC, M4A
- **Documents**: PDF, DOC, DOCX, XLS, XLSX, PPT, PPTX, TXT, RTF
- **Data**: CSV, JSON, XML, YAML
- **Archives**: ZIP, RAR, 7Z, TAR, GZ, BZ2, XZ
- **Code**: PY, JS, Java, C, C++, HTML, CSS, SH
- **Other**: Everything else

### 🚀 How to Use

#### Option 1: Upload File via Apify Console

1. Go to the Actor in Apify Console
2. Click "Upload file" in the input section
3. Select your file (it will be stored as key `INPUT` in the input KVS)
4. Configure storage policy and other options
5. Click "Start"

#### Option 2: Provide a Public URL

1. Enter the file URL in the `fileUrl` field
2. Configure storage policy and other options
3. Click "Start"

#### Option 3: Via API

```javascript
const { ApifyClient } = require('apify-client');

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('YOUR_ACTOR_ID').call({
  fileUrl: 'https://example.com/archive.zip',
  extractArchives: true,
  storePolicy: 'expire',
  retainSeconds: 604800, // 7 days
  generatePreviews: true,
  maxFileSize: 500,
  maxTotalSize: 2048
});

const { defaultDatasetId } = run;
const { items } = await client.dataset(defaultDatasetId).listItems();

console.log('Extracted files:', items);
````

### 📥 Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `fileUrl` | string | No | - | Public URL to download the file |
| `uploadedFileKey` | string | No | `INPUT` | Key for file uploaded to input KVS |
| `extractArchives` | boolean | No | `true` | Auto-extract archive files |
| `storePolicy` | enum | No | `expire` | Storage policy: `permanent` or `expire` |
| `retainSeconds` | integer | No | `604800` | TTL in seconds (7 days default) |
| `expireAt` | string | No | - | Absolute expiration (ISO datetime) |
| `generatePreviews` | boolean | No | `true` | Generate image thumbnails |
| `maxFileSize` | integer | No | `500` | Max file size in MB |
| `maxTotalSize` | integer | No | `2048` | Max total extraction size in MB |

### 📤 Output Structure

The Actor produces a structured JSON output saved to the Key-Value Store under the `OUTPUT` key:

```json
{
  "runId": "abc123xyz",
  "totalFiles": 25,
  "totalSize": 12345678,
  "storagePolicy": "expire",
  "expiresAt": "2026-02-01T12:00:00Z",
  "grouped": {
    "images": [
      {
        "filename": "photo1.jpg",
        "size": 123456,
        "downloadUrl": "https://api.apify.com/v2/key-value-stores/.../records/...",
        "previewUrl": "https://api.apify.com/v2/key-value-stores/.../records/...",
        "expiresAt": "2026-02-01T12:00:00Z"
      }
    ],
    "videos": [...],
    "documents": [...],
    "data": [...],
    "code": [...],
    "other": [...]
  },
  "archives": [
    {
      "filename": "photos.zip",
      "extractedFiles": 15
    }
  ]
}
```

#### Dataset Records

Each extracted file also has a detailed record in the Dataset:

```json
{
  "runId": "abc123xyz",
  "filename": "photo.jpg",
  "relativePath": "photos/photo.jpg",
  "originalArchive": "photos.zip",
  "kvsKey": "files/abc123xyz/photos/photo.jpg",
  "category": "images",
  "mimeType": "image/jpeg",
  "size": 123456,
  "downloadUrl": "https://api.apify.com/v2/...",
  "isPermanent": false,
  "expiresAt": "2026-02-01T12:00:00Z",
  "savedAt": "2026-01-24T18:01:52Z",
  "hasPreview": true,
  "previewUrl": "https://api.apify.com/v2/..."
}
```

### 🗑️ Cleanup Actor

To automatically delete expired files, deploy the cleanup Actor and schedule it:

#### Deploy Cleanup Actor

1. Create a new Actor in Apify Console
2. Copy the contents of `src/cleanup.py` to the new Actor's `main.py`
3. Use the same `Dockerfile` and `requirements.txt`
4. Deploy the Actor

#### Schedule Cleanup

1. Go to the cleanup Actor's page
2. Click "Schedules" → "Create new"
3. Set frequency (e.g., daily at 2 AM)
4. The cleanup Actor will scan for expired files and delete them

#### Cleanup Output

```json
{
  "cleanupRun": "2026-01-25T02:00:00Z",
  "totalRecords": 150,
  "deleted": 23,
  "skipped": 125,
  "errors": 2
}
```

### 💡 Use Cases

#### 1. **Media Library Management**

Upload ZIP archives of photos/videos, get organized output with previews and download links.

#### 2. **Document Processing**

Extract and categorize documents from archives for further processing.

#### 3. **Data Pipeline**

Download data files (CSV, JSON) from URLs, extract if archived, and feed to other Actors.

#### 4. **Backup & Archive Service**

Store files with expiration policies for temporary backup needs.

#### 5. **File Conversion Workflows**

Extract files, categorize them, and route to appropriate conversion Actors.

### 🔒 Security & Privacy

> **⚠️ Important**: All files stored in the Key-Value Store will have **public download URLs**. Do not upload sensitive or confidential data unless you understand the security implications.

**Best Practices:**

- Use expiration policies for sensitive data (don't use permanent storage)
- Consider encrypting sensitive files before upload
- Monitor access logs if handling user data
- Implement additional authentication layers if needed

### 🎯 Storage Policies Explained

#### Permanent Storage

- Files are stored until manually deleted
- No automatic cleanup
- Use for: Long-term archives, public assets, reference files

#### Expiry-Based Storage

- Files are automatically deleted after expiration
- Set via `retainSeconds` (relative) or `expireAt` (absolute)
- Cleanup Actor must be scheduled to run periodically
- Use for: Temporary uploads, processing pipelines, time-limited sharing

**Example: 24-hour temporary storage**

```json
{
  "fileUrl": "https://example.com/temp.zip",
  "storePolicy": "expire",
  "retainSeconds": 86400
}
```

**Example: Expire on specific date**

```json
{
  "fileUrl": "https://example.com/event.zip",
  "storePolicy": "expire",
  "expireAt": "2026-02-01T00:00:00Z"
}
```

### 📊 Size Limits & Protection

To prevent abuse and control costs:

- **Max File Size**: Default 500MB per file (configurable up to 2GB)
- **Max Total Size**: Default 2GB per run (configurable up to 10GB)
- **Archive Bomb Protection**: Extraction stops if limits are exceeded
- **Memory Efficient**: Streaming downloads and extraction

### 🛠️ Development

#### Local Testing

```bash
## Install dependencies
pip install -r requirements.txt

## Set up Apify token
export APIFY_TOKEN=your_token_here

## Run locally
apify run
```

#### Input for Local Testing

Create `.actor/INPUT.json`:

```json
{
  "fileUrl": "https://example.com/test.zip",
  "extractArchives": true,
  "storePolicy": "expire",
  "retainSeconds": 3600
}
```

### 🐛 Troubleshooting

#### "No file found with key 'INPUT'"

- Make sure you uploaded a file in the Apify Console
- Or provide a `fileUrl` instead

#### "Unsupported archive format"

- Check if the file extension is supported
- Some formats (like password-protected archives) are not supported

#### "File exceeds maximum size"

- Increase `maxFileSize` or `maxTotalSize` parameters
- Or split your archive into smaller parts

#### Extraction fails silently

- Check Actor logs for detailed error messages
- Verify the archive is not corrupted
- Ensure the archive format is supported

### 📚 API Reference

#### Apify SDK Documentation

- [Key-Value Store](https://docs.apify.com/platform/storage/key-value-store)
- [Dataset](https://docs.apify.com/platform/storage/dataset)
- [Python SDK](https://docs.apify.com/sdk/python)

#### Related Actors

- Use with file conversion Actors
- Chain with data processing Actors
- Integrate with notification Actors

### 🛠️ Apify API Endpoints

#### Run Actor (Async)

```http
POST https://api.apify.com/v2/acts/mikolabs~zip-extractor/runs?token=***
```

***

#### Run Actor Sync + Get OUTPUT

```http
POST https://api.apify.com/v2/acts/mikolabs~zip-extractor/run-sync?token=***
```

***

#### Run Sync + Return Dataset Items

```http
POST https://api.apify.com/v2/acts/mikolabs~zip-extractor/run-sync-get-dataset-items?token=***
```

***

#### Get Actor Details

```http
GET https://api.apify.com/v2/acts/mikolabs~zip-extractor?token=***
```

***

#### OpenAPI Definition

```http
GET https://api.apify.com/v2/acts/mikolabs~zip-extractor/builds/default/openapi.json
```

***

### 📝 License

This Actor is provided as-is for use on the Apify platform.

### 🤝 Support

For issues, questions, or feature requests:

- Check the [Apify Documentation](https://docs.apify.com)
- Contact support via Apify Console
- Review Actor logs for detailed error messages

***

**Built with ❤️ for the Apify platform**

# Actor input Schema

## `inputFile` (type: `string`):

Upload one file directly (ZIP, PDF, images, etc.). Overrides URL and store inputs.

## `inputFiles` (type: `array`):

Upload multiple files in one step. Overrides URL and store inputs.

## `fileUrl` (type: `string`):

Provide a public URL if you prefer not to upload files manually.

## `sourceStore` (type: `string`):

Select a key‑value store containing the file.

## `sourceKey` (type: `string`):

Exact key name inside the selected store (for example: archive.zip).

## `extractArchives` (type: `boolean`):

Automatically extract ZIP, RAR, TAR, 7Z archives.

## `recursiveExtraction` (type: `boolean`):

Extract archives inside archives (up to 5 levels deep).

## `generatePreviews` (type: `boolean`):

Automatically create thumbnails for image files.

## `storePolicy` (type: `string`):

Choose how long extracted files should remain stored.

## `retainSeconds` (type: `integer`):

Applies only if Expire policy is selected. Default = 7 days.

## `expireAt` (type: `string`):

Optional ISO datetime override.

## `maxFileSize` (type: `integer`):

Files exceeding this size are skipped.

## `maxTotalSize` (type: `integer`):

Stops extraction if total extracted size exceeds this limit.

## Actor input object example

```json
{
  "inputFile": "https://api.apify.com/v2/key-value-stores/tELltAsAMBmzRgt1Z/records/image1.zip",
  "extractArchives": true,
  "recursiveExtraction": true,
  "generatePreviews": true,
  "storePolicy": "expire",
  "retainSeconds": 604800,
  "maxFileSize": 500,
  "maxTotalSize": 2048
}
```

# Actor output Schema

## `allFilesDataset` (type: `string`):

Complete dataset of extracted files with metadata.

## `overviewTable` (type: `string`):

Dataset displayed in table format.

## `filesGroupedByCategory` (type: `string`):

Grouped dataset view (images, videos, documents...).

## `storedFilesKeyValueStore` (type: `string`):

Raw extracted files stored in KV store.

## `metadataJson` (type: `string`):

Complete metadata summary JSON stored in KV store

# 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 = {
    "inputFile": "https://api.apify.com/v2/key-value-stores/tELltAsAMBmzRgt1Z/records/image1.zip",
    "fileUrl": "",
    "sourceKey": "",
    "expireAt": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("mikolabs/zip-extractor").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 = {
    "inputFile": "https://api.apify.com/v2/key-value-stores/tELltAsAMBmzRgt1Z/records/image1.zip",
    "fileUrl": "",
    "sourceKey": "",
    "expireAt": "",
}

# Run the Actor and wait for it to finish
run = client.actor("mikolabs/zip-extractor").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 '{
  "inputFile": "https://api.apify.com/v2/key-value-stores/tELltAsAMBmzRgt1Z/records/image1.zip",
  "fileUrl": "",
  "sourceKey": "",
  "expireAt": ""
}' |
apify call mikolabs/zip-extractor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "ZIP Extractor",
        "description": "Upload any file type or provide a URL, automatically extract archives (ZIP, RAR, TAR, 7Z), categorize files intelligently, and get structured output in milliseconds with download links. Supports flexible storage policies (permanent or expiry-based) with automatic cleanup.",
        "version": "0.0",
        "x-build-id": "FEglqmyxgNidQ2XD5"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/mikolabs~zip-extractor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-mikolabs-zip-extractor",
                "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/mikolabs~zip-extractor/runs": {
            "post": {
                "operationId": "runs-sync-mikolabs-zip-extractor",
                "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/mikolabs~zip-extractor/run-sync": {
            "post": {
                "operationId": "run-sync-mikolabs-zip-extractor",
                "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": {
                    "inputFile": {
                        "title": "📄 Upload Single File",
                        "type": "string",
                        "description": "Upload one file directly (ZIP, PDF, images, etc.). Overrides URL and store inputs.",
                        "default": "https://api.apify.com/v2/key-value-stores/tELltAsAMBmzRgt1Z/records/image1.zip"
                    },
                    "inputFiles": {
                        "title": "📑 Upload Multiple Files",
                        "type": "array",
                        "description": "Upload multiple files in one step. Overrides URL and store inputs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "fileUrl": {
                        "title": "🌐 File Download URL",
                        "type": "string",
                        "description": "Provide a public URL if you prefer not to upload files manually."
                    },
                    "sourceStore": {
                        "title": "🗃 Source Key-Value Store",
                        "type": "string",
                        "description": "Select a key‑value store containing the file."
                    },
                    "sourceKey": {
                        "title": "🔑 File Key Name",
                        "type": "string",
                        "description": "Exact key name inside the selected store (for example: archive.zip)."
                    },
                    "extractArchives": {
                        "title": "📦 Enable Archive Extraction",
                        "type": "boolean",
                        "description": "Automatically extract ZIP, RAR, TAR, 7Z archives.",
                        "default": true
                    },
                    "recursiveExtraction": {
                        "title": "🌀 Recursive Nested Extraction",
                        "type": "boolean",
                        "description": "Extract archives inside archives (up to 5 levels deep).",
                        "default": true
                    },
                    "generatePreviews": {
                        "title": "🖼 Generate Image Previews",
                        "type": "boolean",
                        "description": "Automatically create thumbnails for image files.",
                        "default": true
                    },
                    "storePolicy": {
                        "title": "🕒 File Retention Policy",
                        "enum": [
                            "permanent",
                            "expire"
                        ],
                        "type": "string",
                        "description": "Choose how long extracted files should remain stored.",
                        "default": "expire"
                    },
                    "retainSeconds": {
                        "title": "⏳ Retain Duration (Seconds)",
                        "minimum": 3600,
                        "maximum": 31536000,
                        "type": "integer",
                        "description": "Applies only if Expire policy is selected. Default = 7 days.",
                        "default": 604800
                    },
                    "expireAt": {
                        "title": "📅 Absolute Expiry Timestamp",
                        "type": "string",
                        "description": "Optional ISO datetime override."
                    },
                    "maxFileSize": {
                        "title": "📏 Max File Size (MB)",
                        "minimum": 1,
                        "maximum": 2048,
                        "type": "integer",
                        "description": "Files exceeding this size are skipped.",
                        "default": 500
                    },
                    "maxTotalSize": {
                        "title": "📦 Max Total Extracted Size (MB)",
                        "minimum": 10,
                        "maximum": 10240,
                        "type": "integer",
                        "description": "Stops extraction if total extracted size exceeds this limit.",
                        "default": 2048
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
