# Shopify App Store Scraper — Apps, Reviews & Developer Leads (`scrapesage/shopify-app-store-scraper`) Actor

Scrape the Shopify App Store: app listings, pricing plans, ratings, ratings histogram, reviews, Built for Shopify badges, categories, languages & developer contact leads. Search by keyword, category, developer or URL. No login. Monitoring mode. Export JSON, CSV, Excel.

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

## Pricing

from $4.00 / 1,000 app scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Scraper — Apps, Reviews & Developer Leads

Extract **rich app data, pricing plans, ratings, reviews and developer contact leads** from the [Shopify App Store](https://apps.shopify.com). Search by **keyword, category, developer or URL** and get the complete listing for every app — profile, pricing tiers, ratings histogram, "Built for Shopify" status, integrations, languages and the developer's own website. **No login, no cookies, no browser.**

### Why this Shopify App Store scraper?

Most Shopify app scrapers return a thin row — title, rating, a price string. This one returns the **whole listing plus the lead** behind it.

| Typical scrapers | This actor |
| --- | --- |
| Title, rating, one price | Full profile + **structured pricing plans** + pricing summary (free plan, free trial days, price range) |
| A single rating number | **Ratings histogram** (5★→1★), review count, and full **review records** with store, country & developer replies |
| No developer info | **Developer name, handle, App Store page and real website** — plus optional email / phone / social **lead enrichment** |
| One mode | **Search, category, developer-portfolio, app-handle and URL** inputs in one actor |
| Re-scrapes everything every run | **Monitoring mode** returns only newly-listed apps |
| Browser-based & slow | Pure HTTP, **streams results as they're parsed**, no login |

- **Built for Shopify** badge detection, launch date, "Works with" integrations and supported languages.
- A derived **lead score** (0–100) ranks apps by traction and contactability.
- Every field the listing exposes is kept — the richest Shopify app dataset available.

### Use cases

- **B2B lead generation** — turn app developers into a contactable pipeline: developer name, website, and (optionally) public emails, phones and social profiles, ranked by lead score.
- **Competitive & market intelligence** — map an entire category or a rival's whole portfolio: pricing tiers, ratings trend, review volume and "Built for Shopify" status.
- **Pricing research** — compare plan structures, free-trial lengths and price ranges across hundreds of apps in a niche.
- **Review mining** — pull merchant reviews (with country, time-using-app and developer replies) for sentiment analysis and feature-request discovery.
- **App store SEO / ASO** — track which apps rank in a category, their taglines, keywords and integrations over time.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **Shopify App Store Scraper**, fill in the inputs you need, and click **Start**.
3. Watch results stream into the dataset table as each record is parsed.
4. **Export** as JSON, CSV, Excel, XML, or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

Provide any combination of keyword searches, categories, developers, app handles or URLs. Example:

```json
{
  "searchQueries": ["email marketing", "upsell"],
  "categories": ["marketing-and-conversion-social-trust-product-reviews"],
  "developerHandles": ["klaviyo"],
  "appHandles": ["judgeme", "https://apps.shopify.com/dsers"],
  "includeReviews": true,
  "maxReviewsPerApp": 50,
  "reviewsSort": "newest",
  "emitReviewRecords": true,
  "enrichDeveloperContacts": false,
  "maxApps": 100,
  "monitoringMode": false
}
````

- **searchQueries** — keywords; each is matched to the most relevant App Store categories (via Shopify's own autocomplete) and every app in them is scraped.
- **categories** — category slugs or full `apps.shopify.com/categories/...` URLs to browse end-to-end.
- **developerHandles** — partner slugs (or `/partners/<slug>` URLs) to pull a developer's entire app portfolio.
- **appHandles** / **startUrls** — exact apps or any App Store URL (app, category, search or partner page) — auto-detected and routed.
- **includeReviews** + **maxReviewsPerApp** + **reviewsSort** — attach merchant reviews per app; **emitReviewRecords** also writes one flat row per review.
- **enrichDeveloperContacts** — visit each developer's own website to extract public emails, phones and socials.
- **maxApps**, **monitoringMode**, **maxConcurrency**, **proxyConfiguration** — run controls. The default Apify Proxy is plenty; no residential proxy needed.

### Output

Each app is one record (`type: "app"`). With `emitReviewRecords` on, each review is an extra flat record (`type: "review"`). Representative app record:

```json
{
  "type": "app",
  "handle": "judgeme",
  "url": "https://apps.shopify.com/judgeme",
  "title": "Judge.me Product Reviews App",
  "tagline": "Product reviews app with photos & videos for social proof. Build trust & SEO.",
  "developerName": "Judge.me",
  "developerHandle": "judge-me",
  "developerUrl": "https://apps.shopify.com/partners/judge-me",
  "developerWebsite": "https://judge.me",
  "ratingValue": 5.0,
  "ratingCount": 40352,
  "reviewsCount": 40352,
  "ratingsHistogram": { "5": 39800, "4": 300, "3": 70, "2": 50, "1": 132 },
  "builtForShopify": true,
  "pricingPlans": [
    { "name": "Forever Free", "price": "Free", "interval": null, "isFree": true, "features": ["Unlimited review requests", "Photo & video reviews"] },
    { "name": "Awesome", "price": "$15/month", "interval": "month", "isFree": false, "features": ["..."] }
  ],
  "pricing": { "hasFreePlan": true, "freeToInstall": false, "freeTrialDays": 14, "priceFrom": 15, "priceTo": 15, "currency": "USD" },
  "primaryCategory": "Product reviews",
  "categories": [{ "name": "Product reviews", "slug": "marketing-and-conversion-social-trust-product-reviews" }],
  "worksWith": ["Shopify Flow", "Klaviyo", "PageFly"],
  "languages": ["English", "French", "German"],
  "launchedOn": "June 24, 2014",
  "screenshots": ["https://cdn.shopify.com/app-store/listing_images/.../desktop_screenshot.png"],
  "privacyPolicyUrl": "https://judge.me/privacy",
  "leadScore": 95,
  "source": "search",
  "searchQuery": "product reviews",
  "scrapedAt": "2026-06-14T16:00:00.000Z"
}
```

Notes:

- With **enrichDeveloperContacts** on, app records also carry `developerEmails`, `developerPhones` and `developerSocials` (only when found).
- Fields that an app doesn't expose are returned as `null` or omitted — never fabricated.
- Only **public** business data is collected (developer/business contact info), no personal end-user data.
- Empty results (e.g. a category with no apps) are reported as a successful run with zero records.

### Monitoring — get only new apps

Turn on **monitoringMode** and the actor remembers which apps it has already returned (in a named key-value store keyed to your exact input) and emits **only apps not seen in previous runs**. Point it at a category or keyword and every scheduled run returns just the newly-listed apps — perfect for spotting new competitors or fresh leads the day they launch.

This pairs with [Apify Schedules](https://docs.apify.com/platform/schedules): the schedule triggers the run on a cron, and monitoring mode deduplicates the results against earlier runs — the two work together, they don't conflict.

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run it on a cron to keep your data fresh.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions the moment a run finishes.

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

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

const run = await client.actor('scrapesage/shopify-app-store-scraper').call({
    searchQueries: ['email marketing'],
    includeReviews: true,
    maxReviewsPerApp: 50,
    maxApps: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} records`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push new records straight into your CRM or sheet.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a run finds something new.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT, or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find every email-marketing app on the Shopify App Store with a free plan and pull their developer websites" and let it run this scraper for you.

### More scrapers from scrapesage

Pair this with our other lead-generation and competitive-intelligence scrapers:

- [Google Ads Transparency Scraper](https://apify.com/scrapesage/google-ads-transparency-scraper) — see who's advertising what on Google.
- [Facebook Ad Library Scraper](https://apify.com/scrapesage/facebook-ad-library-scraper) — Meta/Instagram competitor ad intelligence.
- [Bark Scraper](https://apify.com/scrapesage/bark-scraper) — service-provider profiles & B2B leads.
- [SAM.gov Scraper](https://apify.com/scrapesage/sam-gov-scraper) — US federal contract opportunities & contacts.
- [Multi-ATS Job Scraper](https://apify.com/scrapesage/multi-ats-job-scraper) — jobs from Greenhouse, Lever, Ashby, Workday & more.
- [Airbnb Scraper](https://apify.com/scrapesage/airbnb-scraper) — short-stay listings, prices & market monitor.
- [Eventbrite Scraper](https://apify.com/scrapesage/eventbrite-scraper) — events plus organizer leads with contacts.

### Tips

- **Start with `searchQueries` or `categories`** for discovery, then feed the resulting handles back through `appHandles` for repeatable, targeted runs.
- **Reviews paginate at 10 per page** — set `maxReviewsPerApp` to a multiple of 10 (e.g. 50, 100) for clean page boundaries.
- **Lead-gen workflow:** turn on `enrichDeveloperContacts`, then sort the dataset by `leadScore` and use the **Developer leads** view to export a ready-to-contact list.
- **Keep runs lean** with `maxApps`; the default Apify Proxy is sufficient — residential proxies are not required.
- **Scheduling + monitoringMode** = a daily feed of brand-new apps in your niche.

### FAQ

**Does it need a login or API key?** No. It reads the public Shopify App Store directly — no login, no cookies, no key.

**Can it search by keyword?** Yes. Shopify's keyword results render client-side, so the actor uses Shopify's own autocomplete to map each keyword to its most relevant categories and scrapes every app in them — reliable, server-side, and complete.

**How many reviews can I get?** As many as the app has — reviews paginate 10 per page and the actor follows them up to your `maxReviewsPerApp` limit, newest first by default.

**Where do developer contact details come from?** The App Store never exposes them. With `enrichDeveloperContacts` on, the actor visits the developer's own website (home + contact/about pages) and extracts public emails, phones and social links.

**Is this legal?** It collects only publicly available business data and no personal end-user data. As with any scraping, use the data in line with applicable laws and the source's terms.

**What formats can I export?** JSON, CSV, Excel, XML, RSS or HTML table — from the console or via the Apify API.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

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

Keywords to search, e.g. <code>email marketing</code>, <code>upsell</code>, <code>seo</code>. Each keyword is matched to the most relevant Shopify App Store categories (via Shopify's own autocomplete) and every app in them is scraped, paginated until the app limit is reached.

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

Category slugs or full category URLs to browse, e.g. <code>marketing-and-conversion-marketing-email-marketing</code> or <code>https://apps.shopify.com/categories/store-design-notifications-pop-ups</code>. Find slugs in any category page URL.

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

Specific apps to scrape directly — the handle from the URL (<code>klaviyo-email-marketing</code>) or the full app URL. Fastest, most precise input.

## `developerHandles` (type: `array`):

Scrape every app published by a developer. Use the partner slug (<code>klaviyo</code>) or a full <code>/partners/\<slug></code> URL. Great for mapping a competitor's whole app portfolio.

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

Any Shopify App Store URLs: app pages, category pages, search result pages or <code>/partners/\<slug></code> pages. Each is auto-detected and routed.

## `includeReviews` (type: `boolean`):

Fetch merchant reviews per app (rating, review text, store name, country, time using the app, and the developer's reply). Adds review pages per app.

## `maxReviewsPerApp` (type: `integer`):

Maximum reviews to fetch per app when 'Include reviews' is on (10 reviews per page).

## `reviewsSort` (type: `string`):

Order to fetch reviews in.

## `emitReviewRecords` (type: `boolean`):

In addition to the app records, push one flat record per review (type = "review") — a ready-to-analyse reviews table for sentiment/feature-request mining. Requires 'Include reviews'.

## `enrichDeveloperContacts` (type: `boolean`):

Visit each app developer's own website (home + contact/about, max 3 pages) and extract public contact emails, phone numbers and social links — turning every app into a B2B lead. The App Store never exposes these directly.

## `maxApps` (type: `integer`):

Maximum number of apps to scrape across all inputs.

## `monitoringMode` (type: `boolean`):

Output only apps not seen in previous runs of the same input — ideal for scheduled runs that return ONLY newly listed apps in a category/search. Works alongside Apify Schedules: the schedule triggers the run, monitoring mode deduplicates results.

## `maxConcurrency` (type: `integer`):

How many apps to fetch in parallel. 5 is a safe, fast default for the Shopify App Store.

## `proxyConfiguration` (type: `object`):

Proxy settings. The default Apify Proxy works well for the Shopify App Store; no residential proxy is required.

## Actor input object example

```json
{
  "searchQueries": [
    "email marketing"
  ],
  "includeReviews": false,
  "maxReviewsPerApp": 50,
  "reviewsSort": "newest",
  "emitReviewRecords": false,
  "enrichDeveloperContacts": false,
  "maxApps": 100,
  "monitoringMode": false,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped app records and optional flat review records as JSON items in the default dataset.

# 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": [
        "email marketing"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/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 = {
    "searchQueries": ["email marketing"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/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 '{
  "searchQueries": [
    "email marketing"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapesage/shopify-app-store-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Shopify App Store Scraper — Apps, Reviews & Developer Leads",
        "description": "Scrape the Shopify App Store: app listings, pricing plans, ratings, ratings histogram, reviews, Built for Shopify badges, categories, languages & developer contact leads. Search by keyword, category, developer or URL. No login. Monitoring mode. Export JSON, CSV, Excel.",
        "version": "1.0",
        "x-build-id": "TLkJofMI6gX4AApLW"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapesage~shopify-app-store-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapesage-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/scrapesage~shopify-app-store-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapesage-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/scrapesage~shopify-app-store-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapesage-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": {
                    "searchQueries": {
                        "title": "Search queries",
                        "type": "array",
                        "description": "Keywords to search, e.g. <code>email marketing</code>, <code>upsell</code>, <code>seo</code>. Each keyword is matched to the most relevant Shopify App Store categories (via Shopify's own autocomplete) and every app in them is scraped, paginated until the app limit is reached.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "categories": {
                        "title": "Categories",
                        "type": "array",
                        "description": "Category slugs or full category URLs to browse, e.g. <code>marketing-and-conversion-marketing-email-marketing</code> or <code>https://apps.shopify.com/categories/store-design-notifications-pop-ups</code>. Find slugs in any category page URL.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "appHandles": {
                        "title": "App handles or URLs",
                        "type": "array",
                        "description": "Specific apps to scrape directly — the handle from the URL (<code>klaviyo-email-marketing</code>) or the full app URL. Fastest, most precise input.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "developerHandles": {
                        "title": "Developer (partner) handles or URLs",
                        "type": "array",
                        "description": "Scrape every app published by a developer. Use the partner slug (<code>klaviyo</code>) or a full <code>/partners/&lt;slug&gt;</code> URL. Great for mapping a competitor's whole app portfolio.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Any Shopify App Store URLs: app pages, category pages, search result pages or <code>/partners/&lt;slug&gt;</code> pages. Each is auto-detected and routed.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "includeReviews": {
                        "title": "Include reviews",
                        "type": "boolean",
                        "description": "Fetch merchant reviews per app (rating, review text, store name, country, time using the app, and the developer's reply). Adds review pages per app.",
                        "default": false
                    },
                    "maxReviewsPerApp": {
                        "title": "Max reviews per app",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum reviews to fetch per app when 'Include reviews' is on (10 reviews per page).",
                        "default": 50
                    },
                    "reviewsSort": {
                        "title": "Reviews sort order",
                        "enum": [
                            "newest",
                            "oldest",
                            "highest_rating",
                            "lowest_rating",
                            "most_helpful"
                        ],
                        "type": "string",
                        "description": "Order to fetch reviews in.",
                        "default": "newest"
                    },
                    "emitReviewRecords": {
                        "title": "Emit one record per review",
                        "type": "boolean",
                        "description": "In addition to the app records, push one flat record per review (type = \"review\") — a ready-to-analyse reviews table for sentiment/feature-request mining. Requires 'Include reviews'.",
                        "default": false
                    },
                    "enrichDeveloperContacts": {
                        "title": "Enrich developer contact leads",
                        "type": "boolean",
                        "description": "Visit each app developer's own website (home + contact/about, max 3 pages) and extract public contact emails, phone numbers and social links — turning every app into a B2B lead. The App Store never exposes these directly.",
                        "default": false
                    },
                    "maxApps": {
                        "title": "Max apps",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of apps to scrape across all inputs.",
                        "default": 100
                    },
                    "monitoringMode": {
                        "title": "Monitoring mode (only new apps)",
                        "type": "boolean",
                        "description": "Output only apps not seen in previous runs of the same input — ideal for scheduled runs that return ONLY newly listed apps in a category/search. Works alongside Apify Schedules: the schedule triggers the run, monitoring mode deduplicates results.",
                        "default": false
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 15,
                        "type": "integer",
                        "description": "How many apps to fetch in parallel. 5 is a safe, fast default for the Shopify App Store.",
                        "default": 5
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. The default Apify Proxy works well for the Shopify App Store; no residential proxy is required.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
