# Apple App Store Developer Portfolio Scraper (`automation-lab/apple-app-store-developer-portfolio-scraper`) Actor

🍎 Enumerate apps returned for Apple developer IDs across country storefronts. Export app metadata for ASO, monitoring, acquisition research, and publisher intelligence.

- **URL**: https://apify.com/automation-lab/apple-app-store-developer-portfolio-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Marketing, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Apple App Store Developer Portfolio Scraper

Turn an Apple developer ID into a structured inventory of the apps that publisher offers in each selected App Store country.

Use numeric developer IDs or paste public `apps.apple.com` developer URLs. The Actor calls Apple's anonymous Lookup service, normalizes every returned software record, and saves export-ready app metadata.

No Apple account, API key, browser, proxy, cookies, or private credentials are required.

### What does Apple App Store Developer Portfolio Scraper do?

This Actor enumerates apps associated with a supplied Apple publisher.

For every developer and storefront it can extract:

- 🍎 developer ID and developer name
- 📱 app ID, app name, and bundle ID
- 🗂️ primary genre and complete genre list
- 💵 price, formatted price, and currency
- ⭐ average rating and rating count
- 🆕 current version rating and rating count
- 🧩 version and minimum operating system
- 📅 first release and current-version release dates
- 🖼️ artwork and canonical App Store URL
- 📝 public app description
- 🌍 storefront, original query, source URL, and scrape time

One row represents one app in one storefront. This makes regional comparisons explicit instead of silently merging values that may differ by country.

### Who is it for?

#### ASO and mobile-market intelligence teams

Build repeatable publisher inventories for competitive research. Snapshot datasets on a schedule and compare app launches, removals, releases, ratings, or pricing.

#### App-acquisition scouts

Review the complete public portfolio returned for a potential acquisition target. Export bundle IDs and app URLs into a due-diligence sheet.

#### Ad-tech and vendor-risk researchers

Map apps back to a developer identity and monitor changes in the publisher's footprint.

#### Agencies

Create portfolio reports for multiple clients or competitors without manually opening every profile and app page.

#### Data engineers

Feed normalized records into warehouses, dashboards, alerts, webhooks, or enrichment pipelines.

### Why use this developer portfolio scraper?

Apple search is keyword-oriented and can mix unrelated publishers. A developer lookup starts from a deterministic publisher ID.

The Actor adds operational features around the public source:

- accepts both IDs and full profile URLs
- supports multiple country storefronts in one run
- validates malformed inputs before extraction
- retries transient source failures with bounded backoff
- deduplicates records within each storefront
- returns stable field names for downstream automation
- charges only for the run start and saved app records

### How it works

1. The Actor validates each developer identifier.
2. Developer URLs are converted to their numeric Apple IDs.
3. Each ID is paired with each requested storefront.
4. Apple's public Lookup endpoint is queried with `entity=software`.
5. The publisher record is discarded and software records are normalized.
6. Duplicate storefront/developer/app combinations are removed.
7. App rows are saved to the default Apify dataset.

If one developer/storefront request fails after retries, the Actor logs it and continues with the remaining pairs. If every source request fails, the run fails rather than reporting a misleading successful extraction.

### Input

The input has three fields.

| Field | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `developerIds` | string array | Yes | `389801255` prefill | Numeric IDs or Apple developer profile URLs |
| `countries` | string array | No | `us` | Two-letter App Store storefront codes |
| `maxAppsPerDeveloper` | integer | No | `200` | Maximum apps saved per developer and storefront, from 1 to 200 |

A small first run can use:

