BOOTH VRChat 3D Products Scraper avatar

BOOTH VRChat 3D Products Scraper

Pricing

from $0.00005 / actor start

Go to Apify Store
BOOTH VRChat 3D Products Scraper

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

coco zizi

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 hours ago

Last modified

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

ParameterTypeDefaultDescription
categoriesarray["3D Models"]BOOTH categories to crawl. VRChat avatars/outfits are concentrated mostly in "3D Models"
sortBystringwish_listsSort order: wish_lists (favorite count) / popularity / new (newest)
onlyFreeProductsbooleanfalseWhen on, restricts to free (¥0) products only
keywordFilterstring"" (empty)Simple filter: keeps only products whose name contains this string. Please read "FAQ & known limitations" below
maxItemsinteger60Cap on the number of products fetched in this run (max 1000). Drives run cost directly
startPageinteger1Pagination start page. Used when doing a full sync across an entire category (see below)
fetchProductDetailbooleanfalseWhen 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.

  1. First run: use startPage: 1 (default)
  2. After the run, check the SYNC_STATE record saved to that run's key-value store (Apify Console → run details → Key-value store, or the apify key-value-stores command)
  3. Check SYNC_STATE.categories["<category name>"].nextStartPageisExhausted: true means that category is done; false means there's more to fetch
  4. On subsequent runs, set startPage to that nextStartPage value. Repeat until isExhausted: 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:

EventPriceTrigger
Actor Start (apify-actor-start)$0.00005Once per run (Apify's standard synthetic event; Apify covers the first 5 seconds of CU)
Product listed (product-listed)$0.002Per product retrieved from the category listing
Product scraped (product-detail-fetched)$0.03When 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).