# Shopify App Store Scraper · Apps, Pricing, Reviews & Ranks (`reapx/shopify-app-store-scraper`) Actor

Shopify App Store scraper to extract apps, pricing plans, developer info, ratings, and reviews. Scrape Shopify App Store category listings or search queries for ecommerce market research and competitor tracking.

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

## Pricing

from $2.20 / 1,000 app returneds

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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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, Pricing, Reviews & Ranks

**Shopify App Store scraper** to scrape app listings, pricing plans, developer info, ratings, and user reviews from the Shopify App Store marketplace. Get structured data per app: developer name, star rating, review count, monthly pricing tiers, launch date, and category rank.

Extract data by category slugs, search terms, or specific app handles for ecommerce market research and competitor analysis.

### What you get per app

| Field | |
|---|---|
| `appHandle` | the app's permanent identifier, stable across runs |
| `appName` · `developer` · `developerHandle` | who publishes it |
| `description` | the listing's own summary |
| `ratingValue` · `reviewCount` | merchant rating out of 5, and how many reviews it rests on |
| `pricingPlans` | every plan: name, price as shown, monthly USD figure, fine print |
| `lowestPaidPlanUsd` · `highestPaidPlanUsd` · `hasFreePlan` | the pricing shape at a glance |
| `categorySlug` · `categoryRank` | where it sits in the category listing, 1 being the top slot |
| `launchedOn` · `iconUrl` · `appUrl` · `retrievedAt` | |

### How to find a category slug

Open any category on the App Store and take the last segment of the URL.
`https://apps.shopify.com/categories/marketing-and-conversion-marketing` →
`marketing-and-conversion-marketing`. There are 161 of them, from
`store-design-search-and-navigation` to `orders-and-shipping-returns-and-warranty`.

### Track a competitor's pricing

Put the competitor's handles in **Specific app handles** and schedule the run daily. Each
run captures the full plan ladder as advertised that day, so a price change, a new tier or a
dropped free plan shows up as a diff between two rows with the same `appHandle`.

### Watch a category's ranking

Set one category, raise **Category pages to read**, and schedule it. `categoryRank` is the
listing position at run time, so consecutive runs show which apps climbed and which slipped.

### Find apps by how they charge

**Pricing model** filters to free-only, freemium (a free plan *and* a paid plan) or paid.
Combine with **Minimum number of reviews** to separate established apps from new listings.

### Input configuration

Every field is optional. The prefilled values below are what runs if you press Start without changing anything.

#### What to list

Give categories, specific app handles, or both. Leave everything empty to list the marketing category.

| Field | Type | Accepts | What it does |
| --- | --- | --- | --- |
| `categories` | list | one value per line | App Store category slugs, one per line, taken from the end of a category URL - for example marketing-and-conversion-marketing, store-design-search-and-navigation, orders-and-shipping-inventory. Apps are returned in the order the category ranks them. Prefilled with `["marketing-and-conversion-marketing"]`. |
| `appHandles` | list | one value per line | Individual apps to pull, one per line, using the handle from the listing URL - klaviyo-email-marketing, judgeme-product-reviews, or a full https://apps.shopify.com/... URL. |
| `pagesPerCategory` | integer | 1 to 20 | How deep to go down each category listing. Each page holds about 30 apps. Prefilled with `1`. |

#### Filters

All optional. Applied after each app's listing page is read.

| Field | Type | Accepts | What it does |
| --- | --- | --- | --- |
| `searchTerm` | string | free text | Keep only apps whose name, description or developer contains this text. Matching is case-insensitive. |
| `minRating` | integer | 0 to 5 | Keep only apps rated at least this highly out of 5. Apps with no rating are dropped. |
| `minReviews` | integer | 0 to 100000 | Keep only apps with at least this many merchant reviews - a proxy for how established an app is. |
| `pricing` | string | `any`, `free`, `freemium`, `paid` | Restrict to apps by how they charge. Prefilled with `"any"`. |

#### Output

How many rows you get and how politely they are fetched.

| Field | Type | Accepts | What it does |
| --- | --- | --- | --- |
| `maxApps` | integer | 1 to 2000 | Hard ceiling on the rows this run produces, and therefore on what it costs. You are charged per app returned. Prefilled with `30`. |
| `requestsPerSecond` | integer | 1 to 6 | Politeness against the Shopify App Store. Lower this if you see the source refusing requests. Prefilled with `3`. |

### Pricing

Pay per event. The primary event is **App returned** (`app-returned`), charged at **$0.004 per event** on the free plan, falling to $0.002 on the highest tier.