```json
{
  "developerIds": ["389801255"],
  "countries": ["us"],
  "maxAppsPerDeveloper": 20
}
````

To compare storefronts:

```json
{
  "developerIds": [
    "https://apps.apple.com/us/developer/meta-platforms-inc/id389801255"
  ],
  "countries": ["us", "gb", "de"],
  "maxAppsPerDeveloper": 200
}
```

Country codes are normalized to lowercase. Invalid values fail closed.

### Output data

Results are available in the default dataset as JSON, CSV, Excel, XML, RSS, or HTML.

| Field | Meaning |
| --- | --- |
| `developerId` | Numeric Apple publisher ID as a string |
| `developerName` | Publisher name returned by Apple |
| `appId` | Numeric Apple app ID as a string |
| `appName` | Public app title |
| `bundleId` | App bundle identifier |
| `primaryGenre` | Primary App Store genre |
| `genres` | All returned genre labels |
| `price` | Numeric storefront price |
| `currency` | ISO-like storefront currency code |
| `formattedPrice` | Apple's formatted price label |
| `averageRating` | Aggregate average user rating |
| `ratingCount` | Aggregate number of ratings |
| `currentVersionRating` | Rating for the current version |
| `currentVersionRatingCount` | Current-version rating count |
| `version` | Current version string |
| `firstReleaseDate` | Original release timestamp |
| `currentVersionReleaseDate` | Current-version release timestamp |
| `minimumOsVersion` | Minimum supported OS version |
| `contentAdvisoryRating` | Returned age/content label |
| `artworkUrl` | Highest-resolution returned artwork URL |
| `appStoreUrl` | Canonical public app URL |
| `description` | Public app description |
| `storefront` | Requested two-letter country code |
| `query` | Original supplied ID or URL |
| `sourceUrl` | Exact Lookup request URL |
| `scrapedAt` | UTC extraction timestamp |

### Example output

```json
{
  "developerId": "389801255",
  "developerName": "Meta Platforms, Inc.",
  "appId": "389801252",
  "appName": "Instagram",
  "bundleId": "com.burbn.instagram",
  "primaryGenre": "Photo & Video",
  "price": 0,
  "currency": "USD",
  "averageRating": 4.7,
  "ratingCount": 27000000,
  "version": "latest returned version",
  "storefront": "us",
  "appStoreUrl": "https://apps.apple.com/us/app/instagram/id389801252",
  "query": "389801255",
  "scrapedAt": "2026-07-19T00:00:00.000Z"
}
```

Values change over time and by storefront; the example illustrates shape rather than a guaranteed live value.

### How much does it cost to scrape Apple developer portfolios?

This Actor uses pay-per-event pricing.

- A small one-time **Start** event covers run initialization.
- An **App result** event is charged once for each dataset row saved.
- App-result prices use Apify's plan-based tiered discounts.

The current start price is **$0.005**. The formula-derived BRONZE app-result price is **$0.00012613 per row**, with lower SILVER through DIAMOND rates and a FREE-tier rate of $0.00014505. The exact price for your plan appears before a run and in the Actor's Pricing tab.

Runs that return fewer apps cost less. Test with one developer and one storefront before scheduling large regional monitoring jobs.

### Step-by-step guide

1. Open the Actor in Apify Console.
2. Find the publisher's Apple developer ID or public profile URL.
3. Add one or more identifiers under **Developers**.
4. Keep `us` or add other two-letter country codes.
5. Choose a maximum from 1 to 200.
6. Click **Start**.
7. Review logs for each completed developer/storefront pair.
8. Open **Dataset** and export or integrate the records.

### Portfolio monitoring workflow

Run the same input daily or weekly with an Apify schedule.

Store each snapshot in your warehouse, then compare records by:

- `storefront + developerId + appId` for identity
- missing or new app IDs for removals and launches
- `version` or `currentVersionReleaseDate` for releases
- `price` and `currency` for commercial changes
- `averageRating` and `ratingCount` for reputation movement

Apify webhooks can trigger a diff service after every successful run.

### Regional availability workflow

Supply the same developer with multiple countries.

Because each row retains `storefront`, analysts can group by app ID and identify:

- apps present in one country but absent in another
- regional price and currency differences
- rating/count differences across storefronts
- regional App Store URLs

A missing app can mean regional unavailability or that Apple did not include it in the capped Lookup response. Treat the source limitation explicitly.

### Integrations

#### Google Sheets and Excel

Export CSV or Excel directly from the dataset for portfolio audits and client reports.

#### Webhooks

Send a successful-run webhook to Zapier, Make, n8n, or an internal endpoint. Use the dataset ID from the run payload to retrieve rows.

#### Data warehouses

Use the Apify API client to load snapshots into BigQuery, Snowflake, PostgreSQL, or object storage.

#### Slack and email alerts

Diff the newest dataset against the previous snapshot and alert when app IDs, prices, or versions change.

#### Other Apify Actors

Chain the returned app URLs or IDs into a detail, review, privacy-label, or similar-app workflow.

### API usage with Node.js

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/apple-app-store-developer-portfolio-scraper').call({
  developerIds: ['389801255'],
  countries: ['us', 'gb'],
  maxAppsPerDeveloper: 200,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### API usage with Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/apple-app-store-developer-portfolio-scraper').call(run_input={
    'developerIds': ['389801255'],
    'countries': ['us'],
    'maxAppsPerDeveloper': 20,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### API usage with cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~apple-app-store-developer-portfolio-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"developerIds":["389801255"],"countries":["us"],"maxAppsPerDeveloper":20}'
```

