BOOTH VRChat 3D Products Scraper
Pricing
from $0.00005 / actor start
BOOTH VRChat 3D Products Scraper
Scrape BOOTH.pm VRChat 3D avatar and wearable listings — get price, shop info, images, and description as structured data.
Pricing
from $0.00005 / actor start
Rating
0.0
(0)
Developer
coco zizi
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 hours ago
Last modified
Categories
Share
An Apify Actor that scrapes structured product data from BOOTH.pm (pixiv's marketplace for indie creators), targeting 3D avatars, outfits, and shaders made for VRChat. All-ages products only (adult products are excluded).
Features
- Scrape BOOTH.pm VRChat avatar and 3D model listings
- Extract price, shop, and image data from BOOTH products
- Filter BOOTH listings by keyword or category
- Fetch product descriptions and free-download file info
- Sync an entire BOOTH category across multiple runs
What does this Actor do?
- Crawls a BOOTH product category (default: "3D Models") page by page and collects listing-level data (product name, price, shop info, thumbnail, like count)
- Optionally fetches additional detail-page data for each product (description, image list, free- download file info)
- Simple keyword filtering on product name (see "FAQ & known limitations" below for its constraints)
- Supports "full sync" across multiple runs to crawl an entire category (
startPage)
Who is this for?
This is a data feed for indie developers who want to work with BOOTH's product data programmatically — for example:
- Building your own VRChat catalog or discovery site from BOOTH listings
- Tracking price and popularity (wishlist count) trends over time
- Feeding structured BOOTH product data to an AI agent or app that needs catalog info
Input
| Parameter | Type | Default | Description |
|---|---|---|---|
categories | array | ["3D Models"] | BOOTH categories to crawl. VRChat avatars/outfits are concentrated mostly in "3D Models" |
sortBy | string | wish_lists | Sort order: wish_lists (favorite count) / popularity / new (newest) |
onlyFreeProducts | boolean | false | When on, restricts to free (¥0) products only |
keywordFilter | string | "" (empty) | Simple filter: keeps only products whose name contains this string. Please read "FAQ & known limitations" below |
maxItems | integer | 60 | Cap on the number of products fetched in this run (max 1000). Drives run cost directly |
startPage | integer | 1 | Pagination start page. Used when doing a full sync across an entire category (see below) |
fetchProductDetail | boolean | false | When on, additionally fetches description, image list, and download info from each product page (extra charge per item). We recommend trying listing-only data first with this off |
Output
Example output with fetchProductDetail: true (from a real, publicly listed product; only the key fields
are shown here — actual output also includes productUrl/brand/shop/categoryId/categoryName/
liked/isAdult/thumbnailUrl/scrapedAt/description/images). Product names naturally stay in the
seller's original language (mostly Japanese), since that's the actual listing data.
A paid product:
{"productId": 5813187,"productName": "キプフェル Kipfel / オリジナル3Dモデル","priceYen": 5500,"priceDisplay": "5,500 JPY","downloadable": null}
A free product (downloadable carries the distributed file info):
{"productId": 3741802,"productName": "VR向けアバターモデル「RadDollV3」【無料】","priceYen": 0,"priceDisplay": "0 JPY","downloadable": [{"file_name": "RadDollV3_v3.02","file_extension": ".zip","file_size": "855 MB","name": "RadDollV3_v3.02.zip","url": "https://booth.pm/downloadables/7849637?variation_id=6226442"}]}
When fetchProductDetail: false, categoryName / priceDisplay / description / images /
downloadable are not included (all other fields are the same).
How to fully sync an entire category
A single run can only fetch up to maxItems (max 1000). To fetch an entire category (e.g. "3D Models"
has over 260,000 listings), run this Actor multiple times, shifting startPage each time.
- First run: use
startPage: 1(default) - After the run, check the
SYNC_STATErecord saved to that run's key-value store (Apify Console → run details → Key-value store, or theapify key-value-storescommand) - Check
SYNC_STATE.categories["<category name>"].nextStartPage—isExhausted: truemeans that category is done;falsemeans there's more to fetch - On subsequent runs, set
startPageto thatnextStartPagevalue. Repeat untilisExhausted: true
For full-sync use, specify only a single category in categories. If you specify multiple categories
at once, the resume state for any category not yet reached when maxItems is hit won't carry over
correctly.
If a run stops mid-page because maxItems was reached, the rest of that page (up to 59 items) is skipped
on the next run rather than reprocessed. This can leave small coverage gaps, but guarantees no item is
ever charged twice across two sync runs.
Pricing
Pay-per-event pricing:
| Event | Price | Trigger |
|---|---|---|
Actor Start (apify-actor-start) | $0.00005 | Once per run (Apify's standard synthetic event; Apify covers the first 5 seconds of CU) |
Product listed (product-listed) | $0.002 | Per product retrieved from the category listing |
Product scraped (product-detail-fetched) | $0.03 | When fetchProductDetail: true, per product for which detail-page data (description, images, download info) was additionally fetched |
Example: fetching 100 items with fetchProductDetail: true ≈ $0.00005 + 100×$0.002 + 100×$0.03 ≈ $3.20
FAQ
Does this scrape adult (R-18) BOOTH products?
No — only all-ages products are collected, based on the age flags on both the listing (isAdult) and
detail pages. Future changes to BOOTH's markup could cause this check to fail, so please verify sensitive
category flags yourself before using this for public-facing content.
Can I get only VRChat-related items, not all of "3D Models"?
BOOTH has no dedicated "VRChat" category — VRChat-related content makes up a large share of "3D Models",
but 3D assets for other platforms are mixed in too. keywordFilter does a simple string match against the
product name only (not BOOTH's own full-text search across tags/descriptions), so in practice
keywordFilter: "VRChat" only matches around 15-18% of what BOOTH's own search would return. Also note
that filtering by both category and keyword at once isn't supported while paginating, in the current
version, due to a dependency library constraint.
How do I scrape an entire category, not just the first page?
Use the startPage/SYNC_STATE full-sync flow described below — run this Actor repeatedly, feeding each
run's SYNC_STATE.categories["<category name>"].nextStartPage back in as the next run's startPage,
until isExhausted: true.
What data do I get for each product?
By default: product name, price, shop info, thumbnail, and like count. With fetchProductDetail: true,
you additionally get the description, image list, and free-download file info (see "Output" above).
Will I be charged twice if a run is interrupted mid-page? No — the full-sync design guarantees no item is ever charged twice across two sync runs (it may leave small coverage gaps instead of reprocessing).