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

App listings with the full pricing ladder and dated reviews. Search results need a Turbo-Frame request; this handles it.

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

## Pricing

$10.00 / 1,000 apps

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/actors/running/actors-in-store.md#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

Every app in the Shopify App Store, with **the full pricing ladder** and **dated reviews**.

![Eight apps, the same badge, eight different limits](https://img.namubase.com/apify/shopify-app-store-scraper/01-free-plan.png)

### The problem this solves

The listing badge says `Free plan available`. It does not say what the free plan allows.

We measured 20 apps in one category and the free plans were: **10 products** (Ablestar),
**25 variants** (Delta), **1 task per month** (Fast), **100 price changes per month** (Springify),
**1 active campaign** (Smart). Three of the twenty had no paid plan at all, and those three had
1, 6 and 11 reviews between them.

None of that is visible from a search page. This actor opens each app and reads every plan with its
price, its interval and its limits, so you can see what a free tier really gives you and where the
paid ladder starts.

![Every plan of one app with price, interval and limits](https://img.namubase.com/apify/shopify-app-store-scraper/02-pricing-ladder.png)

It also reads reviews **with their dates**, which is the only public way to tell whether an app is
alive right now or coasting on old reviews. Shopify's own default order is relevance, which hands
back the same reviews on every run; this actor asks for **newest first**, and pages through until it
has as many as you asked for. Shopify serves 10 per page, so 50 reviews means five pages.

![Reviews with dates, shop, country and time on the app](https://img.namubase.com/apify/shopify-app-store-scraper/03-reviews.png)

### What it returns

One row per app:

| Field | |
|---|---|
| `handle` `title` `url` `iconUrl` | identity |
| `developer` | who publishes it |
| `rating` `reviewCount` | as shown on the listing |
| `pricingBadge` | the listing badge, verbatim |
| `plans[]` | **every plan**: `name`, `price`, `currency`, `interval`, `features[]` |
| `freePlan` | the free plan and **what it actually allows** |
| `lowestPaidUsd` `highestPaidUsd` `planCount` | the ladder at a glance |
| `builtForShopify` | the BFS badge |
| `tagline` `listPosition` | as shown in search |
| `reviews[]` | optional: `rating`, `date`, `body`, `shop`, `country`, `usedFor`, newest first |

### Input

```json
{
  "queries": ["bulk price editor"],
  "maxApps": 100,
  "includePricing": true,
  "includeReviews": false,
  "maxReviewsPerApp": 20,
  "reviewSortBy": "newest"
}
```

You can also pass `handles` (`"bulk-product-editor"` or the full URL) or `categoryUrls`
(any App Store listing page).

### Pricing

Charged **per app row that reaches the dataset**, not per minute of compute. A run that finds
nothing costs nothing.

### Notes

- Search results are served in a Turbo frame. A plain request for `/search?q=…` returns the page
  shell with zero app cards; this actor sends the frame request that returns the cards. That one
  detail is the difference between 24 results and 0.
- Use a proxy for long runs. Shopify rate limits by address.
- One app that fails to load does not stop the run. It is recorded in `RUN_SUMMARY` with the
  reason, and the rest of the apps still come back.

# Actor input Schema

## `queries` (type: `array`):

App Store search terms, for example "bulk price editor". Each term is paged until maxApps is reached.

## `handles` (type: `array`):

Specific apps, for example "bulk-product-editor" or the full https://apps.shopify.com/... URL.

## `categoryUrls` (type: `array`):

Any App Store listing page, for example https://apps.shopify.com/categories/finding-products-dropshipping

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

Stop after this many unique apps.

## `includePricing` (type: `boolean`):

Opens each app page and reads every plan with its price and limits. The listing badge only says "Free plan available" and never says what the free plan actually allows.

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

Newest-first reviews with their dates, so you can measure how active an app is right now.

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

Only used when reviews are included. Shopify serves 10 reviews per page, so this actor pages through until it has this many.

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

Recommended. Shopify rate limits by address on long runs.

## `reviewSortBy` (type: `string`):

Shopify's own default is relevance, which returns the same reviews on every run. This actor uses newest so you can see what changed since last time.

## Actor input object example

```json
{
  "queries": [
    "bulk price editor"
  ],
  "maxApps": 100,
  "includePricing": true,
  "includeReviews": false,
  "maxReviewsPerApp": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "reviewSortBy": "newest"
}
```

# Actor output Schema

## `apps` (type: `string`):

One row per app: identity, rating, every pricing plan with its limits, and optionally recent reviews.

## `appsCsv` (type: `string`):

The same rows as a spreadsheet.

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

How many apps came back, and every app whose pricing or reviews could not be read, with the reason. Watch this rather than the row count.

# 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 = {
    "queries": [
        "bulk price editor"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("sellerkit/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 = { "queries": ["bulk price editor"] }

# Run the Actor and wait for it to finish
run = client.actor("sellerkit/shopify-app-store-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "bulk price editor"
  ]
}' |
apify call sellerkit/shopify-app-store-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sellerkit/shopify-app-store-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/9gIxkswgQeuoDmfW6/builds/gJdwLbP4LOGzKTwzb/openapi.json
