# Microsoft AppSource Marketplace Scraper (`automation-lab/microsoft-appsource-marketplace-scraper`) Actor

Export public Microsoft AppSource offers, publishers, compatibility, categories, pricing and free-trial signals, ratings, links, descriptions, and media.

- **URL**: https://apify.com/automation-lab/microsoft-appsource-marketplace-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Business, Lead generation
- **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

## Microsoft AppSource Marketplace Scraper

Export Microsoft AppSource offers as structured data for competitive intelligence, partner discovery, lead generation, and marketplace monitoring.

The Actor works without a Microsoft login.
It reads public AppSource search, marketplace/category, and product pages over lightweight HTTP.
Each dataset row represents one unique offer.

### What this Actor does

Microsoft AppSource is a large B2B catalog of SaaS products, Microsoft 365 add-ins, Power BI visuals, Dynamics solutions, and Azure applications.
This Actor turns those public listings into integration-ready records.

Use it to:

- search AppSource by one or more keywords;
- crawl public marketplace, category, or filter URLs;
- extract a specific public product URL;
- paginate conservatively;
- deduplicate offers by Microsoft's stable entity ID;
- filter every route by exact category or publisher;
- export descriptions, compatibility, pricing signals, ratings, links, and media;
- schedule recurring catalog snapshots.

### Who is it for

#### Competitive-intelligence teams

Build a repeatable catalog of products competing in a Microsoft ecosystem niche.
Compare positioning, compatibility, categories, calls to action, and trial signals over time.

#### Microsoft partners and scouts

Find vendors serving a specific product family or industry.
Create a shortlist for partnership, reseller, integration, or acquisition research.

#### Vendor lead-generation teams

Collect publisher names and IDs, product descriptions, support links, and public offer metadata.
Use the result as the public-data layer of a qualified outreach workflow.

#### Marketplace analysts

Refresh normalized AppSource records in a warehouse, spreadsheet, or BI dashboard.
Diff scheduled datasets to identify new or changed offers.

### Why use this Actor

- **HTTP-only:** no browser startup or residential proxy is required for the observed public pages.
- **Structured extraction:** parses AppSource's embedded application state instead of scraping fragile visual card selectors.
- **Detailed rows:** list responses already expose extensive product metadata, avoiding unnecessary extra requests.
- **Multiple entry points:** query, marketplace URL, category/filter URL, and product URL.
- **Consistent filters:** category and publisher filters apply after normalization to all entry points.
- **Fail-loud behavior:** challenge pages and hydration schema changes produce an error instead of a misleading empty dataset.
- **Integration-ready:** primary results use the run's default Apify dataset.

### Data you can extract

| Field group | Example fields |
| --- | --- |
| Identity | `entityId`, `title`, `offerUrl` |
| Publisher | `publisher`, `publisherId` |
| Positioning | `shortDescription`, `description`, `keywords` |
| Microsoft fit | `builtFor`, `products`, `productType`, `catalogOfferType` |
| Taxonomy | `categories`, `industries` |
| Commercial signals | `pricingTypes`, `pricingModel`, `startingPrice`, `hasPrices`, `hasFreeTrial`, `cta` |
| Trust signals | `badges`, `averageRating`, `numberOfRatings` |
| Product details | `releaseDate`, `languages`, `licenseTermsUrl`, `supportUrl`, `privacyPolicyUrl` |
| Media | `iconUrl`, `images`, `videos` |
| Provenance | `sourceUrl`, `scrapedAt` |

Fields remain nullable because publishers do not provide every value for every offer.

### Quick start

1. Open the Actor input page.
2. Enter one or more values in **Search queries**, or paste AppSource URLs.
3. Keep **Maximum offers** small for the first run.
4. Leave **Include detailed metadata** enabled for research and lead workflows.
5. Click **Start**.
6. Open the default dataset when the run finishes.
7. Export JSON, CSV, Excel, XML, RSS, or connect the dataset to another service.

A useful first input is:

```json
{
  "searchQueries": ["data analytics"],
  "maxItems": 25,
  "maxPages": 2,
  "includeDetails": true
}
````

### Input reference

#### `searchQueries`

Array of keyword searches.
Each query is paginated independently.
The Actor also verifies that returned records contain the query terms, which prevents irrelevant default recommendations from being saved when AppSource ignores an unusual query.

#### `startUrls`

Optional public `https://appsource.microsoft.com` URLs.
Supported paths include:

