# Shopify App Store Scraper — Apps, Reviews & Pricing | $0.02 (`devsef/shopify-app-store-scraper`) Actor

Scrape the Shopify App Store by search term, category, or direct app URL. Get app name, rating, review count, pricing plans, developer and categories as clean JSON. Ideal for app market research, competitor analysis and lead lists. Flat $0.02 per run — cheapest in its class.

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

## Pricing

from $20.00 / 1,000 apps scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

### What does Shopify App Store Scraper do?

**Shopify App Store Scraper extracts structured data from the [Shopify App Store](https://apps.shopify.com/) (apps.shopify.com) by search term, category, or direct app URL.** For every app it returns name, rating, review count, pricing hint, and icon — and, on request, the full detail page: description, developer, pricing plans, categories, supported languages, and launch date. Point it at a search term like `"email marketing"`, a category page, or a list of specific app URLs, and get clean JSON back.

Because it runs on the Apify platform, you get API access, scheduling, webhooks, integrations (Slack, Make, n8n, Zapier), and monitoring out of the box — no need to maintain your own scraper against a site that changes its markup regularly.

### Why use Shopify App Store Scraper?

- **Competitive & market research** — track which apps dominate a category, how they're priced, and how their ratings evolve over time.
- **App developers & agencies** — analyze competitor pricing models and feature sets before launching or repositioning your own app.
- **Lead generation** — find app developers active in a niche (public developer trade names, not personal data).
- **AI agents & data pipelines** — structured, deduplicated app data is ready to feed into an LLM, a spreadsheet, or a BI dashboard without any cleanup.
- **Predictable flat pricing** — one flat fee per run covers up to 500 apps, no matter how many fields you request.

### How to use Shopify App Store Scraper

1. Open the Actor and go to the **Input** tab.
2. Fill in at least one of: **Search terms**, **Category URLs**, or **Direct app URLs**.
3. Optionally set **Max apps** (default 100, hard cap 500) and enable **Include app detail pages** if you want full details for search/category results.
4. Click **Start**. Results appear in the dataset as they're scraped.
5. Download the dataset in JSON, CSV, Excel, or connect it directly to your workflow via API, webhook, or integration.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `searchTerms` | array | – | Keywords to search (e.g. `"email marketing"`). Up to 10 per run, each spanning up to 20 result pages. |
| `categoryUrls` | array | – | Category URLs, e.g. `https://apps.shopify.com/categories/marketing-and-conversion`. Up to 10 per run. Must be `apps.shopify.com` URLs. |
| `appUrls` | array | – | Direct app URLs to scrape in full detail mode, e.g. `https://apps.shopify.com/klaviyo-email-marketing`. Up to 100 per run. Must be `apps.shopify.com` URLs. |
| `maxApps` | integer | 100 | Maximum total apps returned across all sources combined (hard cap: 500). |
| `includeDetails` | boolean | `false` | Also fetch the detail page for every app found via `searchTerms`/`categoryUrls` (adds description, developer, pricing plans, categories, languages, launch date). Direct `appUrls` are always fetched in full detail. |

At least one of `searchTerms`, `categoryUrls`, or `appUrls` is required.

```json
{
    "searchTerms": ["email marketing"],
    "maxApps": 50,
    "includeDetails": false
}
````

### Output

One dataset item per app, deduplicated by app URL across all sources. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

```json
{
    "name": "Klaviyo: Email Marketing & SMS",
    "appUrl": "https://apps.shopify.com/klaviyo-email-marketing",
    "tagline": "Email marketing, SMS, & WhatsApp that turn messages into sales",
    "rating": 4.7,
    "reviewsCount": 2958,
    "pricingHint": "Free to install",
    "iconUrl": "https://cdn.shopify.com/app-store/listing_images/…/icon.png",
    "description": "Klaviyo is a leading email and sms marketing app for Shopify…",
    "developer": "Klaviyo",
    "developerUrl": "https://developers.klaviyo.com/en",
    "pricingPlans": [
        { "name": "Free", "price": "Free to install" },
        { "name": "SMS", "price": "$15/month" },
        { "name": "Email", "price": "$20/month" }
    ],
    "categories": ["Email marketing", "SMS marketing"],
    "languages": ["English", "French", "Spanish", "German", "Dutch"],
    "launchedAt": "2012-09-20T00:00:00.000Z",
    "sourceQuery": "email marketing"
}
```

A per-run report is stored in the key-value store under `SUMMARY` (per search term/category/URL: status and app counts).

#### Data fields

| Field | Description |
|---|---|
| `name` | App name |
| `appUrl` | Canonical App Store URL (tracking parameters stripped) |
| `tagline` | Short marketing subtitle, or `null` |
| `rating` | Average star rating (0–5), or `null` |
| `reviewsCount` | Total review count, or `null` |
| `pricingHint` | Short pricing label from the listing card (e.g. "Free to install"), or `null` |
| `iconUrl` | App icon image URL, or `null` |
| `description` | Full app description (max 1000 characters), or `null` if not fetched |
| `developer` | Developer trade name (public catalogue data), or `null` if not fetched |
| `developerUrl` | Developer's own website, or `null` if not fetched |
| `pricingPlans` | Array of `{ name, price }` pricing plans, empty if not fetched |
| `categories` | App Store categories, empty if not fetched |
| `languages` | Supported storefront languages, empty if not fetched |
| `launchedAt` | Launch date in ISO 8601, or `null` |
| `sourceQuery` | The search term, category URL, or direct URL that found this app |

### How much does it cost to scrape the Shopify App Store?

**Flat $0.02 per run — up to 500 apps included, no per-app fees.** Whether your run returns 5 apps or 500, you pay the same flat fee. A run is only charged when it returns at least one app; failed or empty runs are never charged.

Comparable Shopify App Store scrapers on the market typically charge $0.10 per run plus $0.002–$0.005 per app/result. For a 500-app run that works out to roughly $1.10–$2.60 — **this Actor is 15–25× cheaper** for the same size run, at a predictable flat price.

### Tips

- Use `categoryUrls` for a quick, curated snapshot of a category's top apps (no detail fetch needed).
- Combine `searchTerms` with `includeDetails: true` when you need pricing plans, categories, and languages — this is slower (one extra request per app) but included in the same flat price.
- Use `maxApps` to bound large searches; the Actor stops fetching additional pages as soon as the cap is reached.
- `appUrls` is the fastest way to refresh detail data for a known list of apps (e.g. your competitors).

### FAQ & disclaimers

**Is it legal to scrape the Shopify App Store?** This Actor only reads public app catalogue and marketing data — the same information any visitor sees on apps.shopify.com. It does not collect personal data: no reviewer names, no review text, no developer contact details or addresses are extracted, only the developer's public trade name. Please make sure your use complies with Shopify's terms of service.

**Why is `description`/`developer`/`pricingPlans` empty for some apps?** Those fields only come from the app's detail page. Enable `includeDetails` for search/category results, or use `appUrls` directly, to get them.

**A search term returns fewer apps than expected — why?** Some niche search terms have few matching apps on the Shopify App Store itself. Try a broader term or a related category URL.

**Found a bug or missing a feature?** Please report it via the Issues tab — feedback is usually answered within a few days.

# Actor input Schema

## `searchTerms` (type: `array`):

Keywords to search on the Shopify App Store (e.g. "email marketing"). Up to 10 terms per run — extra terms beyond that are ignored with a warning. Each term can span up to 20 result pages.

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

Shopify App Store category URLs to scrape, e.g. https://apps.shopify.com/categories/marketing-and-conversion. Up to 10 per run. Must be apps.shopify.com URLs.

## `appUrls` (type: `array`):

Direct Shopify App Store app URLs to scrape in full detail mode, e.g. https://apps.shopify.com/klaviyo-email-marketing. Up to 100 per run. Must be apps.shopify.com URLs.

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

Maximum total number of apps to return across all search terms, categories and direct URLs combined (hard cap: 500).

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

When enabled, also fetches the detail page for every app found via searchTerms/categoryUrls to add description, developer, pricing plans, categories, languages and launch date. Slower, but included in the same flat price. Direct appUrls are always fetched in full detail regardless of this setting.

## Actor input object example

```json
{
  "searchTerms": [
    "email marketing"
  ],
  "maxApps": 100,
  "includeDetails": false
}
```

# Actor output Schema

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

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "email marketing"
    ]
};

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=devsef/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 & Pricing | $0.02",
        "description": "Scrape the Shopify App Store by search term, category, or direct app URL. Get app name, rating, review count, pricing plans, developer and categories as clean JSON. Ideal for app market research, competitor analysis and lead lists. Flat $0.02 per run — cheapest in its class.",
        "version": "0.0",
        "x-build-id": "vd6gPk3e11P14b5FE"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/devsef~shopify-app-store-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-devsef-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/devsef~shopify-app-store-scraper/runs": {
            "post": {
                "operationId": "runs-sync-devsef-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/devsef~shopify-app-store-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-devsef-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": {
                    "searchTerms": {
                        "title": "Search terms",
                        "type": "array",
                        "description": "Keywords to search on the Shopify App Store (e.g. \"email marketing\"). Up to 10 terms per run — extra terms beyond that are ignored with a warning. Each term can span up to 20 result pages.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "categoryUrls": {
                        "title": "Category URLs",
                        "type": "array",
                        "description": "Shopify App Store category URLs to scrape, e.g. https://apps.shopify.com/categories/marketing-and-conversion. Up to 10 per run. Must be apps.shopify.com URLs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "appUrls": {
                        "title": "Direct app URLs",
                        "type": "array",
                        "description": "Direct Shopify App Store app URLs to scrape in full detail mode, e.g. https://apps.shopify.com/klaviyo-email-marketing. Up to 100 per run. Must be apps.shopify.com URLs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxApps": {
                        "title": "Max apps",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum total number of apps to return across all search terms, categories and direct URLs combined (hard cap: 500).",
                        "default": 100
                    },
                    "includeDetails": {
                        "title": "Include app detail pages",
                        "type": "boolean",
                        "description": "When enabled, also fetches the detail page for every app found via searchTerms/categoryUrls to add description, developer, pricing plans, categories, languages and launch date. Slower, but included in the same flat price. Direct appUrls are always fetched in full detail regardless of this setting.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
