# Lemon Squeezy Scraper (`bitdoze/lemon-squeezy-scraper`) Actor

Scrape product data (names, prices, sales counts, images, product IDs) from any Lemon Squeezy storefront.

- **URL**: https://apify.com/bitdoze/lemon-squeezy-scraper.md
- **Developed by:** [Dragos Mihai Balota](https://apify.com/bitdoze) (community)
- **Categories:** E-commerce, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

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

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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 Lemon Squeezy Scraper do?

**Lemon Squeezy Scraper** extracts product data from any public [Lemon Squeezy](https://www.lemonsqueezy.com/) storefront. It pulls **product names, prices, product IDs, cover images, and store-wide sales counts** for every listing, and returns the results as a clean, structured dataset.

Lemon Squeezy is a fast-growing merchant-of-record platform that indie hackers, SaaS founders, and digital creators use to sell software, templates, courses, and downloads. Because the storefronts render products as static HTML, this Actor uses **Cheerio** (HTTP-based parsing) instead of a headless browser, making it roughly **10x faster and far cheaper to run** than browser-based scrapers.

You get all the benefits of the Apify platform: API access, scheduling, proxy rotation, monitoring, and one-click exports to JSON, CSV, Excel, and more.

### Why use Lemon Squeezy Scraper?

- **Competitor & market research** — monitor pricing, product launches, and sales velocity across digital-product stores.
- **Affiliate & creator discovery** — find high-performing stores and creators to partner with or learn from.
- **Lead generation** — build lists of active Lemon Squeezy merchants by store, category, or price point.
- **Price intelligence** — track how digital goods are priced across the Lemon Squeezy ecosystem.

### How to use Lemon Squeezy Scraper

1. Click **Try for free** or **Try Actor** on the Apify Store.
2. In the **Input** tab, add one or more storefront URLs (e.g. `https://tonjrv.lemonsqueezy.com/`).
3. (Optional) Set a **max items per store** to limit how many products are collected from each storefront.
4. Click **Start** and wait for the run to finish.
5. Open the **Output** tab to view, filter, and export your dataset.

### Input

The Actor accepts the following input fields (see the **Input** tab for the live form):

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `startUrls` | Array of URLs | Yes | One or more Lemon Squeezy storefront URLs to scrape. |
| `maxItems` | Integer | No | Maximum products to collect per storefront. `0` = no limit. |
| `maxRequestsPerCrawl` | Integer | No | Maximum number of pages the crawler may load in total. |

#### Example input

```json
{
    "startUrls": [
        { "url": "https://tonjrv.lemonsqueezy.com/" },
        { "url": "https://googlesitestemplates.lemonsqueezy.com/" }
    ],
    "maxItems": 0,
    "maxRequestsPerCrawl": 100
}
````

### Output

Each result is a product object. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

```json
[
    {
        "storeName": "TONJRV - Official Framer Template Store",
        "storeUrl": "https://tonjrv.lemonsqueezy.com/",
        "productName": "Appverse - Showcase Template for Startups, and Apps",
        "productId": "3c7f6a68-72bd-4673-aaf3-a42719a8d969",
        "productUrl": "https://tonjrv.lemonsqueezy.com/checkout/buy/3c7f6a68-72bd-4673-aaf3-a42719a8d969",
        "price": 0,
        "priceFrom": true,
        "isFree": true,
        "imageUrls": [
            "https://cdn.lemonsqueezy.com/media/18367/eabd7c76-ec01-43fb-b507-5c95115e7345.jpg"
        ],
        "storeSalesCount": null,
        "scrapedAt": "2026-07-07T08:05:18.474Z"
    }
]
```

#### Output fields

| Field | Description |
|-------|-------------|
| `storeName` | Name of the Lemon Squeezy store. |
| `storeUrl` | Storefront URL the product was scraped from. |
| `productName` | Product title as shown on the storefront. |
| `productId` | Lemon Squeezy product/variant UUID. |
| `productUrl` | Direct checkout/buy URL for the product. |
| `price` | Numeric price in the store's currency (`null` if not found). |
| `currency` | ISO 4217 currency code derived from the price symbol (e.g. `USD`, `EUR`, `GBP`). `null` if no symbol was detected. |
| `priceFrom` | `true` when the price is a "starting from" price (e.g. `$0.00+`). |
| `isFree` | `true` when the product is free. |
| `imageUrls` | List of product cover image URLs. |
| `storeSalesCount` | Total sales count shown on the store (e.g. `94600`), when available. |
| `scrapedAt` | ISO timestamp of when the item was collected. |

### Pricing / Cost estimation

Because this Actor uses lightweight HTTP parsing (no browser), runs are inexpensive and fast. Scraping a typical storefront of 20-50 products completes in **a few seconds**. You only pay for the Apify platform usage, and you can try it for free with the platform's trial credits.

### Tips

- **Bulk scraping**: pass many `startUrls` at once to scrape multiple stores in a single run.
- **Custom domains**: storefronts on custom domains (redirected from `*.lemonsqueezy.com`) are followed automatically.
- **Sales counts**: some stores display a store-wide sales badge (e.g. "94.6K+ Sales"), which is captured in `storeSalesCount`.
- **Limit results**: use `maxItems` to cap collection per store and keep costs predictable.

### FAQ, disclaimers, and support

- **Is this legal?** This Actor only reads publicly available storefront pages. You are responsible for complying with Lemon Squeezy's Terms of Service and applicable laws when using the data.
- **Does it need login or API keys?** No. It scrapes public storefront HTML.
- **What currencies are supported?** The parser detects `$` (USD), `€` (EUR), `£` (GBP), `¥` (JPY), `₹` (INR), `₩` (KRW), `₽` (RUB), and a few others, returning the ISO code in the `currency` field. If a price uses an unrecognized symbol, `price` and `currency` will be `null`.
- **Does it handle paginated storefronts?** No. Most Lemon Squeezy storefronts display all products on a single page, so pagination is not currently implemented. If you encounter a store with pagination, open an issue.
- **Need a custom solution?** Open an issue on the Actor's **Issues** tab or reach out for a tailored scraping setup.

### Getting started (local development)

```bash
npm install
npm test        # runs unit + integration tests
npm run build   # compiles TypeScript
apify run       # run locally with simulated Apify environment
```

### Deploy to Apify

```bash
apify login    # provide your Apify API token
apify push     # build & deploy the Actor to the Apify platform
```

### Documentation reference

- [Crawlee (CheerioCrawler)](https://crawlee.dev/api/cheerio-crawler/class/CheerioCrawler)
- [Apify SDK for JavaScript](https://docs.apify.com/sdk/js)
- [Apify Platform docs](https://docs.apify.com/platform)

# Actor input Schema

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

One or more Lemon Squeezy storefront URLs to scrape. These can be on the lemonsqueezy.com subdomain (e.g. https://store.lemonsqueezy.com/) or a custom domain connected to Lemon Squeezy.

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

Maximum number of products to collect per storefront. Set to 0 for no limit.

## `maxRequestsPerCrawl` (type: `integer`):

Maximum number of pages the crawler may load in total.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://tonjrv.lemonsqueezy.com/"
    },
    {
      "url": "https://googlesitestemplates.lemonsqueezy.com/"
    }
  ],
  "maxItems": 0,
  "maxRequestsPerCrawl": 100
}
```

# Actor output Schema

## `dataset` (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 = {
    "startUrls": [
        {
            "url": "https://tonjrv.lemonsqueezy.com/"
        },
        {
            "url": "https://googlesitestemplates.lemonsqueezy.com/"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("bitdoze/lemon-squeezy-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://tonjrv.lemonsqueezy.com/" },
        { "url": "https://googlesitestemplates.lemonsqueezy.com/" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("bitdoze/lemon-squeezy-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://tonjrv.lemonsqueezy.com/"
    },
    {
      "url": "https://googlesitestemplates.lemonsqueezy.com/"
    }
  ]
}' |
apify call bitdoze/lemon-squeezy-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Lemon Squeezy Scraper",
        "description": "Scrape product data (names, prices, sales counts, images, product IDs) from any Lemon Squeezy storefront.",
        "version": "0.0",
        "x-build-id": "pGmECZvv9ib04jLdc"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/bitdoze~lemon-squeezy-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-bitdoze-lemon-squeezy-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/bitdoze~lemon-squeezy-scraper/runs": {
            "post": {
                "operationId": "runs-sync-bitdoze-lemon-squeezy-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/bitdoze~lemon-squeezy-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-bitdoze-lemon-squeezy-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",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Storefront URLs",
                        "type": "array",
                        "description": "One or more Lemon Squeezy storefront URLs to scrape. These can be on the lemonsqueezy.com subdomain (e.g. https://store.lemonsqueezy.com/) or a custom domain connected to Lemon Squeezy.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Max items per store",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum number of products to collect per storefront. Set to 0 for no limit.",
                        "default": 0
                    },
                    "maxRequestsPerCrawl": {
                        "title": "Max Requests per Crawl",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of pages the crawler may load in total.",
                        "default": 100
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
