# Gumroad Products (`datasaurus/gumroad-products`) Actor

Scrape public Gumroad marketplace listings, product details, prices, offers, ratings, and written reviews.

- **URL**: https://apify.com/datasaurus/gumroad-products.md
- **Developed by:** [datasaurus](https://apify.com/datasaurus) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 product-details

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

## Gumroad Product Scraper

Collect structured product and review data from Gumroad discovery/category pages and product pages. No Gumroad login required.

Please also checkout our [Gumroad Creator Profile Scraper](https://console.apify.com/actors/wvVzHtjCqdybQHlpd/info/readme?build=latest).

### Features

- Accepts marketplace discovery, category, subcategory, creator storefront, and `/l/...` product URLs.
- Deduplicates globally by Gumroad's opaque product ID.
- Optionally enriches records with descriptions, media, offers or membership recurrence prices, availability, and ratings.
- Optionally collects public written reviews and creator responses.

### Input

| Field | Default | Description |
|---|---:|---|
| `startUrls` | Software Development | Gumroad category, discovery, or product URLs. Query-string filters on marketplace URLs are forwarded to Gumroad. |
| `maxProductsPerStartUrl` | 60 | Maximum products discovered from each start URL. There is no global cap; the run can return up to this number per URL. |
| `scrapeProductPage` | `false` | Fetch full product details. |
| `maxReviews` | 0 | Maximum reviews per product; `0` disables reviews. A positive value also fetches product-page details, even if `scrapeProductPage` is `false`. |
| `sort` | `trending` | `trending`, `hot_and_new`, `best_sellers`, or `curated`. |
| `searchQuery` | empty | Optional marketplace text search. |

#### Input examples

Search the Software Development category for products matching a phrase:

```json
{
  "startUrls": [{"url": "https://gumroad.com/software-development"}],
  "searchQuery": "cursor workflow",
  "maxProductsPerStartUrl": 10,
  "sort": "best_sellers",
  "scrapeProductPage": true
}
```

Pass Gumroad discovery filters in the category URL. Supported query parameters are forwarded to Gumroad:

```json
{
  "startUrls": [{"url": "https://gumroad.com/software-development/programming?tags=typescript&filetypes=pdf&min_price=5&max_price=50&rating=4"}],
  "maxProductsPerStartUrl": 20,
  "sort": "trending",
  "scrapeProductPage": false
}
```

Scrape products from a creator's storefront, then fetch a few written reviews per product:

```json
{
  "startUrls": [{"url": "https://walkingriver.gumroad.com"}],
  "maxProductsPerStartUrl": 5,
  "scrapeProductPage": false,
  "maxReviews": 10,
  "sort": "trending"
}
```

Fetch specific products directly:

```json
{
  "startUrls": [
    {"url": "https://walkingriver.gumroad.com/l/pair-programming-2026"},
    {"url": "https://vibecoding.gumroad.com/l/the-vibe-coding-builder-kit"}
  ]
}
```

Direct `/l/...` URLs are fetched as full product pages automatically and are billed as `product-detail`, even when `scrapeProductPage` is `false`.

### Output

Each dataset item represents one product. `price` is the seller price in major currency units and `currency` is its ISO currency code. When Gumroad returns a localized buyer price, `buyerPrice` and `buyerCurrency` contain its normalized amount and currency. Fields also include `productId`, `name`, `seller`, `salesCount`, `offers`, `availability`, `ratings`, `reviews`, `categoryTaxonomy`, `link`. `salesCount` is Gumroad's lifetime count when the product publicly discloses it; an absent field means Gumroad did not provide a public count, not that sales were zero.

Prices are converted from returned minor units to major units using Gumroad's subunit divisor when available, with a currency-aware fallback. Memberships can have a zero base price while their `offers[].recurrencePrices` are nonzero.

#### Detailed product example

With `scrapeProductPage` enabled, product records can include the full description, seller identity, disclosed lifetime sales count, product offers, cover metadata, availability, ratings, and locale. Set `maxReviews` above zero to also include reviews. A value greater than 0 automatically fetches product-page details, even when scrapeProductPage is false.
Here is a real sample output from this Actor; it contains two reviews, while Gumroad reported more review pages were available:

Example Input - scrapes product detail pages when scrapeProductPage=True:

````json
{
  "startUrls": [{"url": "https://kevinvandermarliere.gumroad.com/"}],
  "maxProductsPerStartUrl": 10,
  "scrapeProductPage": true,
  "maxReviews": 2,
  "sort": "hot_and_new",
  "searchQuery": ""
}

Example Output (when scrapeProductPage=True):

```json
{
  "productId": "6Y016MfnTlpkuPqubFniXw==",
  "name": "AI Video Studio V.3 | DaVinci Resolve 21",
  "description": "Generate AI video & images right inside DaVinci Resolve 21...",
  "seller": {
    "id": "5120379184344",
    "name": "Kevin Vandermarliere",
    "profileUrl": "https://kevinvandermarliere.gumroad.com/",
    "isVerified": false
  },
  "price": 59.0,
  "currency": "EUR",
  "buyerPrice": 66.04,
  "buyerCurrency": "USD",
  "offers": [
    {
      "id": "gsWNZxHFgB-rJXh6hyOTxQ==",
      "name": "Solo",
      "description": "For individual creators. Activates on 2 computers",
      "priceDifferenceMinor": 0
    },
    {
      "id": "crZF5WaRBwNmu6i980_qAw==",
      "name": "Studio",
      "description": "For small teams of 2–5 people. One license key, activates on 5 computers. Priority support",
      "priceDifferenceMinor": 10000
    }
  ],
  "nativeType": "digital",
  "imageUrl": "https://public-files.gumroad.com/3eh9uphmre5uth5tmna1p0me3ljx",
  "covers": [
    {
      "id": "975c8cbbef80b7ccb8d8f4f78c3e22d3",
      "url": "https://public-files.gumroad.com/yzihv2pctpyj6unoqm1kuc6zou14",
      "type": "png",
      "width": 670,
      "height": 376
    }
  ],
  "availability": {
    "isPublished": true,
    "isComplianceBlocked": false,
    "isSalesLimited": false
  },
  "ratings": {
    "count": 28,
    "average": 4.7,
    "percentages": [
      3,0,4,7,86
    ]
  },
  "locale": "en-US",
  "internalPermalink": "bltlixr",
  "link": "https://kevinvandermarliere.gumroad.com/l/Aivideostudio",
  "reviews": {
    "provider": "gumroad",
    "items": [
      {
        "id": "1igcrPlRXrbYNRozwuJkJQ==",
        "rating": 5,
        "reviewText": "I installed without any problems in latest studio version of DaVinci resolve. Mainly I was looking for fal.ai. Integration. Installation was flawless. I am using local AI models now instead. I am impressed. Though still a lot to learn. ",
        "userNickname": "Anonymous",
        "avatarUrl": "https://assets.gumroad.com/images/gumroad-default-avatar-5.png",
        "submissionTime": "2026-09-28T20:09:56Z",
        "ratingRange": 5
      },
      {
        "id": "-yR199IGITPesp3pw73fIw==",
        "rating": 5,
        "reviewText": "upset i paid and have not got a key and know i cant use the program i cant reach anyone  plz help   ok i got help and my problem was fixed ",
        "userNickname": "Project Page",
        "avatarUrl": "https://public-files.gumroad.com/994ro5nzm8u3pq7ax8yrjn7vg27p",
        "submissionTime": "2026-09-21T22:20:21Z",
        "creatorResponse": "Fixed!",
        "ratingRange": 5
      }
    ],
    "pagesAvailable": 2,
    "complete": false
  }
}
````

#### Fast listings extraction product example

Example Input - scrapes listing pages only when scrapeProductPage=False:

```json
{
  "startUrls": [{"url": "https://kevinvandermarliere.gumroad.com/"}],
  "maxProductsPerStartUrl": 10,
  "scrapeProductPage": false,
  "maxReviews": 0,
  "sort": "hot_and_new",
  "searchQuery": ""
}

```

Example Output:

```json
{
  "productId": "6Y016MfnTlpkuPqubFniXw==",
  "name": "AI Video Studio V.3 | DaVinci Resolve 21",
  "seller": {
    "id": "5120379184344",
    "name": "Kevin Vandermarliere",
    "profileUrl": "https://kevinvandermarliere.gumroad.com/",
    "isVerified": false
  },
  "price": 59.0,
  "currency": "EUR",
  "buyerPrice": 66.04,
  "buyerCurrency": "USD",
  "nativeType": "digital",
  "imageUrl": "https://public-files.gumroad.com/3eh9uphmre5uth5tmna1p0me3ljx",
  "availability": {
    "isSalesLimited": false
  },
  "ratings": {
    "count": 28,
    "average": 4.7
  },
  "internalPermalink": "bltlixr",
  "link": "https://kevinvandermarliere.gumroad.com/l/Aivideostudio"
}
```

### Countries, locale, and currency

Start URLs are deliberately restricted to `gumroad.com` and its subdomains.

### Pricing

| Event | Suggested price | What it covers |
|---|---:|---|
| `product-listing` | $1.25 / 1,000 products | Product records from discovery listings or storefronts. |
| `product-detail` | $3.00 / 1,000 products | Full product records after fetching each product page; this is the total product price, not an add-on to the listing event. |
| `review` | $0.50 / 1,000 reviews | Public review records collected when `maxReviews` is enabled. |

### Responsible use

Only public anonymous pages are read. Use reasonable limits, comply with Gumroad's terms and applicable law.

### AI agents and integrations

Connect chat clients such as Claude and ChatGPT to this Apify scrapper through the Apify MCP server.

# Actor input Schema

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

Gumroad discovery, category, or individual product URLs.

## `maxProductsPerStartUrl` (type: `integer`):

Maximum products discovered from each start URL. There is no global product cap across start URLs.

## `scrapeProductPage` (type: `boolean`):

Fetch full product details. Product pages are also fetched automatically when maxReviews is greater than 0, even if this is false.

## `maxReviews` (type: `integer`):

Maximum public reviews to collect per product. 0 disables reviews. A value greater than 0 automatically fetches product-page details, even when scrapeProductPage is false.

## `sort` (type: `string`):

Marketplace ordering. Trending and Hot & new are live-verified.

## `searchQuery` (type: `string`):

Optional text query applied to marketplace discovery.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://gumroad.com/software-development"
    }
  ],
  "maxProductsPerStartUrl": 4,
  "scrapeProductPage": false,
  "maxReviews": 0,
  "sort": "trending",
  "searchQuery": ""
}
```

# Actor output Schema

## `results` (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/software-development"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("datasaurus/gumroad-products").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/software-development" }] }

# Run the Actor and wait for it to finish
run = client.actor("datasaurus/gumroad-products").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/software-development"
    }
  ]
}' |
apify call datasaurus/gumroad-products --silent --output-dataset

```

## MCP server setup

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

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/oYWyY2vWocql0rhaC/builds/8frTMv7iicbW4pQsa/openapi.json
