# 🛒 Shopify App Store Scraper (`skootle/shopify-app-store-scraper`) Actor

Scrape Shopify App Store listings: name, tagline, description, rating, review count, pricing tiers, BFS badge, categories, developer info. Watchlist mode tracks rating/review changes day-over-day. Export, run via API, schedule, or integrate with other tools.

- **URL**: https://apify.com/skootle/shopify-app-store-scraper.md
- **Developed by:** [Skootle](https://apify.com/skootle) (community)
- **Categories:** E-commerce, AI, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 1,000 shopify app records

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

![Shopify App Store hero](https://raw.githubusercontent.com/kesjam/skootle-actors-assets/main/heroes/shopify-app-store.png)

### TL;DR

Scrape any Shopify App Store listing for full app metadata: name, tagline, description, icon, rating, review count, pricing model, pricing tiers, Built for Shopify badge, categories, languages, developer info. Watchlist mode emits only apps where rating or review count changed since the previous run, so daily diffs surface competitor momentum signals. Built on Shopify's public listing pages with JSON-LD parsing and HTML fallback.

---

<!-- skootle:review-cta -->
> Try it on a small dataset, then let us know what you think in a [review](https://apify.com/skootle/shopify-app-store-scraper/reviews).

---

### What does Shopify App Store Scraper do?

Shopify App Store Scraper extracts everything visible on a Shopify App Store listing page. You give it a list of app handles (the slug after `apps.shopify.com/`); it returns one record per app with: name, tagline, description, icon URL, rating value, review count, pricing model (`free`, `free_to_install`, `free_plan_available`, `paid`, `one_time`, `unknown`), pricing tier breakdown with prices and billing periods, Built for Shopify badge presence, categories, languages supported, "works with" integrations, and developer info.

The actor reads each listing's embedded JSON-LD (Schema.org `SoftwareApplication`) for the canonical name + rating + description, and parses the surrounding HTML for everything not in the JSON-LD: pricing tier cards, BFS badge, categories, developer link, languages, "works with" list.

Watchlist mode (`watchlistMode: true`) tracks `ratingValue` and `ratingCount` per app across runs and emits only the apps where either changed. Schedule daily and you get a diff feed of which apps are gaining or losing reviews.

### Why scrape the Shopify App Store?

The Shopify App Store is the largest e-commerce SaaS marketplace on the planet, with 8,000+ apps spanning every Shopify merchant workflow. Tracking competitor reviews, pricing changes, BFS badge gains/losses, and category-wide momentum is high-signal for app developers, M&A scouts, market researchers, and AI-powered competitive intelligence.

Shopify doesn't expose a public API for app discovery or app metadata, and the listing pages are partly client-rendered. This actor handles the JSON-LD extraction + HTML parsing so you get clean structured records instead of HTML strings.

### Who needs this?

- **Shopify app developers** monitoring competitor apps for pricing changes, rating shifts, and BFS badge events
- **M&A scouts** screening for fast-growing acquisition targets in the Shopify ecosystem
- **Market researchers** measuring category-wide momentum (top 50 reviews/marketing/fulfillment apps)
- **App-marketing consultants** benchmarking pricing tier structures across competitors
- **VC analysts** sourcing Shopify-native startups for early-stage investment
- **AI agents** building "recommend Shopify apps for this stack" features
- **Acquisition operators** building portfolio dashboards across multiple Shopify apps

### How to use Shopify App Store Scraper

1. Open the **Input** tab on the actor page
2. Add app handles (the slug after `apps.shopify.com/`) to the `appHandles` field. Full URLs work too — the actor strips the prefix.
3. Set `maxItems` (default 50)
4. Optionally enable `watchlistMode` for daily scheduled runs that only return apps where rating/reviews changed
5. Click **Start** or call via the Apify REST API or CLI

You can find app handles by browsing the Shopify App Store and copying the URL slug (e.g., `apps.shopify.com/loox` → `loox`).

### How much will scraping the Shopify App Store cost?

This actor is priced per event:

- **Actor Start**: $0.01 once per run
- **Shopify app record**: tiered, charged per record written

| Apify plan | $/1000 records |
|---|---|
| FREE | $40.00 |
| BRONZE | $34.00 |
| SILVER | $28.00 |
| GOLD | $22.00 |
| PLATINUM | $22.00 |
| DIAMOND | $19.80 |

A typical daily competitor watchlist of 25 apps in your category returns ~25 records on day 1, then 0-5 per day in watchlist mode (only apps that gained/lost reviews). Roughly $0.55-$0.65 per daily run on the GOLD plan after the first.

### Is it legal to scrape the Shopify App Store?

Yes, listing pages are publicly accessible to anyone in a browser without logging in. This actor reads the same data Google's crawler reads, with proper rate limiting (1.1 second delay between requests) and a respectful User-Agent. It does not log in to merchant Shopify admins, does not access merchant private data, and does not bypass any technical access control.

The data scraped (app metadata, ratings, prices) is published by Shopify as marketing material specifically intended to be discoverable. Use it freely for research, competitive analysis, AI training, or commercial intelligence products. Reselling raw datasets verbatim may run afoul of Shopify's terms — consult your legal counsel for commercial redistribution.

### Examples

#### Example 1: Track top 5 review apps daily

```json
{
  "appHandles": ["loox", "judgeme-product-reviews", "yotpo-social-reviews", "stamped", "vitals"],
  "watchlistMode": true,
  "maxItems": 5
}
````

#### Example 2: Snapshot a single app

```json
{
  "appHandles": ["loox"],
  "maxItems": 1
}
```

#### Example 3: BFS-badge tracker on email-marketing apps

```json
{
  "appHandles": ["klaviyo-email-marketing-sms", "shopify-email", "omnisend-email-marketing-sms", "privy", "smile-rewards-program"],
  "watchlistMode": true,
  "maxItems": 5
}
```

Filter the output downstream for `builtForShopify: true`.

#### Example 4: Pricing benchmark across the Reviews category

```json
{
  "appHandles": ["loox", "judgeme-product-reviews", "yotpo-social-reviews", "stamped", "okendo", "ali-reviews", "rivo-reviews", "vitals"],
  "maxItems": 10
}
```

Aggregate `pricingTiers[]` downstream to compute median entry price, free-plan availability rate, and tier-count distribution.

#### Example 5: Acquisition-target watchlist

```json
{
  "appHandles": ["app-1", "app-2", "app-3", "...", "app-200"],
  "watchlistMode": true,
  "maxItems": 200
}
```

Run weekly. Sort the diff output by `ratingCount` delta to find apps gaining reviews (and presumably revenue) fast.

#### Example 6: Developer-portfolio audit

Pull every app from a single developer (find their handles by browsing their developer page on Apps Shopify):

```json
{
  "appHandles": ["app-by-loox-1", "app-by-loox-2", "app-by-loox-3"],
  "maxItems": 5
}
```

#### Example 7: Single-app fast snapshot for an AI agent

```json
{
  "appHandles": ["klaviyo-email-marketing-sms"],
  "useApifyProxy": false,
  "maxItems": 1
}
```

The agent can call the actor synchronously and consume the agentMarkdown directly for chat-context grounding.

### Input parameters

| Field | Type | Default | Description |
|---|---|---|---|
| `appHandles` | string\[] | sample apps | Slugs (e.g., `loox`) or full URLs (the prefix is stripped). |
| `watchlistMode` | bool | `false` | Diff against KV-stored rating/review snapshots. |
| `maxItems` | int | `50` | Hard cap on apps saved. |
| `useApifyProxy` | bool | `true` | Apify residential proxy. Recommended. |
| `apifyProxyGroups` | string\[] | `["RESIDENTIAL"]` |  |

### Pricing model enum

| Value | Meaning |
|---|---|
| `free` | App is free, no upgrade path |
| `free_to_install` | App installs free, may charge per-event |
| `free_plan_available` | Has free tier + paid plans |
| `paid` | All plans paid, no free tier |
| `one_time` | Single one-time payment |
| `unknown` | Couldn't classify from listing |

### Shopify App Store output format

#### `shopify_app`

| Field | Type | Description |
|---|---|---|
| `outputSchemaVersion` | string | Versioned literal (`'2026-05-08'`) |
| `recordType` | literal | `'shopify_app'` |
| `recordId` | string | `shopify:app:<handle>` |
| `appHandle`, `url` | string | Slug + canonical URL |
| `name`, `tagline`, `description` | string | Marketing copy |
| `iconUrl` | string | App icon (Shopify CDN URL) |
| `ratingValue` | float | 0.0-5.0 |
| `ratingCount` | int | Number of reviews |
| `pricingModel` | enum | See enum table above |
| `pricingHeadline` | string | Pricing summary string ("Free plan available", "From $19/month", etc.) |
| `hasFreePlan`, `hasFreeTrial` | bool | Pricing flags |
| `pricingTiers` | array | `[{ name, priceUsd, billingPeriod, description }]` |
| `categories` | string\[] | Shopify-assigned category names |
| `builtForShopify` | bool | BFS badge presence |
| `worksWith` | string\[] | Listed integrations |
| `languagesSupported` | string\[] | UI/admin languages |
| `developer` | object | `{ name, url }` |
| `fieldCompletenessScore` | int 0-100 | Self-filtering signal |
| `agentMarkdown` | string | 300-500 char LLM-ready summary |
| `scrapedAt` | ISO 8601 | Snapshot timestamp |

#### Shopify App Store scraper output example

```json
{
  "outputSchemaVersion": "2026-05-08",
  "recordType": "shopify_app",
  "recordId": "shopify:app:loox",
  "appHandle": "loox",
  "url": "https://apps.shopify.com/loox",
  "name": "Loox · Product Reviews App",
  "tagline": "Turn customer love into sales. Product reviews, referrals and social proof upsells with Loox for Shopify and Shopify Plus.",
  "ratingValue": 4.9,
  "ratingCount": 7810,
  "pricingModel": "free_plan_available",
  "pricingHeadline": "Free plan available",
  "hasFreePlan": true,
  "hasFreeTrial": false,
  "pricingTiers": [
    { "name": "Free", "priceUsd": 0, "billingPeriod": "monthly", "description": null },
    { "name": "Beginner", "priceUsd": 9.99, "billingPeriod": "monthly", "description": null }
  ],
  "categories": ["Product reviews", "Photo and video reviews"],
  "builtForShopify": true,
  "worksWith": ["Klaviyo", "Yotpo", "Loyalty Lion"],
  "languagesSupported": ["English", "French", "Spanish", "German", "Italian"],
  "developer": { "name": "Loox", "url": "https://apps.shopify.com/partners/loox" },
  "fieldCompletenessScore": 100,
  "agentMarkdown": "**🛒 Loox · Product Reviews App** · 🛍 Built for Shopify\n> Turn customer love into sales...\n- ⭐ 4.9 (7,810) · Free plan available\n- 👤 by Loox\n- 🏷 Product reviews, Photo and video reviews\n- 🔗 https://apps.shopify.com/loox"
}
```

### During the Actor run

The actor fetches each listing page sequentially with a 1.1-second delay (well under any reasonable Shopify rate limit), parses the JSON-LD `SoftwareApplication` block for canonical name + rating + description + icon, then parses the surrounding HTML for pricing tier cards, BFS badge, categories, developer link, languages, and works-with list. Each record is validated against a Zod schema before push. Bad rows go to error counters in `OUTPUT`, not silently dropped.

The actor writes to its key-value store:

1. **`OUTPUT`** — compact run summary
2. **`AGENT_BRIEFING`** — markdown digest with top apps by review count
3. **`WATCHLIST_STATE`** — (when `watchlistMode: true`) per-app rating snapshot

### FAQ

#### How does Shopify App Store Scraper work?

The actor fetches each app's public listing URL, parses the embedded JSON-LD for canonical metadata, and HTML-parses the surrounding page for pricing tier cards, BFS badge, categories, developer info, and languages.

#### Can I get reviews for each app?

Not in v0.1. This actor returns the rating value and review count, but not individual review threads. Review-level scraping is on the roadmap as a separate v0.2 feature.

#### Can I discover apps by category?

Not in v0.1. Shopify's category and search pages are fully client-rendered (JavaScript-only), so discovery requires Playwright. For now, you provide app handles explicitly. Discovery mode is planned for v0.2.

#### Can I monitor for rating changes only?

Yes. Set `watchlistMode: true`. The actor tracks `ratingValue` and `ratingCount` per app per run and only emits records where either changed.

#### Can I use this with the Apify API?

Yes. POST to `https://api.apify.com/v2/acts/skootle~shopify-app-store-scraper/runs` with your input as JSON body and your token as the bearer header.

#### Can I integrate with Make / Zapier / n8n / Slack?

Yes. From the actor page, click **Integrations**.

#### Does this work for non-public apps?

No. This actor only reads public Shopify App Store listings. Custom apps, private apps, and unlisted apps are not accessible.

#### Why are some fields empty?

Shopify's listing layout varies per app. Pricing tier cards and category badges are particularly inconsistent. The `fieldCompletenessScore` (0-100) flags how complete a record is so you can self-filter low-quality rows downstream.

#### What if Shopify changes its layout?

JSON-LD parsing is the primary path for name + rating + description, and JSON-LD is highly stable. HTML parsing for pricing tiers, BFS badge, and categories is the secondary path; if Shopify changes these, the actor adapts within 24-48 hours.

#### Your feedback

Hit a bug or want a feature? Open an issue on the [Issues tab](https://apify.com/skootle/shopify-app-store-scraper/issues/open) rather than the reviews page, and we'll fix it fast (typically within 48 hours).

### Why choose Shopify App Store Scraper

- **JSON-LD primary path** — canonical name, rating, description, and icon come from Shopify's own structured-data block. Stable across layout changes.
- **Pricing tier breakdown** — `pricingTiers[]` array with named plans, USD prices, and billing periods. Aggregate across competitors for benchmarks.
- **Built for Shopify badge tracking** — `builtForShopify: bool` on every record. Watchlist mode catches badge gains/losses (a strong revenue signal).
- **Watchlist diff mode** — only emits apps where rating or reviews changed since the last run.
- **Versioned schema** — `outputSchemaVersion: '2026-05-08'` literal on every record.
- **Idempotent record IDs** — `shopify:app:<handle>` stable across runs.
- **Agent-grade output** — `agentMarkdown` ready to paste into an LLM context.

### Other Skootle actors you might want to check

- **[Apple App Store Reviews Monitor](https://apify.com/skootle/app-store-reviews)** — App Store reviews + metadata, watchlist for negative-review triage
- **[Reddit Subreddit Scraper](https://apify.com/skootle/reddit-subreddit-monitor)** — sentiment + brand monitoring
- **[Hacker News Watchlist](https://apify.com/skootle/hackernews-watchlist)** — tech discourse stream
- **[GitHub Trending Repos](https://apify.com/skootle/github-trending)** — daily trending dev repos
- **[SEC EDGAR Filings Monitor](https://apify.com/skootle/sec-edgar-filings)** — public-company filings stream

### Support and contact

File issues on this actor's page (Issues tab) — replies within 48 hours. Feature requests welcome — tag with `enhancement`.

# Actor input Schema

## `appHandles` (type: `array`):

App slugs (the part after apps.shopify.com/). You can also paste full URLs; the actor strips the prefix.

## `watchlistMode` (type: `boolean`):

When true, only emit records where ratingValue or ratingCount changed since the previous run.

## `maxItems` (type: `integer`):

Hard cap on apps saved. Conservative default for the 5-minute auto-test.

## `useApifyProxy` (type: `boolean`):

Apify residential proxy. Recommended for production.

## `apifyProxyGroups` (type: `array`):

RESIDENTIAL recommended.

## Actor input object example

```json
{
  "appHandles": [
    "loox",
    "vitals",
    "klaviyo"
  ],
  "watchlistMode": false,
  "maxItems": 50,
  "useApifyProxy": true,
  "apifyProxyGroups": [
    "RESIDENTIAL"
  ]
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

All apps from this run.

## `agentBriefing` (type: `string`):

Markdown digest with top apps by review count.

## `runSummary` (type: `string`):

Compact OUTPUT object with row counts and per-stage error counts.

# 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 = {
    "appHandles": [
        "loox",
        "vitals",
        "klaviyo"
    ],
    "apifyProxyGroups": [
        "RESIDENTIAL"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("skootle/shopify-app-store-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 = {
    "appHandles": [
        "loox",
        "vitals",
        "klaviyo",
    ],
    "apifyProxyGroups": ["RESIDENTIAL"],
}

# Run the Actor and wait for it to finish
run = client.actor("skootle/shopify-app-store-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 '{
  "appHandles": [
    "loox",
    "vitals",
    "klaviyo"
  ],
  "apifyProxyGroups": [
    "RESIDENTIAL"
  ]
}' |
apify call skootle/shopify-app-store-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "🛒 Shopify App Store Scraper",
        "description": "Scrape Shopify App Store listings: name, tagline, description, rating, review count, pricing tiers, BFS badge, categories, developer info. Watchlist mode tracks rating/review changes day-over-day. Export, run via API, schedule, or integrate with other tools.",
        "version": "0.1",
        "x-build-id": "gGWN0BJ4XmifdooDh"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/skootle~shopify-app-store-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-skootle-shopify-app-store-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/skootle~shopify-app-store-scraper/runs": {
            "post": {
                "operationId": "runs-sync-skootle-shopify-app-store-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/skootle~shopify-app-store-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-skootle-shopify-app-store-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",
                "properties": {
                    "appHandles": {
                        "title": "App handles to scrape",
                        "type": "array",
                        "description": "App slugs (the part after apps.shopify.com/). You can also paste full URLs; the actor strips the prefix.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "watchlistMode": {
                        "title": "Watchlist mode (rating/review change diff)",
                        "type": "boolean",
                        "description": "When true, only emit records where ratingValue or ratingCount changed since the previous run.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Max apps",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Hard cap on apps saved. Conservative default for the 5-minute auto-test.",
                        "default": 50
                    },
                    "useApifyProxy": {
                        "title": "Use Apify proxy",
                        "type": "boolean",
                        "description": "Apify residential proxy. Recommended for production.",
                        "default": true
                    },
                    "apifyProxyGroups": {
                        "title": "Apify proxy groups",
                        "type": "array",
                        "description": "RESIDENTIAL recommended.",
                        "items": {
                            "type": "string"
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