Fetch dataset records after the run finishes:

```bash
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?clean=true&format=json"
```

### Use with Apify MCP and AI agents

Connect AI tools to:

`https://mcp.apify.com?tools=automation-lab/apple-app-store-developer-portfolio-scraper`

#### Claude Code setup

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/apple-app-store-developer-portfolio-scraper"
```

#### Claude Desktop setup

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/apple-app-store-developer-portfolio-scraper"
    }
  }
}
```

#### Cursor setup

Add the same HTTP MCP URL to **Settings → Tools & MCP → New MCP Server**.

#### VS Code setup

Add the same HTTP endpoint to your workspace MCP server configuration, then enable the Apify server in the MCP panel.

Example prompts:

- “List the US App Store portfolio for developer 389801255.”
- “Compare this Apple publisher's apps in the US, UK, and Germany.”
- “Return bundle IDs and release dates as a compact table.”
- “Run this weekly and summarize newly observed app IDs.”

### Data quality and deduplication

The Actor only saves returned records that contain an app ID, app name, developer ID/name, bundle ID, and canonical URL.

Deduplication uses storefront, developer ID, and app ID. The same app can intentionally appear once per requested storefront because availability and metadata can differ.

Nullable source values remain `null`; numeric counts default to zero and genre arrays default to an empty array. This preserves predictable output types.

### Limits

Apple's Lookup response is capped at **200 requested software results per developer and storefront**. The Actor cannot promise portfolio completeness beyond Apple's returned set.

Other practical limits:

- at most 100 developer inputs per run
- at most 20 storefronts per run
- sequential requests to avoid unnecessary source pressure
- three bounded attempts for transient HTTP or timeout failures
- public metadata only; no private analytics or developer-console data

Apple can change or retire the endpoint without notice.

### Responsible and legal use

The Actor retrieves public App Store metadata without bypassing login or access controls.

You are responsible for your use of the data. Follow Apple's applicable terms, database rights, privacy laws, contractual requirements, and local regulations.

Do not use public publisher or app metadata to make unlawful discriminatory decisions, impersonate developers, or misrepresent affiliation with Apple.

This Actor is not affiliated with or endorsed by Apple Inc.

### Troubleshooting

#### “Invalid developer identifier”

Use digits only, such as `389801255`, or a full URL whose path contains `/developer/<name>/id<digits>` on `apps.apple.com`.

#### “countries must contain two-letter storefront country codes”

Use codes such as `us`, `gb`, `de`, `fr`, or `jp`. Do not use language tags like `en-US`.

#### The run succeeded with zero rows

Apple may return no software records for that developer/storefront pair. Confirm the developer ID and try the profile's visible country storefront.

#### One storefront failed

Read the run log. The Actor retries transient failures and continues with other pairs. Re-run later if Apple temporarily rejected or timed out the request.

#### An app visible on the profile is absent

The Lookup endpoint can return a storefront-specific and source-capped set. The Actor reports what Apple returned and does not claim completeness beyond 200.

### Tips for reliable recurring runs

- Start with one known publisher and the `us` storefront.
- Preserve `sourceUrl` and `scrapedAt` for auditability.
- Compare app IDs instead of names because titles can change.
- Keep country codes stable between snapshots.
- Schedule at a cadence that matches your decision process rather than polling continuously.
- Store historical snapshots before applying destructive updates.

### Related scrapers