- `/en-US/marketplace/apps?...` search pages;
- marketplace category and filter URLs;
- `/en-US/product/.../...` product pages.

Existing URL query parameters are preserved.
Only the `page` parameter changes during marketplace pagination.
Other domains and unrelated AppSource paths fail validation.

#### `market`

Locale for generated search and offer URLs.
Use the `ll-CC` form, such as `en-US`.
Default: `en-US`.

#### `maxItems`

Maximum unique offers saved across all input sources.
Range: 1–10,000.
Default: 100.

#### `maxPages`

Maximum marketplace pages fetched for each query or start URL.
Range: 1–100.
Default: 10.
Product URLs always use one page.

#### `includeDetails`

When enabled, rows include the full plain-text description, release date, support/privacy links, languages, keywords, screenshots, and videos exposed in AppSource state.
Disable it for a smaller payload.

#### `categories`

Optional exact category display names, case-insensitive.
For example:

```json
["Analytics", "IT & Management Tools"]
```

An offer is accepted when one of its categories exactly matches one requested value.

#### `publishers`

Optional exact publisher display names or publisher IDs, case-insensitive.
For example:

```json
["17a-4 LLC", "example-publisher-id"]
```

### Start URL example

```json
{
  "startUrls": [
    {
      "url": "https://appsource.microsoft.com/en-US/marketplace/apps?search=CRM"
    }
  ],
  "maxItems": 100,
  "maxPages": 3
}
```

### Product detail example

```json
{
  "startUrls": [
    {
      "url": "https://appsource.microsoft.com/en-us/product/web-apps/xplore-io.xplore_data_entry?tab=Overview"
    }
  ],
  "maxItems": 1,
  "includeDetails": true
}
```

### Output example

A current product-page run produces a record shaped like this:

```json
{
  "entityId": "xplore-io.xplore_data_entry",
  "title": "xplore_data_entry",
  "publisher": "xplore",
  "publisherId": "xplore-io",
  "shortDescription": "No-code data entry for Snowflake",
  "builtFor": "SaaS",
  "products": ["SaaS", "Azure"],
  "categories": ["Analytics"],
  "industries": [],
  "productType": 64,
  "catalogOfferType": "SaaS",
  "pricingTypes": [],
  "hasPrices": false,
  "hasFreeTrial": false,
  "cta": "CONTACTME",
  "averageRating": 0,
  "numberOfRatings": 0,
  "offerUrl": "https://appsource.microsoft.com/en-US/product/web-apps/xplore-io.xplore_data_entry",
  "sourceUrl": "https://appsource.microsoft.com/en-us/product/web-apps/xplore-io.xplore_data_entry?tab=Overview",
  "images": [
    {
      "name": "Unavailable",
      "url": "https://catalogartifact.azureedge.net/example/screenshot.png"
    }
  ],
  "scrapedAt": "2026-07-25T00:00:00.000Z"
}
```

Descriptions and arrays are shortened in this documentation example.
The dataset schema contains the complete field contract.

### Pricing

This Actor uses pay-per-event pricing:

- a **$0.005 start event** once per run;
- one item event for each unique accepted dataset row;
- no item charge for duplicates, rejected filters, empty results, or failed records.

The current item tiers in the Actor package are:

| Apify plan tier | Price per result | Approx. per 1,000 results |
| --- | ---: | ---: |
| Free | $0.00015811 | $0.15811 |
| Bronze | $0.00013748 | $0.13748 |
| Silver | $0.00010724 | $0.10724 |
| Gold | $0.00008249 | $0.08249 |
| Platinum | $0.000054993 | $0.054993 |
| Diamond | $0.000038495 | $0.038495 |

Examples before any Apify plan credits:

- 25 results on Free: about **$0.00895** including the start event;
- 100 results on Free: about **$0.02081** including the start event;
- 1,000 results on Bronze: about **$0.14248** including the start event.

The Console pricing tab is authoritative if Apify displays a newer active price.

### Performance and cost tips

