# Shop.app Scraper (`hypebridge/shop-app-scraper`) Actor

Shop.app Scraper extracts product data from Shop.app including category pages, keyword search results, and the public deals page. It is designed for catalog research, merchandising analysis, pricing checks, and product discovery workflows.

- **URL**: https://apify.com/hypebridge/shop-app-scraper.md
- **Developed by:** [Hypebridge](https://apify.com/hypebridge) (community)
- **Categories:** E-commerce, Automation, Integrations
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 results

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 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

### What does Shop.app Scraper do?

**Shop.app Scraper** extracts product data from [Shop.app](https://shop.app), including category pages, keyword search results, and the public deals page. It is designed for catalog research, merchandising analysis, pricing checks, and product discovery workflows where you need structured results instead of browsing the site manually.

### Why scrape Shop.app?

- **Track category assortments**: Pull products from categories like socks, beauty, home, or fitness to monitor what is being promoted.
- **Research search demand**: Run keyword searches and inspect which products surface for a term.
- **Monitor deals and discounts**: Capture products shown on the public deals page, including sale pricing where available.
- **Enrich product records**: Open product detail pages to collect descriptions, variants, options, reviews, and media.

### What data can Shop.app Scraper extract?

| Field | Type | Description |
|-------|------|-------------|
| `id` | String | Shopify product ID |
| `title` | String | Product title |
| `url` | String | Canonical Shop.app product URL |
| `shopName` | String | Merchant name |
| `priceAmount` | String | Current price |
| `originalPriceAmount` | String | Original price when discounted |
| `discountPercent` | Number | Computed discount percentage |
| `reviewCount` | Number | Review count |
| `description` | String | Product description |
| `variants` | Array | Variant pricing and selected options |
| `reviews` | Array | Product review records |
| `sourceLabel` | String | Whether the record came from a category, search, or deals page |

The **Output** tab contains the full schema, including images, offers, media, product warnings, and merchant metadata.

### How to scrape Shop.app

1. Open **Shop.app Scraper** in Apify.
2. Add one or more category URLs, search terms, or enable the deals page.
3. Set **Max items** to control how many products the run can collect.
4. Keep **Enrich with product detail** enabled if you need variants, reviews, and full descriptions.
5. Start the run and download the dataset as JSON, CSV, Excel, or HTML.

### Input

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | Array | `[]` | Shop.app category URLs to scrape |
| `searchTerms` | Array | `[]` | Search terms to submit through the Shop.app search UI |
| `scrapeOffers` | Boolean | `false` | Include the public deals page |
| `enrichProductDetail` | Boolean | `true` | Open each product page for richer fields |
| `maxItems` | Number | `20` | Maximum number of products to extract |
| `debugMode` | Boolean | `false` | Save screenshots and HTML when requests fail |

#### Example input: category scrape

```json
{
  "startUrls": [
    { "url": "https://shop.app/categories/19/socks" }
  ],
  "enrichProductDetail": true,
  "maxItems": 25
}
````

#### Example input: search scrape

```json
{
  "searchTerms": ["wrinkle free travel clothes"],
  "maxItems": 20
}
```

#### Example input: deals scrape

```json
{
  "scrapeOffers": true,
  "enrichProductDetail": false,
  "maxItems": 50
}
```

### Output

Results are stored in the **Dataset** tab. Each record includes both product fields and run metadata such as `sourceUrl`, `sourceLabel`, and `scrapedAt`.

#### Sample output

```json
{
  "id": "6630346915889",
  "slug": "body-wash",
  "title": "Body Wash",
  "url": "https://shop.app/products/6630346915889/body-wash",
  "shopName": "SALT & STONE",
  "priceAmount": "36.0",
  "priceCurrency": "USD",
  "reviewCount": 5081,
  "description": "A multi-benefit, refreshing gel body cleanser.",
  "variants": [
    {
      "id": "gid://shopify/ProductVariant/39446676111409",
      "title": "Bergamot & Hinoki / 15.2 FL OZ / 450 ML",
      "price": { "amount": "36.0", "currencyCode": "USD" },
      "compareAtPrice": { "amount": null, "currencyCode": null },
      "availableForSale": true,
      "selectedOptions": [
        { "name": "Scent", "value": "Bergamot & Hinoki" }
      ],
      "sellingPlanAllocations": []
    }
  ],
  "sourceUrl": "https://shop.app/categories/19/socks",
  "sourceLabel": "CATEGORY_PRODUCTS",
  "searchTerm": null,
  "scrapedAt": "2026-04-17T23:15:00.000Z",
  "enrichError": false
}
```

### Tips

- Start with a low `maxItems` value when validating a new source.
- Disable `enrichProductDetail` if you only need fast list-level price checks.
- Enable `debugMode` when diagnosing failures; screenshots and HTML are saved to the key-value store.

### FAQ

#### Can I scrape both categories and search terms in one run?

Yes. The actor accepts both, and `maxItems` applies across the combined run.

#### What happens if a detail page fails?

The actor saves the base product record with `enrichError: true` instead of dropping the item entirely.

#### Does the actor require login?

No. It only uses public Shop.app pages and public product detail pages.

### Support

- Bugs or missing fields: open an issue in the actor repository.
- Programmatic usage: use the Apify API or schedule runs directly from the Apify platform.

> **Disclaimer**: This actor extracts publicly visible product data. You are responsible for ensuring your use complies with applicable law, the site's terms, and any privacy obligations in your jurisdiction.

# Actor input Schema

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

Shop.app URLs to scrape — category pages, the offers page (https://shop.app/offers), or product pages. Leave empty to auto-discover top-level categories.

## `enrichProductDetail` (type: `boolean`):

Open each product page to extract full descriptions, options, variants, reviews, and media. Disable for faster list-only snapshots.

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

Maximum number of products to extract across all sources. Set to 0 for unlimited.

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

Keywords to search for on Shop.app. Runs after any provided URLs.

## `debugMode` (type: `boolean`):

Save screenshots and HTML to the key-value store when a request fails after retries.

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

Optional proxy settings. Start without a proxy and add residential proxies only if the site begins blocking your runs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://shop.app/categories/19/socks"
    }
  ],
  "enrichProductDetail": true,
  "maxItems": 20,
  "searchTerms": [],
  "debugMode": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overviewView` (type: `string`):

Key product fields in an overview dataset view

## `defaultView` (type: `string`):

Complete dataset with every extracted field

## `files` (type: `string`):

Key-value store files, including screenshots and HTML from failed requests when debug mode is enabled

# 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 = {
    "startUrls": [
        {
            "url": "https://shop.app/categories/19/socks"
        }
    ],
    "enrichProductDetail": true,
    "maxItems": 0,
    "searchTerms": [],
    "debugMode": false,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("hypebridge/shop-app-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 = {
    "startUrls": [{ "url": "https://shop.app/categories/19/socks" }],
    "enrichProductDetail": True,
    "maxItems": 0,
    "searchTerms": [],
    "debugMode": False,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("hypebridge/shop-app-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 '{
  "startUrls": [
    {
      "url": "https://shop.app/categories/19/socks"
    }
  ],
  "enrichProductDetail": true,
  "maxItems": 0,
  "searchTerms": [],
  "debugMode": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call hypebridge/shop-app-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Shop.app Scraper",
        "description": "Shop.app Scraper extracts product data from Shop.app including category pages, keyword search results, and the public deals page. It is designed for catalog research, merchandising analysis, pricing checks, and product discovery workflows.",
        "version": "0.0",
        "x-build-id": "ZxkVthhnD12S9tJrL"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/hypebridge~shop-app-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-hypebridge-shop-app-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/hypebridge~shop-app-scraper/runs": {
            "post": {
                "operationId": "runs-sync-hypebridge-shop-app-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/hypebridge~shop-app-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-hypebridge-shop-app-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": {
                    "startUrls": {
                        "title": "URLs",
                        "type": "array",
                        "description": "Shop.app URLs to scrape — category pages, the offers page (https://shop.app/offers), or product pages. Leave empty to auto-discover top-level categories.",
                        "default": [],
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "enrichProductDetail": {
                        "title": "Enrich with product detail",
                        "type": "boolean",
                        "description": "Open each product page to extract full descriptions, options, variants, reviews, and media. Disable for faster list-only snapshots.",
                        "default": true
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of products to extract across all sources. Set to 0 for unlimited.",
                        "default": 20
                    },
                    "searchTerms": {
                        "title": "Search terms",
                        "type": "array",
                        "description": "Keywords to search for on Shop.app. Runs after any provided URLs.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "debugMode": {
                        "title": "Debug mode",
                        "type": "boolean",
                        "description": "Save screenshots and HTML to the key-value store when a request fails after retries.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional proxy settings. Start without a proxy and add residential proxies only if the site begins blocking your runs.",
                        "default": {
                            "useApifyProxy": 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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