- [Apple App Store Scraper](https://apify.com/automation-lab/apple-app-store-scraper) — search apps, fetch known app IDs, and collect reviews.
- [Apple App Store Charts Scraper](https://apify.com/automation-lab/apple-app-store-charts-scraper) — monitor ranked chart positions.
- [Apple App Store Privacy Labels Scraper](https://apify.com/automation-lab/apple-app-store-privacy-labels-scraper) — collect app privacy disclosures.

Choose this Actor when the starting entity is a **developer/publisher** and the desired output is its returned app portfolio.

### FAQ

#### Does it require an Apple developer account?

No. It uses a public anonymous Apple Lookup response.

#### Does it use a browser or proxy?

No. It is an HTTP/API Actor, which keeps execution fast and inexpensive.

#### Can I enter an app ID instead of a developer ID?

No. Supply the publisher's developer ID. An app ID identifies one app and is a different lookup workflow.

#### Can I scrape more than 200 apps for one developer?

Not through this source. Apple caps the requested Lookup set at 200, and the Actor discloses that limit instead of claiming a complete set beyond it.

#### Why is the same app repeated?

If you request multiple storefronts, one row per app/storefront is intentional. Use `storefront + developerId + appId` as the composite identity.

#### Are ratings globally comparable?

No. Rating values and counts can differ by storefront and over time.

#### Can I schedule it?

Yes. Use Apify schedules, then trigger a webhook or integration after successful runs.

#### What happens when one developer ID is unavailable?

A valid empty source response produces no rows for that pair. Transport failures are retried and logged; other pairs continue.

### Build a publisher intelligence pipeline

A useful repeat workflow combines:

1. this Actor for publisher-to-app enumeration,
2. a scheduled snapshot,
3. warehouse storage keyed by storefront/developer/app,
4. a diff job for launches, removals, versions, prices, and ratings,
5. alerts and a dashboard for analysts.

That pipeline turns a public developer profile into structured, reviewable market intelligence without manual app-by-app collection.

# Actor input Schema

## `developerIds` (type: `array`):

Apple developer IDs such as 389801255 or apps.apple.com developer URLs.

## `countries` (type: `array`):

Two-letter country codes. Apps, prices, ratings, and availability can differ by storefront.

## `maxAppsPerDeveloper` (type: `integer`):

Stop after this many apps from each developer/storefront pair.

## Actor input object example

```json
{
  "developerIds": [
    "389801255"
  ],
  "countries": [
    "us"
  ],
  "maxAppsPerDeveloper": 20
}
```

# Actor output Schema

## `overview` (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 = {
    "developerIds": [
        "389801255"
    ],
    "countries": [
        "us"
    ],
    "maxAppsPerDeveloper": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/apple-app-store-developer-portfolio-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "developerIds": ["389801255"],
    "countries": ["us"],
    "maxAppsPerDeveloper": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/apple-app-store-developer-portfolio-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "developerIds": [
    "389801255"
  ],
  "countries": [
    "us"
  ],
  "maxAppsPerDeveloper": 20
}' |
apify call automation-lab/apple-app-store-developer-portfolio-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=automation-lab/apple-app-store-developer-portfolio-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Apple App Store Developer Portfolio Scraper",
        "description": "🍎 Enumerate apps returned for Apple developer IDs across country storefronts. Export app metadata for ASO, monitoring, acquisition research, and publisher intelligence.",
        "version": "0.1",
        "x-build-id": "V1SJ1oPmUJo0JAFlX"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/automation-lab~apple-app-store-developer-portfolio-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-automation-lab-apple-app-store-developer-portfolio-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/automation-lab~apple-app-store-developer-portfolio-scraper/runs": {
            "post": {
                "operationId": "runs-sync-automation-lab-apple-app-store-developer-portfolio-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/automation-lab~apple-app-store-developer-portfolio-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-automation-lab-apple-app-store-developer-portfolio-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "developerIds"
                ],
                "properties": {
                    "developerIds": {
                        "title": "Developer IDs or URLs",
                        "minItems": 1,
                        "maxItems": 100,
                        "type": "array",
                        "description": "Apple developer IDs such as 389801255 or apps.apple.com developer URLs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "countries": {
                        "title": "Storefront country codes",
                        "minItems": 1,
                        "maxItems": 20,
                        "type": "array",
                        "description": "Two-letter country codes. Apps, prices, ratings, and availability can differ by storefront.",
                        "default": [
                            "us"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxAppsPerDeveloper": {
                        "title": "Maximum apps per developer and storefront",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Stop after this many apps from each developer/storefront pair.",
                        "default": 200
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