- Set `maxItems` to the number you actually need.
- Use a narrow query or an existing filtered marketplace URL.
- Disable `includeDetails` when descriptions and media are unnecessary.
- Combine related queries in one run to pay the start event once.
- Use exact publisher/category filters to keep datasets focused.
- The Actor does not download image or video binaries; it only records their public URLs.

### Pagination, deduplication, and retries

AppSource currently exposes up to 60 app offers per unfiltered marketplace page.
The Actor stops when it reaches `maxItems`, exhausts `maxPages`, receives no offers, or finds no new accepted offers on a later page.

Deduplication uses `entityId` across all queries and URLs in a run.

Requests retry up to two times after the first attempt for transient network errors, HTTP 429, and temporary 5xx responses.
Deterministic validation errors, unsupported URLs, HTTP 4xx responses, and parser drift are not retried blindly.

### Empty results and failures

A legitimate no-match query or filters that reject every offer succeed with an empty dataset.

The run fails non-zero when:

- neither a query nor URL is supplied;
- a URL is malformed, uses another host, or has an unsupported path;
- the locale format is invalid;
- numeric limits are outside their documented range;
- AppSource returns an error or non-HTML response;
- recognizable embedded data is missing;
- a requested product is not present in its page state.

This distinction helps scheduled workflows tell “nothing matched” from “the source changed.”

### Scheduled competitive monitoring

A typical recurring workflow is:

1. run daily or weekly with stable queries;
2. export the dataset to a warehouse or Google Sheets;
3. key records by `entityId`;
4. compare the current snapshot with the previous snapshot;
5. alert on new offers, changed calls to action, trials, descriptions, or categories.

Apify schedules and webhooks can trigger the run and downstream automation.

### Lead-generation workflow

Use public AppSource data responsibly as a qualification signal:

1. search for a product family or industry;
2. filter to relevant categories;
3. group records by `publisherId`;
4. review product positioning and public support/privacy links;
5. enrich companies through a lawful source;
6. send only relevant, compliant outreach.

The Actor does not extract personal email addresses or private Microsoft account data.

### Integrations

The default dataset works with:

- Google Sheets and Google Drive;
- Make and Zapier;
- Slack and email webhooks;
- Airbyte and data warehouses;
- Python, JavaScript, and REST clients;
- Apify schedules, webhooks, and dataset exports.

Use `entityId` as the stable primary key in downstream systems.
Use `sourceUrl` for provenance and `scrapedAt` for snapshot timing.

### Run through the REST API

Replace `YOUR_APIFY_TOKEN` with your token:

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~microsoft-appsource-marketplace-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchQueries": ["CRM"],
    "maxItems": 25,
    "maxPages": 2,
    "includeDetails": true
  }'
```

For long runs, start asynchronously through `/runs` and read the run's default dataset after completion.

### JavaScript API example

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });

const run = await client.actor(
  'automation-lab/microsoft-appsource-marketplace-scraper',
).call({
  searchQueries: ['Power BI finance'],
  maxItems: 100,
  maxPages: 3,
  includeDetails: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map(({ entityId, title, publisher }) => ({
  entityId,
  title,
  publisher,
})));
```

