# Redbubble Scraper (`parsebird/redbubble-scraper`) Actor

Scrape Redbubble products by keyword, search URL, category, or artist shop: titles, artists, product types, prices, discounts, tags, images, and design IDs. Export to JSON, CSV, or Excel.

- **URL**: https://apify.com/parsebird/redbubble-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.29 / 1,000 products

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

### Redbubble Scraper

Redbubble Scraper extracts **product listings from Redbubble** by keyword, search URL, category page, or artist shop: design title, artist, product type, current and original price, discount, artist tags, product and artwork images, and design IDs. Enter a keyword or paste a URL and get one clean row per product.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Research print-on-demand niches on Redbubble: search any keyword across 49 product types, sort by best selling or trending, read the tags top artists use, and pull every product from an artist's shop with no page limit.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Actor: parsebird/redbubble-scraper — scrapes Redbubble product listings. Input: {"searchQueries": ["cat stickers"] (array of keywords, each runs its own search), "searchUrls": ["https://www.redbubble.com/shop?query=retro+poster", "https://www.redbubble.com/shop/stickers", "https://www.redbubble.com/people/USERNAME/shop"] (search, category, or artist shop URLs; filters and sort in the URL are kept; /de/, /fr/, /es/ URLs work; product /i/ pages are not supported), "productType": "" (keyword searches only; Redbubble iaCode such as "all-stickers", "u-tees", "u-sweatshirts", "u-case-iphone", "u-mugs", "u-print-poster", "u-print-art", "u-pin-button", "all-hats"), "sortBy": "relevant"|"recent"|"top selling"|"trending" (keyword searches only), "hideMatureContent": false, "maxResults": 100 (per keyword or URL, 0 = no limit; searches and categories stop at 10 pages, about 820-900 products; artist shops have no cap), "proxyConfiguration": {"useApifyProxy": false} (optional; the actor switches to Apify Proxy by itself when refused)}. Run via ApifyClient("YOUR_TOKEN").actor("parsebird/redbubble-scraper").call(run_input=input). Output, one row per product: searchQuery, sourceUrl, position, title, artistName, artistUsername, artistUrl, productType, productTypeId, price, originalPrice, currency, discountPercent, volumeDiscounts[] {quantity, percentOff}, tags[], imageUrl, artworkImageUrl, url, workId, productId, options {size, color, finish...}, measurements, inStock, matureContent, isEstablishedArtist. Pricing: pay per product saved. Get your API token at https://console.apify.com/account#/integrations. Full API spec: https://apify.com/parsebird/redbubble-scraper/api
```

### What is Redbubble Scraper?

Redbubble Scraper is a **Redbubble data extraction tool** that reads the public product listings on [Redbubble.com](https://www.redbubble.com/), the print-on-demand marketplace where independent artists sell their designs on stickers, t-shirts, posters, phone cases, mugs, and more. Redbubble has no public product API, so this scraper works as a **Redbubble API alternative** for print-on-demand sellers, designers, trend researchers, and data teams.

The easiest way to try it: keep the prefilled keyword `cat stickers`, click **Start**, and open the dataset. You get 50 stickers with titles, artists, prices, discounts, tags, and image links in a few seconds.

No Redbubble account is needed.

### What can Redbubble Scraper do?

- 🔎 **Keyword search** — each keyword runs its own Redbubble search, exactly like the search box. Many keywords per run.
- 🔗 **Paste any listing URL** — search results, category pages such as `/shop/stickers`, and artist shops such as `/people/USERNAME/shop`. Filters and sort order in the URL are kept as pasted, and German, French, and Spanish site URLs work too.
- 🎯 **49 product types** — narrow keyword searches to stickers, t-shirts, hoodies, iPhone or Samsung cases, posters, art prints, canvas prints, mugs, pins, hats, tote bags, and more.
- 📈 **Four sort orders** — Most Relevant, Newest, Best Selling, or Trending.
- 🏷️ **Artist tags** — the keyword tags each artist set on the design, useful for niche and SEO research.
- 💲 **Prices and discounts** — current price, original price, discount percentage, and multi-buy discount tiers, as Redbubble shows them on the product card.
- 🧑‍🎨 **Whole artist shops** — artist shops have no page limit, so you can export every product a creator sells.
- 🔞 **Hide mature designs** — leave out designs their artist marked as mature.

Because Redbubble Scraper runs on the Apify platform, you also get:

- ⏰ [Scheduling](https://docs.apify.com/platform/schedules) to track bestsellers, trends, and prices daily or weekly.
- 🔌 [API access](https://docs.apify.com/api/v2) and client libraries for Python and JavaScript.
- 🔗 [Integrations](https://apify.com/integrations) with Make, Zapier, Google Sheets, Slack, webhooks, and more.
- 📦 Export to JSON, CSV, Excel, XML, or HTML from the Storage tab or the API.

### What data can you extract from Redbubble?

| Field | Description |
|-------|-------------|
| `title` | Design title |
| `artistName` / `artistUsername` / `artistUrl` | Artist's shop name, username, and shop link |
| `productType` / `productTypeId` | Product the design is printed on, e.g. `Sticker`, `Classic T-Shirt`, `Poster` |
| `price` / `originalPrice` / `currency` | Current price, price before discount, and currency |
| `discountPercent` | Discount shown on the product card (0 if none) |
| `volumeDiscounts` | Multi-buy tiers, e.g. 25% off 4 or more stickers |
| `tags` | Keyword tags the artist set on the design |
| `imageUrl` / `artworkImageUrl` | Product preview image and flat artwork image |
| `url` | Product page URL |
| `workId` | Design ID, shared by every product type of the same design |
| `productId` | ID of this design on this product type, e.g. `110162644_sticky-runners_EJUG5` |
| `options` / `measurements` | Default size, color, or finish, and the product's dimensions |
| `inStock` / `matureContent` / `isEstablishedArtist` | Stock status, mature flag, and Redbubble's established-artist flag |
| `searchQuery` / `sourceUrl` / `position` | Where the row came from and its position among the products saved for it |

### How to scrape Redbubble

1. Open [Redbubble Scraper](https://apify.com/parsebird/redbubble-scraper) in Apify Console and click **Try for free**.
2. Under **Search keywords**, enter one or more keywords, such as `mushroom` or `vintage flowers`. Or paste Redbubble URLs under **Redbubble URLs**.
3. Optionally pick a **Product type** and **Sort by** for your keyword searches.
4. Set **Max products per keyword or URL**, for example 100. Start small to test.
5. Click **Start** and wait for the run to finish.
6. Open the **Output** tab to preview products, or export them as JSON, CSV, Excel, XML, or HTML.

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `searchQueries` | array of strings | No\* | `["cat stickers"]` | Keywords to search on Redbubble. Each keyword is a separate search. |
| `searchUrls` | array of strings | No\* | `[]` | Redbubble search, category, or artist shop URLs. Filters and sort in the URL are kept. |
| `productType` | string | No | all types | Product type for keyword searches, as a Redbubble category code, e.g. `all-stickers`, `u-tees`, `u-mugs`. |
| `sortBy` | string | No | `relevant` | Sort for keyword searches: `relevant`, `recent`, `top selling`, or `trending`. |
| `hideMatureContent` | boolean | No | `false` | Leave out designs marked as mature. |
| `maxResults` | integer | No | 100 | Maximum products per keyword or URL. `0` means no limit. |
| `proxyConfiguration` | object | No | `{"useApifyProxy": false}` | Optional proxy. The scraper moves to Apify Proxy on its own when Redbubble refuses requests. |

\* Add at least one keyword or one URL.

Example inputs:

```json
{
    "searchQueries": ["vintage flowers", "mushroom"],
    "productType": "all-stickers",
    "sortBy": "top selling",
    "maxResults": 500
}
```

```json
{
    "searchUrls": [
        "https://www.redbubble.com/shop?query=retro+poster",
        "https://www.redbubble.com/people/USERNAME/shop"
    ],
    "maxResults": 200
}
```

### Output example

Each product is one dataset item. Download the results in JSON, CSV, Excel, XML, or HTML.

```json
[
    {
        "searchQuery": "cat stickers",
        "sourceUrl": null,
        "position": 1,
        "title": "Black cat",
        "artistName": "Flora22",
        "artistUsername": "Flora22",
        "artistUrl": "https://www.redbubble.com/people/Flora22/shop",
        "productType": "Sticker",
        "productTypeId": "sticky-runners",
        "price": 2.09,
        "originalPrice": 2.78,
        "currency": "USD",
        "discountPercent": 25,
        "volumeDiscounts": [
            { "quantity": 4, "percentOff": 25 },
            { "quantity": 10, "percentOff": 40 }
        ],
        "tags": ["black", "cat", "black cat", "hydro", "funny", "cute", "trendy", "popular", "vsco", "instagram"],
        "imageUrl": "https://ih1.redbubble.net/image.3565571062.2644/st,small,507x507-pad,600x600,f8f8f8.jpg",
        "artworkImageUrl": "https://ih1.redbubble.net/image.3565571062.2644/bg,f8f8f8-flat,750x,075,f-pad,750x1000,f8f8f8.jpg",
        "url": "https://www.redbubble.com/i/sticker/Black-cat-by-Flora22/110162644/7sgk",
        "workId": "110162644",
        "productId": "110162644_sticky-runners_EJUG5",
        "options": { "size": "Small (3.8 x 2.3 in)" },
        "measurements": "3.8 x 2.3 in",
        "inStock": true,
        "matureContent": false,
        "isEstablishedArtist": false
    },
    {
        "searchQuery": null,
        "sourceUrl": "https://www.redbubble.com/people/Flora22/shop?iaCode=u-print-art",
        "position": 1,
        "title": "Black cat",
        "artistName": "Flora22",
        "artistUsername": "Flora22",
        "artistUrl": "https://www.redbubble.com/people/Flora22/shop",
        "productType": "Art Print",
        "productTypeId": "strewn-joey",
        "price": 18.92,
        "originalPrice": 22.26,
        "currency": "USD",
        "discountPercent": 15,
        "volumeDiscounts": [{ "quantity": 2, "percentOff": 15 }],
        "tags": ["black", "cat", "black cat", "hydro", "funny", "cute", "trendy", "popular", "vsco", "instagram"],
        "imageUrl": "https://ih1.redbubble.net/image.3565571052.2644/aps,504x498,small,transparent-pad,600x600,f8f8f8.jpg",
        "artworkImageUrl": "https://ih1.redbubble.net/image.3565571052.2644/flat,750x,075,f-pad,750x1000,f8f8f8.jpg",
        "url": "https://www.redbubble.com/i/art-print/Black-cat-by-Flora22/110162644/wqnt",
        "workId": "110162644",
        "productId": "110162644_strewn-joey_1G4ZT",
        "options": { "size": "Small (12 x 12 in)" },
        "measurements": "12 x 12 in",
        "inStock": true,
        "matureContent": false,
        "isEstablishedArtist": false
    }
]
```

### Use cases

- **Print-on-demand niche research** — find which designs and product types sell best for a keyword with the **Best Selling** sort.
- **Trend spotting** — schedule **Trending** or **Newest** searches to see what's taking off on Redbubble each week.
- **Tag and SEO research** — collect the tags top-ranking artists use and build better titles and tags for your own designs.
- **Pricing analysis** — compare prices, discounts, and multi-buy offers across product types.
- **Artist and competitor monitoring** — export an artist's whole shop and track new designs over time.
- **Design inspiration and datasets** — gather product and artwork images with titles and tags for mood boards or analysis.

### How it works

1. Each keyword becomes a Redbubble search with your product type and sort order. Pasted URLs are read as they are, keeping their filters.
2. Redbubble Scraper reads the same listing data Redbubble's own pages load, page by page (82 to 90 products per search page, 100 per artist shop page), a few pages at a time.
3. Redbubble serves at most 10 pages for a search or category, so one keyword or search URL returns up to about 820 to 900 products. Artist shops are read to the last page.
4. Products that appear on more than one page are saved once per keyword or URL.
5. Redbubble is protected by Cloudflare. When it refuses a connection, the scraper retries on a new one and moves to Apify Proxy if needed, first datacenter and then residential.

### How much does it cost to scrape Redbubble?

Redbubble Scraper uses pay-per-event pricing. You pay per product saved to the dataset. Compute and proxy costs are included in the price, so there are no extra platform usage charges.

| Event | Free plan | Bronze | Silver | Gold |
|-------|-----------|--------|--------|------|
| `product-scraped` — per product saved | $0.00499 | $0.00479 | $0.00449 | $0.00429 |
| Per 1,000 products | **$4.99** | **$4.79** | **$4.49** | **$4.29** |

For example, the prefilled run (50 products) costs about $0.25 on the Free plan, and 1,000 products cost $4.99. Use **Max products per keyword or URL** or a [spending limit](https://docs.apify.com/platform/actors/running/usage-and-resources) to cap a run; the scraper stops as soon as the limit is reached. Apify's Free plan includes monthly platform credits you can use to try the scraper.

### Use Redbubble Scraper with the API

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("parsebird/redbubble-scraper").call(run_input={
    "searchQueries": ["mushroom", "frog"],
    "productType": "all-stickers",
    "sortBy": "top selling",
    "maxResults": 200,
})
for product in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(product["searchQuery"], product["position"], product["title"], product["price"], product["artistName"])
```

