POD Trend Scraper — Redbubble & TeePublic
Pricing
from $3.00 / 1,000 results
POD Trend Scraper — Redbubble & TeePublic
Scrape public, robots.txt-allowed Redbubble and TeePublic listing pages for print-on-demand niche research: ranked titles, shops, prices, product types, tags and image URLs.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
Furkan Yalçıntaş
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
POD Trend Scraper — Redbubble niche research
Find out which designs, tags and product types rank on Redbubble, one of the largest print-on-demand (POD) marketplaces. Give the Actor a list of niches or keywords and get one clean, ranked table of Redbubble products with titles, shops, prices, product types and full tag lists.
TeePublic support is experimental and off by default. TeePublic's anti-bot protection blocks many cloud / datacenter IP addresses (HTTP 403), so a TeePublic run can return 0 items. Turn it on with
"sources": "both"or"teepublic"only if you can live with that (a proxy may help).
Robots-compliant: only public listing pages are read (Redbubble /shop/<term>, experimental TeePublic
/t-shirts/<term>), with no search query or sort parameters. Each URL is checked against the site's
live robots.txt before it is requested; a disallowed URL is skipped and reported.
Built for POD sellers, niche researchers and designers who want to answer questions like:
- Which "retro gaming" designs rank at the top right now, and on which products?
- Which tags do top-ranked "cat" designs use?
- What price points do sticker and t-shirt listings sit at?
What it extracts
One dataset row per product listing, in the marketplace's own rank order:
| Field | Description |
|---|---|
source | redbubble or teepublic |
query | the search term that produced the row |
rank | 1-based position in the results for that term and marketplace (after de-duplication) |
title | listing title as shown on the marketplace |
artist | public shop / artist handle |
price, currency | current price as a number + ISO currency code |
originalPrice | pre-discount price when a sale is running (Redbubble), otherwise null |
url | absolute product URL |
imageUrl | product preview image |
productType | e.g. Classic T-Shirt, Sticker, Essential T-Shirt |
tags | design tags (Redbubble: full list; TeePublic: main tag + tags shown on the search tile) |
rating, reviewCount | always null for now — neither marketplace shows ratings on search pages |
sourceId | marketplace item / design id |
sortBy, page, scrapedAt | order used (relevant), result page number and UTC timestamp |
A RUN_SUMMARY record in the key-value store lists items per marketplace and per search term, how many
pages were fetched, blocked requests and any warnings.
Input
| Field | Default | Notes |
|---|---|---|
queries | — (required) | list of search terms, max 50 |
sources | redbubble | redbubble, both or teepublic (TeePublic = experimental, see above) |
sortBy | relevant | only relevant (the marketplace's default order); other values are ignored with a warning |
productType | all | all, t-shirt, sticker, hoodie, mug, phone-case, tank-top, kids-t-shirt, poster, tote-bag |
maxItemsPerQuery | 100 | unique products per term per marketplace (1-1000) |
maxPages | 5 | hard cap on result pages per term and marketplace (1-20) |
proxyConfiguration | Apify residential | marketplaces block datacenter IPs; proxy traffic is included in the price |
Example:
{"queries": ["cat", "retro gaming"],"productType": "all","maxItemsPerQuery": 100,"maxPages": 5}
How the options map to each marketplace:
- Sort — both sites' robots.txt disallow sort parameters, so results come in the marketplace's
default (relevance) order.
trending/top-selling/newestare accepted but ignored with a warning. - Search term — turned into the listing path:
retro gamingbecomes Redbubble/shop/retro+gamingand TeePublic/t-shirts/retro-gaming(TeePublic's tag pages). - Product type — TeePublic has no "all departments" search, so
alluses its t-shirt listing. TeePublic has no poster or tote-bag listing; for those types only Redbubble is scraped. On Redbubblekids-t-shirtlists kids clothing (there is no kids-tee listing path). - Redbubble returns about 90 products per page, TeePublic 36.
Output example
Real rows from runs on 2026-10-07 (tags shortened; the TeePublic row comes from the experimental source):
[{"source": "redbubble","query": "cat","rank": 2,"title": "Everything’s good cat","url": "https://www.redbubble.com/i/sticker/Everything-s-good-cat-by-blah707/43977882/7sgk","price": 2.03,"currency": "USD","originalPrice": 2.7,"artist": "blah707","imageUrl": "https://ih1.redbubble.net/image.1030459700.7882/st,small,507x507-pad,600x600,f8f8f8.u1.jpg","productType": "Sticker","tags": ["cat","crying","funny","white","black","meme"],"rating": null,"reviewCount": null,"sourceId": "43977882_sticky-runners_EJUG5","sortBy": "relevant","page": 1,"scrapedAt": "2026-10-07T19:52:50Z"},{"source": "teepublic","query": "cat","rank": 1,"title": "Cat T-Shirt","url": "https://www.teepublic.com/t-shirt/46060798-cat","price": 24.0,"currency": "USD","originalPrice": null,"artist": "theladyernestember","imageUrl": "https://images.teepublic.com/derived/production/designs/46060798_2/1685673247/i_m:bi_production_blanks_h778z1f0n6g0xugjpxxm_1462829020,c_19_0_432x,s_313,q_90.jpg","productType": "Classic T-Shirt","tags": ["cat","adorable","animal","aww","awww","cartoon"],"rating": null,"reviewCount": null,"sourceId": "46060798","sortBy": "relevant","page": 1,"scrapedAt": "2026-10-07T19:54:01Z"}]
The dataset has two views: Products (image, rank, title, shop, price, product type, tags, URL) and Tags (title + tags only, handy for keyword research). Export as JSON, CSV, Excel or via the API.
Pricing
Pay per event: $0.003 per product saved to the dataset (product-scraped, i.e. $3 per 1,000 products)
plus Apify's standard Actor start event ($0.00005 per run). A typical run of 2 keywords x 100 products costs
about $0.60. See the Pricing tab for the current prices. Set a maximum cost per run in the run options and
the Actor stops cleanly when it is reached.
Limits and good to know
- Only public listing pages are read, and only URLs that robots.txt allows. No login, no account pages, no checkout, no search query or sort parameters.
- No personal data is collected: no e-mails, phone numbers or customer reviews — only catalogue data and the public shop handle that is part of each listing.
- Requests are sequential with a 1-2 second pause between pages and exponential backoff on HTTP 403/429.
After two blocked pages in a row a marketplace is skipped for the rest of the run and a warning is
shown in the run status. If that happens, enable a proxy in
proxyConfiguration. - TeePublic is experimental: its anti-bot protection blocks many networks, including most cloud IPs. If TeePublic returns 0 items, the run summary shows the blocked requests; you are only charged for products actually saved.
- TeePublic search tiles show a shortened tag list, so some TeePublic tags can be cut off mid-word.
- If a marketplace changes its page layout and nothing can be parsed, the run status says
0 items parsed — selector may be outdated. Please open an issue so the parser can be updated. - Prices are the ones shown to the scraper's location (normally USD).
Legal
This Actor only accesses publicly available pages, at a modest request rate, and does not collect personal data. You are responsible for using the data in line with the marketplaces' terms and applicable law (for example copyright and trademark rules when creating designs). Do not copy other artists' designs.
Not affiliated with, endorsed by or sponsored by Redbubble or TeePublic. Redbubble and TeePublic are trademarks of their respective owners.
Run locally and deploy
pip install -r requirements.txtpython -m unittest discover -s tests -t . # offline tests (HTML fixtures)APIFY_LIVE=1 python -m unittest tests.test_live # optional live check./local_run.sh '{"queries": ["cat"], "maxItemsPerQuery": 20}' # apify run + copies results to cikti/apify login # once; paste your API token from Console > Settings > API & Integrationsapify push # builds the Docker image on the Apify platform
.actor/pay_per_event.json is not read by the Apify platform. It only feeds the local pay-per-event
simulation in local_run.sh (ACTOR_TEST_PAY_PER_EVENT). The real event prices are entered in Apify Console
(Publication > Monetization > Pay per event) and must match the event names used in src/main.py.