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

Scrape Redbubble - a global print-on-demand marketplace for independent artists. Search products by keyword, browse a specific artist's shop, or fetch full product detail (price, tags, rating, artwork images) from a product URL.

- **URL**: https://apify.com/crawlerbros/redbubble-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** E-commerce, Automation, 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

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

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Redbubble Scraper

Scrape [Redbubble](https://www.redbubble.com) — a global print-on-demand marketplace where independent artists sell their designs on stickers, t-shirts, phone cases, wall art, home decor, and more. Search products by keyword, browse a specific artist's shop, or pull full product detail (description, tags, price, rating, artwork images) straight from a product URL. No login, no API key, no cookies required.

### What this actor does

- **Three modes:** `search`, `byArtist`, `byProductUrl`
- **Keyword search** with product-category, artwork-medium, gender-fit, and sort-order filters
- **Artist shop browsing** — every product currently listed by a given artist, optionally filtered to a category and sort order, plus one artist-profile record (bio, follower/favorite counts, collections, social links) per artist
- **Direct product lookups** by URL — includes description, tags, product features, and review rating when available
- **Price filtering** — restrict results to a price range (USD)
- **Gender-fit filtering** — restrict apparel results to women's or men's fit (ignored for non-apparel products)
- **Mature-content toggle**
- **Empty fields are omitted** — every record only contains fields Redbubble actually returned

### Output per product

- `workId` — Redbubble's numeric design ID
- `title`, `description` (when available from product-detail lookups)
- `artistUsername`, `artistShopDisplayName`, `artistEstablished`
- `artistProfileUrl`, `artistId`, `artistAvatarUrl`, `artistFeatured`, `artistFanArtist` (product-detail lookups only)
- `licensed` — true if the design is officially licensed content (product-detail lookups only)
- `originalLocale`, `isMachineTranslated` — the language the listing was originally written in, and whether its title/description shown to you is an auto-translation of that original (product-detail lookups only)
- `tags[]` — up to 20 artist-supplied tags
- `matureContent` — true/false
- `productType` (e.g. `Sticker`, `Essential T-Shirt`), `productTypeId`
- `measurementSummary` (e.g. `3 x 2.9 in`)
- `productOptions` — the specific variant shown for this listing, e.g. `{"bodyColor": "Black", "size": "M", "printLocation": "Front"}` for apparel or `{"size": "Small (3.8 x 2.3 in)", "kind": "Matte"}` for stickers; omitted for product types with only one fixed variant (e.g. mugs)
- `productFeatures[]` — material/print-quality bullet points for the product type (product-detail lookups only)
- `availableProductTypes[]` — the same design as sold on every other product type (mug, tote, magnet, canvas print, etc.), each with its own `productType`, `productTypeId`, `priceAmount`, `priceCurrency`, `productUrl`, `previewImageUrl`, `stockStatus` (product-detail lookups only)
- `priceAmount`, `priceCurrency`, `originalPriceAmount`, `discountPercent` — current sale price plus original price/discount when the item is discounted
- `volumeDiscountThresholds[]` — bulk-buy discount tiers (`quantity`, `percentOff`), when the product type offers one
- `previewImageUrl` — main product photo
- `artworkImageUrl` — the flat artwork image
- `alternateImageUrl` — second product photo (e.g. the other gender fit) when the product type offers one — apparel only
- `productUrl` — canonical Redbubble product page
- `stockStatus`
- `rank` — position in the search/shop listing (search and byArtist modes)
- `reviewCount`, `ratingValue` — only included when the design has at least one real review
- `recordType: "product"`, `scrapedAt`

#### Artist profile record (mode=byArtist only)

One extra record per artist, with `recordType: "artist"`:

- `artistId`, `artistUsername`, `artistShopDisplayName`, `artistBio`
- `artistLocation` or `artistJoinedText` — whichever the artist's profile publicly shows
- `artistAvatarUrl`
- `artistWorksCount`, `artistFollowerCount`, `artistFollowingCount`, `artistFavoriteReceivedCount`
- `artistCollections[]` — the artist's featured collections (`title`, `coverImageUrl`)
- `artistExternalLinks[]` — social/personal site links the artist has listed
- `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `byArtist` / `byProductUrl` |
| `searchQuery` | string | `cat` | Free-text keyword query (mode=search) |
| `category` | select | `all-departments` | Restrict to a Redbubble product category (mode=search and mode=byArtist) |
| `sortOrder` | select | `relevant` | `relevant` / `trending` / `recent` / `top selling` (mode=search and mode=byArtist) |
| `medium` | select | `all` | Restrict to an artwork medium: design & illustration, digital art, drawing, painting & mixed media, photography (mode=search) |
| `gender` | select | `all` | Restrict apparel results to a gender fit: Everyone / Women's Fit / Men's Fit. Ignored for non-apparel categories (mode=search and mode=byArtist) |
| `style` | string | – | Advanced product-style filter code, e.g. `u-active-t-shirt` for Active T-Shirts within the T-Shirts category. Style codes are category-specific — check the "Style" filter sidebar on the matching redbubble.com/shop category page. Ignored for categories without style variants (mode=search and mode=byArtist) |
| `extraFilters` | array | – | Advanced raw `key=value` filter pairs for category-specific sidebar filters not covered above, e.g. `tShirtColor=tShirtColor-black`, `fit=fit-slim-fit`, `neckType=neckType-crew-neck`, `sleeveLength=sleeveLength-short-sleeve`, `tShirtSize=tShirtSize-m`, `priceFilter=price-low`. Copy the pair from a category's filter-sidebar URL on redbubble.com/shop (mode=search and mode=byArtist) |
| `includeMatureContent` | boolean | `false` | Include mature/adult-tagged designs (mode=search) |
| `artistUsernames` | array | – | Artist usernames, e.g. `blah707` (mode=byArtist) |
| `productUrls` | array | – | Full product page URLs (mode=byProductUrl) |
| `minPrice` | integer | – | Drop products cheaper than this (USD) |
| `maxPrice` | integer | – | Drop products more expensive than this (USD) |
| `maxItems` | integer | `50` | Hard cap on emitted records (1–1000) |

#### Example: search stickers under $5

```json
{
  "mode": "search",
  "searchQuery": "cat",
  "category": "all-stickers",
  "maxPrice": 5,
  "maxItems": 50
}
```

#### Example: browse an artist's entire shop

```json
{
  "mode": "byArtist",
  "artistUsernames": ["blah707"],
  "maxItems": 100
}
```

#### Example: fetch full detail for specific products

```json
{
  "mode": "byProductUrl",
  "productUrls": [
    "https://www.redbubble.com/i/sticker/Everything-s-good-cat-by-blah707/43977882/7sgk"
  ]
}
```

### Use cases

- **Print-on-demand market research** — track pricing, discounts, and trending designs across a niche
- **Artist portfolio monitoring** — watch a shop's full catalog for new releases and price changes
- **Competitive intelligence** — see how similar designs are tagged, priced, and categorized
- **Trend discovery** — pull trending or best-selling results for a keyword or category
- **Content curation** — build design-discovery feeds by category or tag

### FAQ

**Do I need a Redbubble account or API key?**  No. The actor reads only public product and shop pages.

**What's the difference between `priceAmount` and `originalPriceAmount`?**  `priceAmount` is what you'd actually pay right now. `originalPriceAmount` (with `discountPercent`) is only included when the item is currently on sale.

**Why do some products have no `reviewCount`/`ratingValue`?**  Redbubble only shows a real rating once a design has at least one review; the actor omits these fields rather than emit a meaningless default.

**Can I search by exact product category without a keyword?**  Yes — leave `searchQuery` empty and set `category` to any value other than "All Departments" to browse that category directly.

**What's the extra record with `recordType: "artist"` in mode=byArtist?**  A one-time shop-level summary (bio, follower count, favorites received, collections) pushed alongside that artist's products — it doesn't count against `maxItems`.

**Does `gender` work for non-apparel products like stickers or mugs?**  Redbubble ignores the filter for product types it doesn't apply to, so results are unaffected rather than emptied out.

**Does `byArtist` return every product an artist sells, or one row per design?**  One row per product listing (each design × blank-item combination Redbubble surfaces on the shop page), matching what a shopper sees when browsing that artist's storefront.

**How fresh is the data?**  Real-time — every run reads Redbubble's live storefront, the same pages a shopper's browser renders.

**What does `medium` filter on?**  The artwork's technique, as tagged by Redbubble — e.g. `photography` for photo-based designs vs. `digital` for digital art. It applies to search mode only.

**Why do only `byProductUrl` results have `productFeatures`?**  Those bullet points (material, finish, care notes) live on the individual product page, not on search/shop listing cards.

**What is `availableProductTypes`?**  Redbubble sells every design across dozens of product types (stickers, mugs, totes, canvas prints, etc.) at once. On a `byProductUrl` lookup, this field lists every *other* product type the same design is currently available on, each with its own price and product page URL — handy for finding the cheapest/priciest way to buy a given design, or for enumerating every product a design appears on without crawling each one separately.

**Where do I find a `style` filter code?**  Open the target category on redbubble.com/shop (e.g. T-Shirts) and look at the "Style" section of the filter sidebar — each option's underlying code (e.g. `u-active-t-shirt` for "Active") is what this actor's `style` input expects. Codes vary per category; an unrecognized or mismatched code is silently ignored rather than emptying your results.

**What do `originalLocale`/`isMachineTranslated` mean?**  `originalLocale` is the language code the artist originally wrote the title/description in (e.g. `en`, `fr`). `isMachineTranslated` is `true` when the title/description you're seeing has been auto-translated from that original language rather than written by the artist directly. Only available on product-detail (`byProductUrl`) lookups.

**What are `artistFeatured`/`artistFanArtist`?**  Two independent badges Redbubble assigns to artists — `artistFeatured` marks accounts in Redbubble's curated "Featured Artist" program, `artistFanArtist` marks fan-art creators. Both are only available on product-detail (`byProductUrl`) lookups.

**What is `productOptions`?**  The specific size/color/print-location (or similar) variant Redbubble is showing for that particular listing card or product-detail lookup — e.g. `{"bodyColor": "Black", "size": "M"}` for a t-shirt. It reflects the default/currently-displayed variant, not every variant the design is available in. Omitted for product types that only come in one fixed configuration (e.g. mugs, most home decor).

**How do I filter on size, color, fit, or other category-specific options?**  Use `extraFilters` with a raw `key=value` pair copied from that category's filter sidebar on redbubble.com/shop, e.g. `tShirtColor=tShirtColor-black` or `neckType=neckType-v-neck`. These options vary per product category (apparel has size/color/fit/neckline/sleeve-length filters, other categories have their own), so rather than a fixed dropdown this field accepts any valid pair directly from the site.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

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

Free-text keyword search (mode=search).

## `category` (type: `string`):

Restrict results to a Redbubble product category (mode=search and mode=byArtist).

## `sortOrder` (type: `string`):

Result ordering (mode=search and mode=byArtist).

## `medium` (type: `string`):

Restrict search results to a specific artwork medium/technique (mode=search).

## `style` (type: `string`):

Optional product-style filter code, e.g. `u-active-t-shirt` (Active) or `u-tee-boxy` (Boxy) within the T-Shirts category. Style codes are specific to each product category — open the desired category on redbubble.com/shop and check the "Style" filter sidebar for the codes available there. Ignored if the chosen category has no style variants (mode=search and mode=byArtist).

## `extraFilters` (type: `array`):

Optional raw `key=value` filter pairs for category-specific sidebar filters not covered by the fields above — e.g. `tShirtColor=tShirtColor-black`, `fit=fit-slim-fit`, `neckType=neckType-crew-neck`, `sleeveLength=sleeveLength-short-sleeve`, `tShirtSize=tShirtSize-m`, `priceFilter=price-low`. Each product category on redbubble.com/shop exposes its own set — open the desired category, apply a filter in the sidebar, and copy the resulting `key=value` pair from the URL. Ignored/dropped if malformed or if the key duplicates a dedicated field above (mode=search and mode=byArtist).

## `includeMatureContent` (type: `boolean`):

Include products tagged as mature/adult content in results (mode=search).

## `gender` (type: `string`):

Restrict apparel results (t-shirts, hoodies, dresses, etc.) to a gender fit. Ignored for non-apparel categories such as stickers or mugs (mode=search and mode=byArtist).

## `artistUsernames` (type: `array`):

Redbubble artist usernames, e.g. `blah707` (from redbubble.com/people/<username>/shop).

## `productUrls` (type: `array`):

Full Redbubble product page URLs, e.g. `https://www.redbubble.com/i/sticker/Title-by-artist/12345.ABCDE`.

## `minPrice` (type: `integer`):

Drop products cheaper than this (after any discount), in USD.

## `maxPrice` (type: `integer`):

Drop products more expensive than this (after any discount), in USD.

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

Hard cap on emitted records.

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

Requests are made directly first; this free Apify datacenter proxy is only engaged automatically as a fallback if Redbubble blocks the actor's IP.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "cat",
  "category": "all-departments",
  "sortOrder": "relevant",
  "medium": "all",
  "extraFilters": [],
  "includeMatureContent": false,
  "gender": "all",
  "artistUsernames": [],
  "productUrls": [],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `products` (type: `string`):

Dataset containing all scraped Redbubble products and (mode=byArtist) artist profile records.

# 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 = {
    "mode": "search",
    "searchQuery": "cat",
    "category": "all-departments",
    "sortOrder": "relevant",
    "medium": "all",
    "extraFilters": [],
    "includeMatureContent": false,
    "gender": "all",
    "artistUsernames": [],
    "productUrls": [],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/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 = {
    "mode": "search",
    "searchQuery": "cat",
    "category": "all-departments",
    "sortOrder": "relevant",
    "medium": "all",
    "extraFilters": [],
    "includeMatureContent": False,
    "gender": "all",
    "artistUsernames": [],
    "productUrls": [],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/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 '{
  "mode": "search",
  "searchQuery": "cat",
  "category": "all-departments",
  "sortOrder": "relevant",
  "medium": "all",
  "extraFilters": [],
  "includeMatureContent": false,
  "gender": "all",
  "artistUsernames": [],
  "productUrls": [],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call crawlerbros/redbubble-scraper --silent --output-dataset

```

## MCP server setup

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