# VS Code Marketplace Scraper (`automation-lab/vscode-marketplace-scraper`) Actor

Scrape VS Code extensions from the Marketplace — search by keyword, category, or publisher and extract install counts, ratings, versions, and metadata.

- **URL**: https://apify.com/automation-lab/vscode-marketplace-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN 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 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

## VS Code Marketplace Scraper

Extract data from the [Visual Studio Code Marketplace](https://marketplace.visualstudio.com/) — search by keyword, browse by category, filter by publisher or tags, or look up specific extension IDs. Returns install counts, ratings, version history, categories, tags, and marketplace URLs in a clean structured format.

### What does it do?

VS Code Marketplace Scraper connects to the official VS Code Gallery API and extracts structured data about extensions. You can:

- 🔍 **Search** for extensions by keyword (e.g. "python", "linter", "git")
- 📂 **Browse by category** (Themes, Debuggers, Programming Languages, Snippets, Linters, etc.)
- 👤 **Filter by publisher** (e.g. "ms-vscode", "ms-python", "GitHub")
- 🏷️ **Filter by tag** (e.g. "formatter", "javascript", "docker")
- 🆔 **Fetch specific extensions** by their ID (e.g. "ms-python.python")
- 📊 Sort results by install count, rating, publish date, or last updated date

All data comes directly from the official VS Code Marketplace API — no browser needed, no scraping of HTML pages.

### Who is it for?

#### 🧑‍💻 Developer tool researchers
Track the competitive landscape in VS Code extensions. Which formatters are winning? How is ESLint doing compared to Biome? What new AI extensions are trending? Get hard install numbers and ratings across any category.

#### 📈 Extension publishers & analytics teams
Monitor your own extensions and competitors. Compare install counts, ratings, and update frequency across your portfolio. Feed data into dashboards to track growth week-over-week.

#### 🤖 AI & data science teams
Build datasets of VS Code extensions for recommendations, categorization, or training data. The structured output is ready for pandas, BigQuery, or any data pipeline.

#### 🛠️ Developer productivity teams
Find the best-rated tools in each category to standardize across your engineering org. Compare linters, formatters, and debuggers by install count and community satisfaction.

### Why use this scraper?

The VS Code Marketplace website limits search to 50 results per page and lacks bulk export. This actor:

- Fetches **up to 10,000 extensions** per run with automatic pagination
- Returns **complete metadata** including install counts, ratings, categories, and tags
- Works **without a browser** — fast and cheap HTTP API calls
- **No authentication required** — uses the public Gallery API
- **Structured output** ready for spreadsheets, databases, or data pipelines

### What data does it extract?

| Field | Type | Description |
|-------|------|-------------|
| `extensionName` | string | Full extension ID (e.g. `ms-python.python`) |
| `displayName` | string | Human-readable name (e.g. `Python`) |
| `publisherName` | string | Publisher slug (e.g. `ms-python`) |
| `publisherDisplayName` | string | Publisher display name (e.g. `Microsoft`) |
| `publisherVerified` | boolean | Whether publisher domain is verified |
| `shortDescription` | string | Extension description |
| `categories` | array | Extension categories (e.g. `["Programming Languages"]`) |
| `tags` | array | Extension tags (system tags filtered out) |
| `latestVersion` | string | Current version number |
| `publishedDate` | string | Date first published (ISO 8601) |
| `lastUpdated` | string | Date last updated (ISO 8601) |
| `releaseDate` | string | Public release date (ISO 8601) |
| `installCount` | number | Total install count |
| `downloadCount` | number | Recent download count |
| `updateCount` | number | Total update count |
| `averageRating` | number | Average rating (0–5) |
| `ratingCount` | number | Number of ratings |
| `weightedRating` | number | Weighted rating score |
| `trendingDaily` | number | Daily trending score |
| `trendingWeekly` | number | Weekly trending score |
| `trendingMonthly` | number | Monthly trending score |
| `marketplaceUrl` | string | Direct URL to the extension's Marketplace page |

### How much does it cost to scrape VS Code Marketplace extensions?

This actor uses pay-per-result pricing. You're only charged for extensions actually extracted — no wasted costs.

| Plan | Price per extension | 100 extensions | 1,000 extensions | 10,000 extensions |
|------|---------------------|----------------|------------------|-------------------|
| FREE | $0.002 | $0.20 | $2.00 | $20.00 |
| BRONZE | $0.002 | $0.20 | $2.00 | $20.00 |
| SILVER | $0.0016 | $0.16 | $1.60 | $16.00 |
| GOLD | $0.0012 | $0.12 | $1.20 | $12.00 |
| PLATINUM | $0.0008 | $0.08 | $0.80 | $8.00 |
| DIAMOND | $0.0006 | $0.06 | $0.60 | $6.00 |

Plus a flat **$0.005 start fee** per run.

**Free plan estimate:** The Apify free plan ($0 credit/month) gives approximately 200–250 extensions per month.

Since this actor uses only HTTP API calls (no browser), runs are fast and inexpensive. A search for 1,000 extensions takes about 10–15 seconds.

### How to use VS Code Marketplace Scraper

#### Step 1 — Create a free Apify account

Sign up at [apify.com](https://apify.com) — no credit card required. The free plan gives you enough credits to test.

#### Step 2 — Open the actor

Go to [https://apify.com/automation-lab/vscode-marketplace-scraper](https://apify.com/automation-lab/vscode-marketplace-scraper) and click **Try for free**.

#### Step 3 — Configure your input

Choose your search mode:

**Search by keyword:**
```json
{
    "searchQuery": "linter",
    "maxResults": 100,
    "sortBy": "installs"
}
````

**Browse by category:**

```json
{
    "categories": ["Themes"],
    "maxResults": 200,
    "sortBy": "installs"
}
```

**Filter by publisher:**

```json
{
    "publisherName": "ms-vscode",
    "maxResults": 50,
    "sortBy": "installs"
}
```

**Fetch specific extensions:**

```json
{
    "extensionIds": ["ms-python.python", "esbenp.prettier-vscode"],
    "maxResults": 10
}
```

#### Step 4 — Run and export

Click **Start** and wait for the run to complete. Download results as JSON, CSV, or Excel from the **Dataset** tab.

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `searchQuery` | string | — | Keyword or phrase to search for |
| `publisherName` | string | — | Publisher to filter by (e.g. `ms-vscode`) |
| `extensionIds` | array | — | Specific extension IDs in `publisher.name` format |
| `categories` | array | — | Categories to filter by |
| `tags` | array | — | Tags to filter by |
| `maxResults` | integer | 100 | Maximum number of extensions to return |
| `sortBy` | string | `installs` | Sort order: `relevance`, `installs`, `rating`, `publishedDate`, `updatedDate` |
| `maxRequestRetries` | integer | 3 | Max retries for failed API calls |

**Valid categories:** Programming Languages, Snippets, Linters, Themes, Debuggers, Formatters, Keymaps, SCM Providers, Other, Extension Packs, Language Packs, Data Science, Machine Learning, Visualization, Notebooks, Education, Testing

### Output example

```json
{
    "extensionId": "f1f59ae4-9318-4f3c-a9b5-81b2eaa5f8a5",
    "extensionName": "ms-python.python",
    "displayName": "Python",
    "publisherName": "ms-python",
    "publisherDisplayName": "Microsoft",
    "publisherVerified": true,
    "shortDescription": "Python language support with extension access points for IntelliSense...",
    "categories": ["Programming Languages", "Debuggers", "Data Science"],
    "tags": ["python", "linters", "django", "unittest"],
    "latestVersion": "2026.5.1",
    "publishedDate": "2016-01-19T15:03:11.337Z",
    "lastUpdated": "2026-04-26T21:39:15.593Z",
    "installCount": 216379645,
    "averageRating": 4.2,
    "ratingCount": 628,
    "trendingMonthly": 2.148,
    "marketplaceUrl": "https://marketplace.visualstudio.com/items?itemName=ms-python.python"
}
```

### Tips for getting the best results

- 🎯 **Combine category + keyword** for focused results: set `categories: ["Linters"]` and `searchQuery: "javascript"` to find JS-specific linters
- 📊 **Sort by `updatedDate`** to find actively maintained extensions
- 🔍 **Use `extensionIds` for competitor monitoring** — track specific extensions and check their metrics daily via the API
- 💡 **Tags vs categories** — categories are broad groupings; tags are more granular. Use tags to find extensions for specific languages or tools (e.g. tag `"docker"`, `"rust"`, `"graphql"`)
- ⚡ **Pagination is automatic** — set `maxResults: 10000` and the actor handles all pagination automatically

### Integrations

#### 📊 Export to Google Sheets

1. Run this actor to get a list of extensions (e.g. top 200 Python tools)
2. Use the Apify Google Sheets integration to export the dataset directly to a spreadsheet
3. Use Google Sheets formulas to build a competitive analysis dashboard

#### 🔔 Monitor your extension's rank daily

1. Use `extensionIds` mode with your extension ID
2. Set up a scheduled run (daily or weekly)
3. Use Apify webhooks to post results to Slack when your install count or rating changes

#### 🐍 Feed data into pandas for analysis

```python
import pandas as pd
import requests

run_id = "YOUR_RUN_ID"
api_key = "YOUR_APIFY_API_KEY"
url = f"https://api.apify.com/v2/datasets/{run_id}/items?token={api_key}&format=json"
df = pd.read_json(url)

## Top 10 by installs
print(df.nlargest(10, 'installCount')[['displayName', 'installCount', 'averageRating']])
```

#### 🗄️ Load into BigQuery or Snowflake

Export the dataset as NDJSON from the Apify dataset API and load it directly into BigQuery using `bq load` or into Snowflake using the Snowflake Python connector.

### API usage examples

#### Node.js

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

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

const run = await client.actor('automation-lab/vscode-marketplace-scraper').call({
    searchQuery: 'python',
    maxResults: 100,
    sortBy: 'installs',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} extensions`);
console.log('Top extension:', items[0].displayName, '-', items[0].installCount, 'installs');
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("automation-lab/vscode-marketplace-scraper").call(run_input={
    "searchQuery": "python",
    "maxResults": 100,
    "sortBy": "installs",
})

items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
print(f"Got {len(items)} extensions")
print(f"Top: {items[0]['displayName']} — {items[0]['installCount']:,} installs")
```

#### cURL

```bash
## Start a run
curl -X POST "https://api.apify.com/v2/acts/automation-lab~vscode-marketplace-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchQuery": "python",
    "maxResults": 100,
    "sortBy": "installs"
  }'

## Fetch results (replace DATASET_ID from run response)
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_TOKEN&format=json"
```

### MCP — use with Claude and AI assistants

You can connect this actor to Claude Code, Claude Desktop, or any MCP-compatible AI assistant to query the VS Code Marketplace conversationally.

#### Claude Code (terminal)

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/vscode-marketplace-scraper"
```

#### Claude Desktop / Cursor / VS Code (JSON config)

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com?tools=automation-lab/vscode-marketplace-scraper",
            "headers": {
                "Authorization": "Bearer YOUR_APIFY_TOKEN"
            }
        }
    }
}
```

#### Example prompts for Claude

> "Find the top 20 most installed VS Code extensions for Rust development"

> "What are the highest-rated debugging extensions with at least 100,000 installs?"

> "List all extensions published by the GitHub publisher sorted by install count"

> "Get the metadata for ms-python.python, esbenp.prettier-vscode, and ms-vscode.cpptools"

### Legality

This actor uses the **official public VS Code Marketplace Gallery API** — the same API used by VS Code itself to install extensions. No login is required, no private data is accessed, and no rate limits are circumvented. All data returned is publicly accessible on the Marketplace website.

Scraped data is intended for research, analytics, and legitimate competitive intelligence purposes. Do not use this actor to spam extension publishers or misuse their extension metadata commercially.

### FAQ — Frequently asked questions

#### What's the difference between `searchQuery` and `categories`?

`searchQuery` does a full-text search across extension names, descriptions, and publishers. `categories` is a structured filter that matches only extensions classified under a specific category (like "Themes" or "Debuggers"). You can combine both for precise results.

#### Can I search by multiple categories at once?

Yes — pass multiple values in the `categories` array. Note that the Marketplace API may return the intersection or union depending on filter logic. Test with a small `maxResults` first to verify behavior.

#### Why does my publisher filter return unrelated extensions?

Publisher filtering uses text search (there is no dedicated publisher filter in the public Gallery API). The publisher name is used as a search keyword, which means extensions that mention that publisher name in their description may also appear. For high-precision publisher lookups, use `extensionIds` with a list of known extension IDs.

#### How do I troubleshoot a run that returns 0 results?

1. Check your category spelling — categories are case-sensitive (`"Themes"` not `"themes"`)
2. Try broadening the search: remove some filters
3. Check that your extension IDs are in `publisher.extensionName` format (e.g. `ms-python.python`)
4. The Marketplace API may be temporarily unavailable — try again in a few minutes

#### Is there a rate limit?

The VS Code Marketplace API is a high-throughput public API. This actor uses reasonable pagination (100 items per page) and doesn't hammer the API. No rate limits have been observed in testing with up to 10,000 items.

### Related scrapers

- [GitHub Scraper](https://apify.com/automation-lab/github-scraper) — scrape GitHub repositories, issues, and user profiles
- [npm Package Scraper](https://apify.com/automation-lab/npm-scraper) — extract npm package metadata including download counts and dependencies

# Actor input Schema

## `searchQuery` (type: `string`):

Keyword or phrase to search for in the VS Code Marketplace (e.g. "python", "git", "prettier"). Leave blank to browse by category, publisher, or tags.

## `publisherName` (type: `string`):

Filter extensions by publisher (e.g. "ms-python", "ms-vscode", "GitHub"). Leave blank to search all publishers.

## `extensionIds` (type: `array`):

List of specific extension IDs to fetch (e.g. \["ms-python.python", "esbenp.prettier-vscode"]). If provided, overrides search query and other filters.

## `categories` (type: `array`):

Filter by extension categories (e.g. \["Programming Languages", "Debuggers", "Themes", "Snippets", "Linters"]).

## `tags` (type: `array`):

Filter by extension tags (e.g. \["python", "formatter", "git"]).

## `maxResults` (type: `integer`):

Maximum number of extensions to return. Each extension costs $0.002. Start small (50) to control costs.

## `sortBy` (type: `string`):

How to sort extensions. Defaults to relevance for searches, or installs for category/publisher browsing.

## `maxRequestRetries` (type: `integer`):

Number of retry attempts for failed API requests.

## Actor input object example

```json
{
  "searchQuery": "python",
  "maxResults": 20,
  "sortBy": "installs",
  "maxRequestRetries": 3
}
```

# 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 = {
    "searchQuery": "python",
    "maxResults": 20,
    "sortBy": "installs",
    "maxRequestRetries": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/vscode-marketplace-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 = {
    "searchQuery": "python",
    "maxResults": 20,
    "sortBy": "installs",
    "maxRequestRetries": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/vscode-marketplace-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 '{
  "searchQuery": "python",
  "maxResults": 20,
  "sortBy": "installs",
  "maxRequestRetries": 3
}' |
apify call automation-lab/vscode-marketplace-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "VS Code Marketplace Scraper",
        "description": "Scrape VS Code extensions from the Marketplace — search by keyword, category, or publisher and extract install counts, ratings, versions, and metadata.",
        "version": "0.1",
        "x-build-id": "hbozN8CMmFNufi9y3"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/automation-lab~vscode-marketplace-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-automation-lab-vscode-marketplace-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~vscode-marketplace-scraper/runs": {
            "post": {
                "operationId": "runs-sync-automation-lab-vscode-marketplace-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~vscode-marketplace-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-automation-lab-vscode-marketplace-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": {
                    "searchQuery": {
                        "title": "🔍 Search query",
                        "type": "string",
                        "description": "Keyword or phrase to search for in the VS Code Marketplace (e.g. \"python\", \"git\", \"prettier\"). Leave blank to browse by category, publisher, or tags."
                    },
                    "publisherName": {
                        "title": "👤 Publisher name",
                        "type": "string",
                        "description": "Filter extensions by publisher (e.g. \"ms-python\", \"ms-vscode\", \"GitHub\"). Leave blank to search all publishers."
                    },
                    "extensionIds": {
                        "title": "🆔 Extension IDs",
                        "type": "array",
                        "description": "List of specific extension IDs to fetch (e.g. [\"ms-python.python\", \"esbenp.prettier-vscode\"]). If provided, overrides search query and other filters.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "categories": {
                        "title": "📂 Categories",
                        "type": "array",
                        "description": "Filter by extension categories (e.g. [\"Programming Languages\", \"Debuggers\", \"Themes\", \"Snippets\", \"Linters\"]).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "tags": {
                        "title": "🏷️ Tags",
                        "type": "array",
                        "description": "Filter by extension tags (e.g. [\"python\", \"formatter\", \"git\"]).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "📊 Max results",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of extensions to return. Each extension costs $0.002. Start small (50) to control costs.",
                        "default": 100
                    },
                    "sortBy": {
                        "title": "↕️ Sort by",
                        "enum": [
                            "relevance",
                            "installs",
                            "rating",
                            "publishedDate",
                            "updatedDate"
                        ],
                        "type": "string",
                        "description": "How to sort extensions. Defaults to relevance for searches, or installs for category/publisher browsing.",
                        "default": "installs"
                    },
                    "maxRequestRetries": {
                        "title": "🔄 Max request retries",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Number of retry attempts for failed API requests.",
                        "default": 3
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