### Python API example

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor(
    "automation-lab/microsoft-appsource-marketplace-scraper"
).call(run_input={
    "searchQueries": ["Microsoft 365 security"],
    "maxItems": 100,
    "maxPages": 3,
    "includeDetails": True,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["entityId"], item["title"], item.get("publisher"))
```

### Use with Apify MCP

Add this Actor to Claude Code:

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

#### Claude Desktop, Cursor, and VS Code setup

Claude Desktop, Cursor, VS Code, and other HTTP MCP clients can use this equivalent configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/microsoft-appsource-marketplace-scraper"
    }
  }
}
```

Example prompts:

- “Search AppSource for Power BI financial planning offers and return the first 50 publishers.”
- “Extract this AppSource product URL and summarize compatibility, CTA, trial, and pricing signals.”
- “Find AppSource offers in IT & Management Tools from the listed publishers.”

### Responsible and legal use

This Actor reads public marketplace pages available without authentication.
You are responsible for your use of the output.

- Review Microsoft AppSource terms and applicable robots guidance.
- Collect only data needed for a legitimate purpose.
- Respect copyright, database rights, privacy, and marketing laws.
- Do not use output for spam, discrimination, surveillance, or deceptive activity.
- Verify material business decisions against the live product page.
- Follow publisher terms when using descriptions, images, and trademarks.

Public availability does not automatically grant every reuse right.

### Limitations

- Microsoft may change its embedded hydration schema or page routes.
- Category and publisher filters are exact, case-insensitive matches, not fuzzy filters.
- Keyword verification is lexical; highly semantic AppSource matches may be excluded when they do not contain every query token.
- Offer URLs are derived from public entity and product-type metadata when AppSource does not expose a direct link.
- Some offers omit price, trial, rating, release date, language, support, or media fields.
- The Actor records media URLs but does not download files.
- Ratings and marketplace metadata can lag publisher changes.
- Authenticated, private, or customer-specific marketplace data is outside scope.

### Troubleshooting

#### The run says an AppSource URL is unsupported

Use an HTTPS URL on exactly `appsource.microsoft.com` with a locale and `/marketplace/` or `/product/` path.
Do not paste Microsoft Partner Center, Azure Portal, or redirect URLs.

#### A query returns no rows

Try a shorter query, remove category/publisher filters, and confirm the phrase on AppSource.
The Actor requires all lexical query tokens to appear in normalized product metadata.

#### I received fewer rows than `maxItems`

`maxItems` is a ceiling, not a guarantee.
The query may have fewer matches, later pages may repeat IDs, or filters may reject records.
Increase `maxPages` only after confirming more pages exist.

#### The run fails with “embedded state was not found”

AppSource may have changed its page schema or returned a challenge.
Retry once later.
If it persists, open an Actor issue with the public input URL and run link; do not paste tokens or private data.

#### Why is a field null?

AppSource publishers do not provide every field.
Use `entityId`, `title`, `publisher`, and `offerUrl` for core identity, and treat optional commercial/detail fields as nullable.

### FAQ

#### Does it require a Microsoft account?

No.
The supported scope uses public AppSource pages.

#### Does it require a proxy?

No proxy is used by default.
Anonymous direct HTTP currently works for the supported pages.

#### Can it scrape one product?

Yes.
Pass its public AppSource `/product/` URL in `startUrls` and set `maxItems` to 1.

#### Can it scrape category and filter pages?

Yes.
Paste the public marketplace URL after selecting filters in AppSource.
The Actor preserves those query parameters while paginating.

#### Does it scrape reviews?

The primary offer record includes aggregate rating fields exposed in product state.
Individual review text is not part of this version.

#### Can I monitor changes?

Yes.
Schedule stable inputs and compare snapshots by `entityId`.

#### Will duplicates be charged twice?

No.
The Actor deduplicates accepted rows by `entityId` before charging and saving.

#### Is this an official Microsoft product?

No.
It is an independent Apify Actor that extracts publicly visible AppSource data.
Microsoft and AppSource are trademarks of their respective owner.

### Related Automation Lab Actors

- [Apple App Store Scraper](https://apify.com/automation-lab/apple-app-store-scraper) for consumer iOS marketplace intelligence.
- [Google Play Scraper](https://apify.com/automation-lab/google-play-scraper) for Android app discovery and metadata.
- [Microsoft Store App Intelligence Scraper](https://apify.com/automation-lab/microsoft-store-app-intelligence-scraper) for consumer Microsoft Store app research.
- [HubSpot App Marketplace Scraper](https://apify.com/automation-lab/hubspot-app-marketplace-scraper) for B2B integration ecosystem research.
- [Monday Apps Marketplace Scraper](https://apify.com/automation-lab/monday-apps-marketplace-scraper) for work-management app ecosystem research.

These Actors target adjacent marketplaces.
Choose this Actor when the buyer job centers on Microsoft AppSource's B2B offer catalog.

### Support

For reproducible problems, include:

- a public input example;
- the run URL;
- the expected and observed behavior;
- whether the same AppSource page opens anonymously;
- the first relevant error message from the log.

Never include your Apify token, Microsoft credentials, private customer data, or complete confidential datasets.

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords to search in Microsoft AppSource. Each query is paginated independently.

## `startUrls` (type: `array`):

Optional appsource.microsoft.com marketplace, category/filter, search, or product URLs. Filters already present in marketplace URLs are preserved.

## `market` (type: `string`):

Locale used for generated search and offer URLs, in ll-CC format.

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

Stop after saving this many unique offers across all inputs.

## `maxPages` (type: `integer`):

Conservative pagination limit for each query or marketplace/category URL. AppSource currently returns up to 60 offers per page.

## `includeDetails` (type: `boolean`):

Include full descriptions, release dates, support/privacy links, images, videos, languages, and keywords exposed in AppSource structured data.

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

Optional exact category names (for example, Analytics or IT & Management Tools). Applied consistently to every input route.

## `publishers` (type: `array`):

Optional exact publisher names or publisher IDs. Applied consistently to every input route.

## Actor input object example

```json
{
  "searchQueries": [
    "data analytics"
  ],
  "startUrls": [
    {
      "url": "https://appsource.microsoft.com/en-US/marketplace/apps?search=CRM"
    }
  ],
  "market": "en-US",
  "maxItems": 20,
  "maxPages": 3,
  "includeDetails": true
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset containing all unique offers accepted by the input filters.

# 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 = {
    "searchQueries": [
        "data analytics"
    ],
    "startUrls": [
        {
            "url": "https://appsource.microsoft.com/en-US/marketplace/apps?search=CRM"
        }
    ],
    "market": "en-US",
    "maxItems": 20,
    "maxPages": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/microsoft-appsource-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 = {
    "searchQueries": ["data analytics"],
    "startUrls": [{ "url": "https://appsource.microsoft.com/en-US/marketplace/apps?search=CRM" }],
    "market": "en-US",
    "maxItems": 20,
    "maxPages": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/microsoft-appsource-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 '{
  "searchQueries": [
    "data analytics"
  ],
  "startUrls": [
    {
      "url": "https://appsource.microsoft.com/en-US/marketplace/apps?search=CRM"
    }
  ],
  "market": "en-US",
  "maxItems": 20,
  "maxPages": 3
}' |
apify call automation-lab/microsoft-appsource-marketplace-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Microsoft AppSource Marketplace Scraper",
        "description": "Export public Microsoft AppSource offers, publishers, compatibility, categories, pricing and free-trial signals, ratings, links, descriptions, and media.",
        "version": "0.1",
        "x-build-id": "TIHXpVmpX7qSU6MJN"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/automation-lab~microsoft-appsource-marketplace-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-automation-lab-microsoft-appsource-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~microsoft-appsource-marketplace-scraper/runs": {
            "post": {
                "operationId": "runs-sync-automation-lab-microsoft-appsource-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~microsoft-appsource-marketplace-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-automation-lab-microsoft-appsource-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": {
                    "searchQueries": {
                        "title": "Search queries",
                        "type": "array",
                        "description": "Keywords to search in Microsoft AppSource. Each query is paginated independently.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "AppSource URLs",
                        "type": "array",
                        "description": "Optional appsource.microsoft.com marketplace, category/filter, search, or product URLs. Filters already present in marketplace URLs are preserved.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "market": {
                        "title": "Market and language",
                        "pattern": "^[a-z]{2}-[A-Z]{2}$",
                        "type": "string",
                        "description": "Locale used for generated search and offer URLs, in ll-CC format.",
                        "default": "en-US"
                    },
                    "maxItems": {
                        "title": "Maximum offers",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Stop after saving this many unique offers across all inputs.",
                        "default": 100
                    },
                    "maxPages": {
                        "title": "Maximum pages per marketplace URL",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Conservative pagination limit for each query or marketplace/category URL. AppSource currently returns up to 60 offers per page.",
                        "default": 10
                    },
                    "includeDetails": {
                        "title": "Include detailed metadata",
                        "type": "boolean",
                        "description": "Include full descriptions, release dates, support/privacy links, images, videos, languages, and keywords exposed in AppSource structured data.",
                        "default": true
                    },
                    "categories": {
                        "title": "Category filters",
                        "type": "array",
                        "description": "Optional exact category names (for example, Analytics or IT & Management Tools). Applied consistently to every input route.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "publishers": {
                        "title": "Publisher filters",
                        "type": "array",
                        "description": "Optional exact publisher names or publisher IDs. Applied consistently to every input route.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