One Shopify App Store listing delivered as a complete row, including its rating, review count and every advertised pricing plan. Blocked sources and empty result sets are never charged.

Minimum charge cap per run: $0.02.

Tiered discounts apply automatically on every paid Apify plan. Platform usage is absorbed by the Actor, so the per-event price is the whole price.

### Usage examples

#### The prefilled run, which is what Start does with nothing changed

```json
{
  "categories": [
    "marketing-and-conversion-marketing"
  ],
  "pagesPerCategory": 1,
  "pricing": "any",
  "maxApps": 30,
  "requestsPerSecond": 3
}
```

#### Filter by app store categories

```json
{
  "categories": [
    "marketing-and-conversion-marketing",
    "store-management-finances"
  ],
  "pagesPerCategory": 1,
  "pricing": "any",
  "maxApps": 30,
  "requestsPerSecond": 3
}
```

#### Filter by specific app handles

```json
{
  "categories": [
    "marketing-and-conversion-marketing"
  ],
  "pagesPerCategory": 1,
  "pricing": "any",
  "maxApps": 30,
  "requestsPerSecond": 3,
  "appHandles": [
    "klaviyo-email-marketing",
    "judgeme-product-reviews"
  ]
}
```

#### Filter by category pages to read

```json
{
  "categories": [
    "marketing-and-conversion-marketing"
  ],
  "pagesPerCategory": 3,
  "pricing": "any",
  "maxApps": 30,
  "requestsPerSecond": 3
}
```

#### Filter by keyword

```json
{
  "categories": [
    "marketing-and-conversion-marketing"
  ],
  "pagesPerCategory": 1,
  "pricing": "any",
  "maxApps": 30,
  "requestsPerSecond": 3,
  "searchTerm": "email"
}
```

### Output example

One row, exactly as the actor wrote it to the dataset:

```json
{
  "appHandle": "transtore-language-and-currency",
  "appName": "TS ‑ AI Language Translate",
  "developer": "Transtore",
  "developerHandle": "transtore-app",
  "description": "Free AI localization app: Translate your store into multi languages, convert currencies, auto-switch language & currency with geolocation to boost global sales.",
  "ratingValue": 4.6,
  "reviewCount": 723,
  "pricingPlanCount": 0,
  "pricingPlans": [],
  "lowestPaidPlanUsd": null,
  "highestPaidPlanUsd": null,
  "hasFreePlan": false,
  "launchedOn": "November 4, 2022",
  "categorySlug": "store-design-internationalization",
  "categoryRank": 1,
  "iconUrl": "https://cdn.shopify.com/app-store/listing_images/ae0c66bf70ba73592fdf83cdeef87f99/icon/CNP7vuKwlJEDEAE=.png",
  "appUrl": "https://apps.shopify.com/transtore-language-and-currency",
  "retrievedAt": "2026-08-03T05:22:23Z"
}
```

#### Fields on every row

| Field | Type | What it is |
| --- | --- | --- |
| `appHandle` | string | The app's permanent identifier - the last path segment of its App Store listing URL. Stable across runs and unique per app. |
| `appName` | string | The listing's display name as shown in the App Store. |
| `developer` | string | The partner or company that publishes the app. |
| `developerHandle` | string | The developer's partner-page identifier, usable to find their other apps. |
| `description` | string | The listing's own summary of what the app does. |
| `ratingValue` | number | Average merchant rating out of 5, as published on the listing. |
| `reviewCount` | integer | How many merchant reviews the rating is computed from. |
| `pricingPlanCount` | integer | How many pricing plans the listing advertises. |
| `pricingPlans` | list | Every advertised plan in listing order, each with its name, the price exactly as shown, the monthly figure in USD where one is stated, and the plan's fine print. |
| `lowestPaidPlanUsd` | number | The lowest monthly price across the app's paid plans. Null when the app has no paid plan. |
| `highestPaidPlanUsd` | number | The highest monthly price across the app's paid plans. Null when the app has no paid plan. |
| `hasFreePlan` | true/false | True when at least one advertised plan carries no monthly price - free, or free to install. |
| `launchedOn` | string | The date the listing states the app went live on the App Store. |
| `categorySlug` | string | The category listing this app was found in. Null for apps requested by handle. |
| `categoryRank` | integer | The app's position in that category's listing at the time of the run - 1 is the top slot. Null for apps requested by handle. |
| `iconUrl` | string | The app's listing icon, served from Shopify's CDN. |
| `appUrl` | string | The app's public App Store page. |
| `retrievedAt` | string | When this row was read from the App Store, in UTC. |

