# DLsite Japan Scraper - Doujin & Digital Product Prices API (`fruitful_quintessence/dlsite-scraper`) Actor

Scrapes DLsite (Japan's largest doujin/digital marketplace) for product listings, prices, discounts and sales rankings. Extracts title, price, genre, circle, rank, review scores. For market research, price monitoring and AI agents.

- **URL**: https://apify.com/fruitful\_quintessence/dlsite-scraper.md
- **Developed by:** [atushi ino](https://apify.com/fruitful_quintessence) (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 $5.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

## DLsite Scraper — Japan Doujin Marketplace Data Extractor

Scrape [DLsite](https://www.dlsite.com) — Japan's largest doujin (同人) digital marketplace with 600,000+ products. Extract structured product data from voice/ASMR, games, manga, music, and software categories.

**Data source**: DLsite internal JSON API (v2 + v1 hybrid). Returns **69 fields** per product with no JavaScript required.

### Features

- **Keyword Search** — Search by title or keyword (Playwright-powered for Vue.js rendering)
- **Ranking Scraping** — Daily, weekly, monthly, and all-time rankings (direct HTTP)
- **New Releases** — Latest products from home/new or maniax/new (direct HTTP)
- **Circle Works** — All products by a specific circle/brand (direct HTTP)
- **Product ID Mode** — Scrape specific RJ/VJ/BJ/RE/VE IDs directly (fastest)
- **69 Data Fields** per product including:
  - Title, circle/brand name, circle ID, work ID (RJ/VJ/BJ)
  - Price (sale + original), discount rate, sale status
  - **Multi-currency prices**: JPY, USD, EUR, GBP, TWD, CNY, KRW
  - Voice actors, genres, age rating
  - Work type, file format, file size
  - Sample images, full description
  - **Download count**, **rating (★4.92)**, rating count
  - **Wishlist count**, **review count**
  - **Bulk‑buy price**, **bulk‑buy discount**, **is\_bulkbuy**
  - **Limit download count**, **remaining download count**
  - **is\_reservable**, **is\_timesale**
  - **is\_original\_work**, **original\_work\_id**, **translation\_lang**
  - **locale\_official\_price**, **locale\_price**
  - **sex\_category**
  - Release date, maker ID, site ID
- **Adult Content** — Full support for both all-ages and R18 products
- **No Cloudflare** — Direct access with no blocking

### Use Cases

- **Price monitoring** — Track sales and discounts on doujin content
- **AI training data** — Build datasets for Japanese content recommendation
- **Market research** — Analyze trends by genre, circle, and pricing
- **Catalog building** — Create searchable databases of doujin products
- **Translation planning** — Identify popular untranslated works

### Quick Start

#### Keyword Search

Search for ASMR voice products:

```json
{
  "searchMode": "search",
  "searchKeyword": "ASMR",
  "maxResults": 25
}
```

#### Rankings

Get this week's top products:

```json
{
  "searchMode": "ranking",
  "rankingType": "weekly",
  "maxResults": 50
}
```

#### Specific Products

Scrape specific works by their RJ/VJ/BJ ID:

```json
{
  "searchMode": "product_ids",
  "productIds": "RJ01678178,RJ01678210,VJ01000001"
}
```

### Input Parameters

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `searchMode` | enum | `ranking` | `search`, `ranking`, or `product_ids` |
| `searchKeyword` | string | `ASMR` | Keyword for search mode |
| `rankingType` | enum | `weekly` | `daily`, `weekly`, `monthly`, or `total` |
| `productIds` | string | — | Comma-separated RJ/VJ/BJ/RE/VE IDs (for product\_ids mode) |
| `maxResults` | int | 50 | Max items to return (1–200) |

### Output Example

```json
{
  "work_id": "RJ01678178",
  "title": "【ブルーアーカイブ】ミヨASMR～先生が、悪いんですよ?～",
  "circle": "Yostar",
  "circle_id": "RG62982",
  "price_jpy": 1188,
  "original_price_jpy": 1320,
  "price_usd": 8.07,
  "price_eur": 7.06,
  "price_gbp": 6.05,
  "discount_rate": 10,
  "sale_active": true,
  "release_date": "2026-07-27 00:00:00",
  "voice_actor": "花岩香奈",
  "age_rating": "All ages",
  "work_type": "Voice/ASMR",
  "work_type_code": "SOU",
  "file_format": "SND, DLP, TRI, JPN, REV",
  "file_size": "1.12GB",
  "genres": ["ASMR", "癒し", "バイノーラル/ダミヘ", "萌え"],
  "dl_count": 20110,
  "rating": 4.92,
  "rating_count": 225,
  "wishlist_count": 4109,
  "review_count": 12,
  "description": "癒しのASMR作品。バイノーラル録音で…",
  "image_url": "https://img.dlsite.jp/...",
  "url": "https://www.dlsite.com/home/work/=/product_id/RJ01678178.html",
  "site_id": "home",
  "detail_level": "api"
}
```

### Technical Details

- **Product details**: DLsite internal JSON API (v2 product.json + v1 info/ajax hybrid) — 255+86 fields, no JS needed
- **Listings, rankings & new releases**: Direct HTTP — server-rendered HTML with work IDs
- **Circle profile**: Direct HTTP — all works from a circle profile page
- **Keyword search**: Playwright (Chromium) for Vue.js page rendering — extracts IDs, then API for details
- **Work type filter**: Post-filter by voice/game/manga/music/soft
- **Parallel scraping**: ThreadPoolExecutor with 8 workers for fast batch processing
- **Retry logic**: Automatic retry with backoff on network errors

### Tech Stack

Python, httpx, Playwright (search only), concurrent.futures, re (regex), Apify SDK.

### Pricing

- **Run start**: $0.00005 per run
- **Per result**: $0.005 per product (charged only for items actually captured)
- A default test run (e.g. 20 results) typically costs **under $0.02**

No free-tier complexity — you pay only for what you extract.

### Proxy Requirement

- **Free plan**: use `useApifyProxy: true` only (auto proxies). This works because DLsite does not block datacenter IPs.
- **`apifyProxyCountry: "JP"` requires a paid Apify plan** — on the free plan country-specific proxies return `407 Proxy Authentication Required`. Leave country unset unless you have a paid plan.

### Limitations

- **Keyword search** uses Playwright (Chromium) to render DLsite's Vue.js pages and is slower than the other modes (~30–60s warm-up).
- **Ranking / new releases / circle / product ID modes** use direct HTTP and are fast — prefer them for bulk scraping.
- `maxResults` is capped at 200 per run; run multiple times with different keywords/circles to scale.
- Site structure may change; if a mode returns 0 items, switch modes or check for DLsite updates.

### License

MIT

# Actor input Schema

## `searchKeyword` (type: `string`):

Keyword to search for. Used when searchMode='search'.

## `searchMode` (type: `string`):

How to find products

## `rankingType` (type: `string`):

Which ranking to scrape (only used when searchMode='ranking')

## `workType` (type: `string`):

Filter by work category. 'all' = all types

## `productIds` (type: `string`):

Specific RJ/VJ/BJ product IDs to scrape. Used when searchMode='product\_ids'. Example: RJ01000001,RJ01000002

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

Maximum number of products to return (1-200)

## `locale` (type: `string`):

Locale for product data (e.g. ja\_JP, en\_US). Default: ja\_JP

## `circleId` (type: `string`):

Circle/maker ID for circle works mode (e.g. RG12345678)

## `newReleasesType` (type: `string`):

Which new-releases page to scrape (only used when searchMode='new\_releases')

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

Apify proxy (recommended: use Apify proxy with country JP for reliable access)

## Actor input object example

```json
{
  "searchKeyword": "ASMR",
  "searchMode": "search",
  "rankingType": "daily",
  "workType": "all",
  "maxResults": 50,
  "locale": "ja_JP",
  "newReleasesType": "all",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyCountry": "JP"
  }
}
```

# 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 = {
    "searchKeyword": "ASMR",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyCountry": "JP"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fruitful_quintessence/dlsite-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 = {
    "searchKeyword": "ASMR",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyCountry": "JP",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("fruitful_quintessence/dlsite-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 '{
  "searchKeyword": "ASMR",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyCountry": "JP"
  }
}' |
apify call fruitful_quintessence/dlsite-scraper --silent --output-dataset

```

## MCP server setup

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