**JavaScript**

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('parsebird/redbubble-scraper').call({
    searchQueries: ['axolotl'],
    sortBy: 'trending',
    maxResults: 300,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const tagCounts = {};
for (const p of items) for (const t of p.tags) tagCounts[t] = (tagCounts[t] || 0) + 1;
console.log(Object.entries(tagCounts).sort((a, b) => b[1] - a[1]).slice(0, 20));
```

See the [API tab](https://apify.com/parsebird/redbubble-scraper/api) for all endpoints and the [Apify API client docs](https://docs.apify.com/api/client/python) for more options.

### Is it legal to scrape Redbubble?

Redbubble Scraper only reads product listings that Redbubble shows publicly to logged-out visitors. It does not log in or collect customer data. Designs and images belong to their artists and are protected by copyright, so don't reuse them without permission. Make sure your use complies with Redbubble's terms, copyright and data protection laws, and any other rules that apply to you, and consult a lawyer if in doubt. Read more in Apify's post [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

### Other e-commerce and marketplace scrapers

- [Pinterest Search Scraper](https://apify.com/parsebird/pinterest-search-scraper) — pins and boards from Pinterest search, a common source of design trends.
- [Depop Scraper](https://apify.com/parsebird/depop-scraper) — listings, shops, and sellers from Depop.
- [Faire Scraper](https://apify.com/parsebird/faire-scraper) — wholesale brands and products from Faire.
- [Amazon Search Scraper](https://apify.com/parsebird/amazon-search-scraper) — Amazon search results with prices and ratings.
- [Walmart Product Scraper](https://apify.com/parsebird/walmart-product-scraper) — Walmart product details and prices.
- [Patreon Scraper](https://apify.com/parsebird/patreon-scraper) — creator pages and membership tiers from Patreon.

### FAQ

**Do I need a Redbubble account?**
No. Redbubble Scraper reads public listings without logging in.

**How many products can I get per keyword?**
Redbubble shows at most 10 pages for a search or a category, about 820 to 900 products. In testing, the keyword `axolotl` with no limit returned 872 unique products. To collect more, split a broad keyword by product type or sort order, or add related keywords. Artist shops have no page limit.

**Which URLs can I paste?**
Search URLs (`/shop?query=...`), category and topic pages (`/shop/stickers`, `/shop/cat+stickers`), and artist shops (`/people/USERNAME/shop`, or any `/people/USERNAME` page). Filters such as product type and sort order in the URL are kept. Single product pages (`/i/...`) are not supported.

**What does `price` mean?**
`price` is the price Redbubble shows on the product card for the default size, after any discount. `originalPrice` is the price before the discount, and `discountPercent` is the discount shown next to it. `volumeDiscounts` lists the extra multi-buy discounts.

**Why is the currency USD?**
Redbubble returned prices in US dollars in all of our tests, including German-site URLs. The `currency` field always shows the currency Redbubble returned.

**What is the difference between `workId` and `productId`?**
`workId` is the design. The same design printed on a sticker, a t-shirt, and a mug has one `workId` and three `productId` values.

**Do I need a proxy?**
Usually not. Redbubble is protected by Cloudflare. When it refuses requests, the scraper switches to Apify Proxy by itself. Set a proxy only if you want to force one for every request.

**Can I schedule runs or connect the results to other tools?**
Yes. Use [Apify schedules](https://docs.apify.com/platform/schedules) for recurring runs and [integrations](https://apify.com/integrations) to send results to Google Sheets, Slack, Zapier, Make, or a webhook. Results are also available through the [API](https://apify.com/parsebird/redbubble-scraper/api).

**Something doesn't work. What should I do?**
Open an issue on the [Issues tab](https://apify.com/parsebird/redbubble-scraper/issues) with your input and run link.

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/redbubble-scraper/changelog.md

# Actor input Schema

## `searchQueries` (type: `array`):

Enter words to search for on Redbubble, one per line. Each keyword runs as its own search. Leave empty if you only use URLs.

## `searchUrls` (type: `array`):

Paste Redbubble search, category, or artist shop URLs, e.g. <code>https://www.redbubble.com/shop?query=retro+poster</code>, <code>https://www.redbubble.com/shop/stickers</code>, or <code>https://www.redbubble.com/people/USERNAME/shop</code>. Filters and sorting in the URL are kept as pasted. Product pages (/i/...) are not supported.

## `productType` (type: `string`):

Show only one product type in keyword searches. Pasted URLs keep the product type in the URL.

## `sortBy` (type: `string`):

Order of keyword search results. Pasted URLs keep the sort order in the URL.

## `hideMatureContent` (type: `boolean`):

Leave out designs that their artist marked as mature content.

## `maxResults` (type: `integer`):

Stop after saving this many products for each keyword or URL. Set 0 for no limit. Redbubble shows at most 10 pages (about 820 to 900 products) for a search or category; artist shops have no limit.

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

Redbubble usually works without a proxy. If Redbubble starts refusing requests, the scraper switches to Apify Proxy on its own. Set a proxy here only if you want to force one.

## Actor input object example

```json
{
  "searchQueries": [
    "cat stickers"
  ],
  "searchUrls": [],
  "productType": "",
  "sortBy": "relevant",
  "hideMatureContent": false,
  "maxResults": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "searchQueries": [
        "cat stickers"
    ],
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/redbubble-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 = {
    "searchQueries": ["cat stickers"],
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/redbubble-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 '{
  "searchQueries": [
    "cat stickers"
  ],
  "maxResults": 50
}' |
apify call parsebird/redbubble-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/redbubble-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/yG9XHILa8c3aBuaYn/builds/Wd0YJHdrOoaMf1fDd/openapi.json