3 named dataset views ship with it: **Apps**, **Pricing**, **Category ranking**. They drive the Output tab in Console and the Output block on the Actor's `.md` page.

### FAQ

**How many apps are there?** The App Store's English index lists over 24,000. This actor
reads them through the category listings, so how many you get is set by how many categories
you give it and how deep you read.

**Does it need an API key or a Shopify store?** No. Everything it reads is the public
listing, fetched over plain HTTP with no browser and no login.

**How fresh is the rating?** It is read from the listing page during the run, so it is as
fresh as the page itself.

**Why is `categoryRank` null on some rows?** Apps requested by handle were not discovered
through a category listing, so they have no rank in one.

**What is the stable identifier?** `appHandle`. It is the app's permanent URL segment and
the right key to join runs together over time.

***

Unofficial - not affiliated with Shopify. Collects public data only. reapx.
Contact reapxdev@proton.me.

### The full published archive

Every run of this Actor is published as a permanent, citable page on **[reapx.dev](https://reapx.dev/data/shopify-app-store-scraper/)** —
one page per entity, built from the real rows of real runs, with the run IDs it came from named
on the page.

- **[shopify app store scraper archive](https://reapx.dev/data/shopify-app-store-scraper/)** — every entity this Actor has observed
- **[All reapx datasets](https://reapx.dev/data/)** — 20 sources, tens of thousands of pages
- **[llms.txt](https://reapx.dev/llms.txt)** · **[feed.json](https://reapx.dev/feed.json)** ·
  **[feed.xml](https://reapx.dev/feed.xml)** — the machine-readable index, for agents

Each archive page carries Dataset JSON-LD, a canonical URL and the identifiers used, so an agent
can resolve an entity without running anything. Nothing on those pages is estimated or modelled.

# Actor input Schema

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

App Store category slugs, one per line, taken from the end of a category URL - for example marketing-and-conversion-marketing, store-design-search-and-navigation, orders-and-shipping-inventory. Apps are returned in the order the category ranks them.

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

Individual apps to pull, one per line, using the handle from the listing URL - klaviyo-email-marketing, judgeme-product-reviews, or a full https://apps.shopify.com/... URL.

## `pagesPerCategory` (type: `integer`):

How deep to go down each category listing. Each page holds about 30 apps.

## `searchTerm` (type: `string`):

Keep only apps whose name, description or developer contains this text. Matching is case-insensitive.

## `minRating` (type: `integer`):

Keep only apps rated at least this highly out of 5. Apps with no rating are dropped.

## `minReviews` (type: `integer`):

Keep only apps with at least this many merchant reviews - a proxy for how established an app is.

## `pricing` (type: `string`):

Restrict to apps by how they charge.

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

Hard ceiling on the rows this run produces, and therefore on what it costs. You are charged per app returned.

## `requestsPerSecond` (type: `integer`):

Politeness against the Shopify App Store. Lower this if you see the source refusing requests.

## Actor input object example

```json
{
  "categories": [
    "marketing-and-conversion-marketing",
    "store-management-finances"
  ],
  "appHandles": [
    "klaviyo-email-marketing",
    "judgeme-product-reviews"
  ],
  "pagesPerCategory": 3,
  "searchTerm": "email",
  "minRating": 4,
  "minReviews": 100,
  "pricing": "freemium",
  "maxApps": 100,
  "requestsPerSecond": 3
}
```

# Actor output Schema

## `overview` (type: `string`):

The overview view of this run's dataset.

## `pricing` (type: `string`):

The pricing view of this run's dataset.

## `ranking` (type: `string`):

The ranking view of this run's dataset.

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

Every record this run produced, with all fields and no view applied. Field-level titles, types, descriptions and examples are declared in the dataset schema.

# 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 = {
    "categories": [
        "marketing-and-conversion-marketing"
    ],
    "pagesPerCategory": 1,
    "pricing": "any",
    "maxApps": 30,
    "requestsPerSecond": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("reapx/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 = {
    "categories": ["marketing-and-conversion-marketing"],
    "pagesPerCategory": 1,
    "pricing": "any",
    "maxApps": 30,
    "requestsPerSecond": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("reapx/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 '{
  "categories": [
    "marketing-and-conversion-marketing"
  ],
  "pagesPerCategory": 1,
  "pricing": "any",
  "maxApps": 30,
  "requestsPerSecond": 3
}' |
apify call reapx/shopify-app-store-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/1YVeg0kdsuX5wcgZm/builds/eaAMYnyN7lDLpXbtc/openapi.json
