# Gumroad Scraper (`anyxsolutions/gumroad-scraper`) Actor

Scrape public Gumroad products from Discover searches, category pages, creator storefronts and product pages: prices, pay-what-you-want minimums, ratings, sales counts, memberships, creators, descriptions and images. For creator-economy and market research. No login, no API key, no proxy.

- **URL**: https://apify.com/anyxsolutions/gumroad-scraper.md
- **Developed by:** [Anyx Solutions](https://apify.com/anyxsolutions) (community)
- **Categories:** E-commerce, Marketing
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

![banner](https://anyx.solutions/banners/gumroad-scraper.png)

## Gumroad Scraper

**Public Gumroad products — prices, ratings, sales counts, memberships and creators — from any Discover search, category, storefront or product page, as clean JSON.**

Gumroad is where hundreds of thousands of independent creators sell Notion templates, presets,
courses, e-books, fonts, 3D assets, software and memberships. This Actor reads Gumroad's public
pages and returns one row per product: name, price and currency, pay-what-you-want minimum and
suggested price, subscription periods, star rating with its breakdown, the public sales count when
the creator shows it, the creator's name and storefront, variants and tiers, summary details, full
description as HTML and plain text, cover images, and creation and update dates. Paste a Discover
search, a category page, a creator storefront or a product URL, or just type keywords; there is no
login, no API key, and no proxy to configure. Built for creator-economy research, competitor and
pricing analysis, niche validation, and lead lists of digital-product sellers.

### ⚡ Quick start

```json
{
  "startUrls": [{ "url": "https://gumroad.com/discover?query=notion" }],
  "maxItems": 5
}
```

### 🧩 Input

| Field                | Type    | Required | Default                      | Description                                                                                                                                                                                                            |
| -------------------- | ------- | -------- | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `startUrls`          | array   | no       | —                            | Gumroad URLs: a Discover search (`gumroad.com/discover?query=…`, with any sort or filter), a category page (`gumroad.com/design`), a creator storefront (`<creator>.gumroad.com`) or a product page (`…/l/<product>`). |
| `searchTerms`        | array   | no       | —                            | Keywords to search Gumroad Discover for, such as `notion template`. Each term counts as its own start URL for the item limit.                                                                                          |
| `maxItems`           | integer | no       | —                            | Maximum products per start URL or search term. The input form starts at 5; leave it empty to get every result.                                                                                                         |
| `includeDetails`     | boolean | no       | `true`                       | Open each product page for the full description, rating breakdown, public sales count, variants, cover images and dates. Turn it off for quick price and rating lists.                                                 |
| `proxyConfiguration` | object  | no       | `{ "useApifyProxy": false }` | Proxy settings. Gumroad's public pages need no proxy.                                                                                                                                                                  |

Add at least one Gumroad URL or one search term.

**Sorting and filtering.** Set up a search on [gumroad.com/discover](https://gumroad.com/discover)
(sort, price range, rating, tags, file types, category) and paste the address bar URL: the Actor
keeps every filter. Category pages such as `https://gumroad.com/design/icons` work the same way.

### 📤 Output

Each product is one dataset row. With `includeDetails` off, the fields only a product page carries
(description, rating breakdown, sales count, variants, summary details, covers, dates) are `null` or
empty.

#### Fields

| Field                | Type    | Description                                                                                                                                                      |
| -------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`                 | string  | Gumroad product ID.                                                                                                                                              |
| `permalink`          | string  | The product's short name in its URL (`/l/<permalink>`).                                                                                                          |
| `name`               | string  | Product name.                                                                                                                                                    |
| `url`                | string  | The product page.                                                                                                                                                |
| `productType`        | string  | Gumroad's product type: `digital`, `course`, `ebook`, `membership`, `bundle`, `physical`, and so on.                                                             |
| `category`           | string  | The Discover category the start URL was filtered to, such as `design/icons`; `null` for searches, storefronts and products.                                      |
| `creatorId`          | string  | Gumroad ID of the creator.                                                                                                                                       |
| `creatorName`        | string  | Creator's display name.                                                                                                                                          |
| `creatorUsername`    | string  | Creator's username (their `<username>.gumroad.com` storefront).                                                                                                  |
| `creatorUrl`         | string  | Creator's storefront.                                                                                                                                            |
| `creatorAvatarUrl`   | string  | Creator's avatar image.                                                                                                                                          |
| `creatorIsVerified`  | boolean | Whether Gumroad marks the creator as verified.                                                                                                                   |
| `price`              | number  | Price in whole currency units. For pay-what-you-want it is the minimum; for memberships, the cheapest tier per period.                                           |
| `currency`           | string  | ISO currency code, such as `USD`.                                                                                                                                |
| `priceFormatted`     | string  | The price as Gumroad shows it, such as `$0+` or `$127+ a month`.                                                                                                 |
| `isPayWhatYouWant`   | boolean | Whether buyers choose what to pay.                                                                                                                               |
| `minimumPrice`       | number  | Pay-what-you-want minimum; `null` for fixed prices.                                                                                                              |
| `suggestedPrice`     | number  | Pay-what-you-want suggested price, when set.                                                                                                                     |
| `isRecurring`        | boolean | Whether the product bills on a schedule (subscription or membership).                                                                                            |
| `recurrence`         | string  | Default billing period: `monthly`, `quarterly`, `biannually`, `yearly` or `every_two_years`.                                                                     |
| `recurrenceOptions`  | array   | Every billing period the buyer can choose.                                                                                                                       |
| `isMembership`       | boolean | Whether the product is a tiered membership.                                                                                                                      |
| `ratingAverage`      | number  | Average star rating, 1 to 5; `null` when the product has no ratings yet.                                                                                         |
| `ratingCount`        | number  | Number of ratings.                                                                                                                                               |
| `ratingDistribution` | object  | Percent of ratings per star, keyed `"1"` to `"5"`.                                                                                                               |
| `salesCount`         | number  | Public sales count, when the creator shows it; otherwise `null`.                                                                                                 |
| `summary`            | string  | The one-line summary under the buy button, when set.                                                                                                             |
| `attributes`         | array   | The product's detail rows (`name`, `value`), such as file size, pages, format, version or access.                                                                |
| `variants`           | array   | Versions, tiers or license levels: `name`, `description`, `price` (for memberships, per default billing period) and `priceDifference` (added to the base price). |
| `descriptionHtml`    | string  | Full product description as HTML.                                                                                                                                |
| `descriptionText`    | string  | Full product description as plain text.                                                                                                                          |
| `thumbnailUrl`       | string  | Square thumbnail image.                                                                                                                                          |
| `coverUrls`          | array   | Cover images and media, full size.                                                                                                                               |
| `quantityRemaining`  | number  | Copies left for limited products; `null` when unlimited.                                                                                                         |
| `refundPolicy`       | string  | Refund policy title, such as `7-day money back guarantee`.                                                                                                       |
| `createdAt`          | string  | When the product was created (ISO 8601).                                                                                                                         |
| `updatedAt`          | string  | When the product was last updated (ISO 8601).                                                                                                                    |

<details><summary>Example output</summary>

```json
{
  "id": "w5ZwXgqGAKWCBOrk_pawOA==",
  "permalink": "PARA",
  "name": "Second Brain Template",
  "url": "https://heyismail.gumroad.com/l/PARA",
  "productType": "digital",
  "category": null,
  "creatorId": "4113369384893",
  "creatorName": "Heyismail",
  "creatorUsername": "heyismail",
  "creatorUrl": "https://heyismail.gumroad.com",
  "creatorAvatarUrl": "https://public-files.gumroad.com/mc8m66c5oqpi8weveqigbgfdwqcu",
  "creatorIsVerified": false,
  "price": 0,
  "currency": "USD",
  "priceFormatted": "$0+",
  "isPayWhatYouWant": true,
  "minimumPrice": 0,
  "suggestedPrice": 20,
  "isRecurring": false,
  "recurrence": null,
  "recurrenceOptions": [],
  "isMembership": false,
  "ratingAverage": 4.9,
  "ratingCount": 384,
  "ratingDistribution": { "1": 0, "2": 0, "3": 2, "4": 2, "5": 96 },
  "salesCount": 28685,
  "summary": null,
  "attributes": [
    { "name": "Access", "value": "Lifetime" },
    { "name": "Updates", "value": "Included" },
    { "name": "Version", "value": "5.0" },
    { "name": "User Guide", "value": "Included" }
  ],
  "variants": [
    {
      "name": "Simple Second Brain",
      "description": "Free Version",
      "price": 0,
      "priceDifference": 0
    },
    {
      "name": "Second Brain Pro",
      "description": "✔️ PARA System \n✔️ GTD System \n✔️ Knowledge Hub\n✔️ Fitness P …",
      "price": 59,
      "priceDifference": 59
    },
    {
      "name": "Second Brain Pro+",
      "description": "The All-in-One Notion Template \n\n✔️ PARA System  \n✔️ GTD Sys …",
      "price": 79,
      "priceDifference": 79
    }
  ],
  "descriptionHtml": "<h2><strong>Organize, Optimize, and Elevate Your Life with Second Brain Pro</strong></h2>< …",
  "descriptionText": "Organize, Optimize, and Elevate Your Life with Second Brain Pro\n#1 Second Brain Template o …",
  "thumbnailUrl": "https://public-files.gumroad.com/6dt4sc9z462ur0s0kk9r7zki8m9d",
  "coverUrls": [
    "https://public-files.gumroad.com/ss5b6ft69yfsyykctfmnjiogoo4d",
    "https://public-files.gumroad.com/n82for45ouxdw8thmnxmrytypbfj"
  ],
  "quantityRemaining": null,
  "refundPolicy": "No refunds allowed",
  "createdAt": "2023-08-25T00:29:04Z",
  "updatedAt": "2026-06-13T09:33:12Z"
}
```

</details>

### 💡 Use cases

- **Niche validation** — see how many products a niche has, what they cost, and how well the best ones rate and sell before you build your own.
- **Pricing research** — compare fixed, pay-what-you-want and membership pricing across a category or a set of competitors.
- **Creator-economy analysis** — track top sellers, ratings and public sales counts over time for reports and market maps.
- **Lead generation** — build lists of active digital-product creators and their storefronts for partnerships, tools and services.
- **Competitor monitoring** — follow a rival creator's storefront for new products, price changes and updates.

### ❓ FAQ

- **Do I need a Gumroad account or an API key?** No. The Actor reads the same public pages any visitor sees.
- **Do I need a proxy?** No. It runs without one by default.
- **Why is `salesCount` empty for some products?** Creators choose whether to show their sales count. When it is hidden, the field is `null`.
- **Why are tags missing?** Gumroad uses tags for search but does not show them on product pages. To collect products by tag, use a Discover URL with a tag filter, such as `https://gumroad.com/discover?tags=notion`.
- **How many results can one search return?** Gumroad Discover serves up to 10,000 results per search. For more, split the search by category, tag or price range.
- **Can I scrape many searches or creators at once?** Yes. Add one URL or search term per line; `maxItems` applies to each one separately.
- **Why did a storefront return nothing?** Some creators hide their product list or sell only through direct links. The log says when a storefront shows no products; product URLs still work.

### 🔗 More scrapers by Anyx

- [AliExpress Scraper](https://apify.com/anyxsolutions/aliexpress-scraper)
- [Trustpilot Scraper](https://apify.com/anyxsolutions/trustpilot-scraper)
- [Google Play Scraper](https://apify.com/anyxsolutions/google-play-scraper)
- [Reddit Scraper](https://apify.com/anyxsolutions/reddit-scraper)

### 🤝 Anyx Solutions

We build custom scrapers and data-extraction pipelines.

- Email: tantosthor@gmail.com

### 🖼 Image credit

Image credit: [gumroad.com](https://gumroad.com/)

# Actor input Schema

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

Gumroad pages to scrape: a Discover search (https://gumroad.com/discover?query=notion, with any sort or filter), a category page (https://gumroad.com/design), a creator storefront (https://<creator>.gumroad.com) or a product page (https://<creator>.gumroad.com/l/<product>).

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

Keywords to search Gumroad Discover for, one per line, for example "notion template" or "lightroom presets". Each term counts as its own start URL for the item limit.

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

Maximum number of products to return per start URL or search term. Leave empty to get every result (Discover serves up to 10,000 per search).

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

Open each product page for the full description, rating breakdown, public sales count, variants, cover images and dates. Adds one fast request per product; turn it off for quick price and rating lists.

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

Proxy settings. Gumroad's public pages need no proxy.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://gumroad.com/discover?query=notion"
    }
  ],
  "maxItems": 5,
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (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://gumroad.com/discover?query=notion"
        }
    ],
    "maxItems": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("anyxsolutions/gumroad-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://gumroad.com/discover?query=notion" }],
    "maxItems": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("anyxsolutions/gumroad-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://gumroad.com/discover?query=notion"
    }
  ],
  "maxItems": 5
}' |
apify call anyxsolutions/gumroad-scraper --silent --output-dataset

```

## MCP server setup

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

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

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/aOizmUh2beQTRwbJB/builds/QjWNdzQrXov6p8pB8/openapi.json
