Install
openclaw skills install avbuzzQuery AV new releases, rankings, and actress info from FANZA GraphQL API. No authentication required. Supports direct curl queries and optional Discord/Teleg...
openclaw skills install avbuzz⚠️ Adult Content (R18+) — This skill indexes adult video (AV) content from FANZA. Users must be 18+ and comply with local laws.
Query AV new releases, rankings, actress info, and search from FANZA's free GraphQL API. No API keys or authentication required.
Endpoint: POST https://api.video.dmm.co.jp/graphql
Authentication: None (public API)
Content-Type: application/json
All queries use the legacySearchPPV GraphQL operation. Results include: video code (番號), title, actresses, maker/studio, release date, cover image URL, star ratings, and bookmark count.
FANZA uses JST (Japan Standard Time, UTC+9). To get today's date in JST:
date -u -d '+9 hours' '+%Y-%m-%d'
On macOS:
TZ=Asia/Tokyo date '+%Y-%m-%d'
Use this date value in any deliveryStartDate filter. For yesterday, subtract 1 day:
date -u -d '+9 hours -1 day' '+%Y-%m-%d'
Fetch videos released on a specific date (use JST date, format YYYY-MM-DD):
curl -s -X POST https://api.video.dmm.co.jp/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{ legacySearchPPV(limit: 10, offset: 0, sort: DELIVERY_START_DATE, floor: AV, filter: { deliveryStartDate: \"2026-03-03\" }) { result { contents { id title deliveryStartAt contentType maker { name } actresses { id name } packageImage { largeUrl } review { average count } bookmarkCount } pageInfo { totalCount } } } }"}'
Change deliveryStartDate to any YYYY-MM-DD date. Use offset for pagination (0, 10, 20...).
Same as new releases but sorted by sales rank:
curl -s -X POST https://api.video.dmm.co.jp/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{ legacySearchPPV(limit: 10, offset: 0, sort: SALES_RANK_SCORE, floor: AV, filter: { deliveryStartDate: \"2026-03-03\" }) { result { contents { id title deliveryStartAt contentType maker { name } actresses { id name } packageImage { largeUrl } review { average count } bookmarkCount } pageInfo { totalCount } } } }"}'
Top videos by different criteria. Change sort value:
Sales ranking (best-selling):
curl -s -X POST https://api.video.dmm.co.jp/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{ legacySearchPPV(limit: 10, sort: SALES_RANK_SCORE, floor: AV) { result { contents { id title deliveryStartAt contentType maker { name } actresses { id name } packageImage { largeUrl } review { average count } bookmarkCount } pageInfo { totalCount } } } }"}'
Review ranking (highest rated):
curl -s -X POST https://api.video.dmm.co.jp/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{ legacySearchPPV(limit: 10, sort: REVIEW_RANK_SCORE, floor: AV) { result { contents { id title deliveryStartAt contentType maker { name } actresses { id name } packageImage { largeUrl } review { average count } bookmarkCount } pageInfo { totalCount } } } }"}'
Bookmark ranking (most saved):
curl -s -X POST https://api.video.dmm.co.jp/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{ legacySearchPPV(limit: 10, sort: BOOKMARK_COUNT, floor: AV) { result { contents { id title deliveryStartAt contentType maker { name } actresses { id name } packageImage { largeUrl } review { average count } bookmarkCount } pageInfo { totalCount } } } }"}'
Available sort values:
| Sort Value | Use When |
|---|---|
DELIVERY_START_DATE | User asks for "latest" / "newest" / "最新" — sorted by release date |
SALES_RANK_SCORE | User asks for "popular" / "best-selling" / "熱門" / "銷售" |
REVIEW_RANK_SCORE | User asks for "highest rated" / "best reviewed" / "評分" |
BOOKMARK_COUNT | User asks for "most saved" / "most bookmarked" / "收藏" |
Search by actress name, title, video code, or any keyword:
curl -s -X POST https://api.video.dmm.co.jp/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{ legacySearchPPV(limit: 10, offset: 0, sort: SALES_RANK_SCORE, floor: AV, queryWord: \"蒼井空\") { result { contents { id title deliveryStartAt contentType maker { name } actresses { id name } packageImage { largeUrl } review { average count } bookmarkCount } pageInfo { totalCount } } } }"}'
Replace 蒼井空 with any search term. Works with:
波多野結衣, 蒼井 空 (space may help)SSNI, IPZ-123VR, 4K, studio namesImportant notes on search:
SSIS-001 but FANZA uses ssis00001 (lowercase, no hyphen, 5-digit zero-padded number). Try both formats — the API handles uppercase/lowercase, but removing the hyphen and padding zeros improves accuracyIf you know the actress ID (from a previous search result), fetch all her works:
curl -s -X POST https://api.video.dmm.co.jp/graphql \
-H "Content-Type: application/json" \
-d '{"query":"{ legacySearchPPV(limit: 20, sort: DELIVERY_START_DATE, floor: AV, filter: { actressIds: { ids: [{ id: \"26225\" }] } }) { result { contents { id title deliveryStartAt contentType maker { name } actresses { id name } packageImage { largeUrl } review { average count } bookmarkCount } pageInfo { totalCount } } } }"}'
Replace 26225 with the actress ID. Note the nested object syntax: actressIds: { ids: [{ id: "ID" }] }.
All queries return the same structure:
{
"data": {
"legacySearchPPV": {
"result": {
"contents": [
{
"id": "ssni00001",
"title": "Title in Japanese",
"deliveryStartAt": "2026-03-03",
"contentType": "TWO_DIMENSION",
"maker": { "name": "Studio Name" },
"actresses": [
{ "id": "26225", "name": "波多野結衣" }
],
"packageImage": {
"largeUrl": "https://pics.dmm.co.jp/..."
},
"review": { "average": 4.5, "count": 123 },
"bookmarkCount": 456
}
],
"pageInfo": { "totalCount": 42 }
}
}
}
}
| Field | Description |
|---|---|
id | FANZA product code / 番號 (e.g., ssni00001) — display as UPPERCASE |
title | Video title (Japanese) |
deliveryStartAt | Release date (YYYY-MM-DD) |
contentType | TWO_DIMENSION for normal, VR for VR content |
maker.name | Studio/maker name |
actresses | Array of { id, name } — performer info |
packageImage.largeUrl | Cover image URL (DMM CDN) |
review.average | Star rating 1.0–5.0 |
review.count | Number of reviews |
bookmarkCount | Number of user bookmarks/saves |
pageInfo.totalCount | Total matching results (for pagination) |
Use limit and offset parameters:
limit: 10, offset: 0limit: 10, offset: 10limit: 10, offset: 20Maximum limit is 50.
To link to a video's FANZA page:
https://www.dmm.co.jp/digital/videoa/-/detail/=/cid={id}/
Replace {id} with the product code (lowercase).
| HTTP Code | Meaning | Action |
|---|---|---|
| 200 | Success | Parse data.legacySearchPPV.result |
200 + errors | GraphQL validation error (wrong syntax) | Check query syntax against examples above |
| 429 | Rate limited | Retry after 2-10 seconds (exponential backoff) |
| 500 | Server error | Retry after 5 seconds; if persistent, API may be temporarily down |
| 503 | Service unavailable | API is temporarily down; retry after 30 seconds |
| Timeout | Network issue | Check connectivity; retry after 5 seconds |
Empty results (contents: [], totalCount: 0) are NOT errors — they mean no matching content was found.
The GraphQL API does NOT support filtering by contentType (VR vs normal). To find VR content:
contentType === "VR" in the responsequeryWord: "VR" with your desired sort to get VR-specific results蒼井空 and 蒼井 空SALES_RANK_SCORE for popular, DELIVERY_START_DATE for newestcontentType === "VR" (normal content is "TWO_DIMENSION") and mark with 🥽packageImage.largeUrl works directly in Discord embeds, Telegram, web, etc.{"errors":[...]} on invalid queries. HTTP 429 means rate limited — retry after a few seconds.This skill provides on-demand queries only. The AI queries FANZA when you ask, but cannot autonomously push daily notifications.
For automatic daily new release alerts, deploy the AVBUZZ Discord bot to a VPS (see "Advanced: Discord Bot Deployment" below). The bot supports:
/notify on / /notify off to toggle daily push per channelFANZA GraphQL API is undocumented and unofficial. This skill uses a reverse-engineered API endpoint (
api.video.dmm.co.jp/graphql) that is not publicly supported by DMM/FANZA. The API could change or become unavailable at any time without notice. Use at your own risk. This project is not affiliated with DMM, FANZA, or any content producers.
AVBUZZ can also run as a persistent Discord bot with slash commands, automatic daily digests, actress tracking alerts, and Telegram integration.
GitHub: github.com/zxcnny930/avbuzz
git clone https://github.com/zxcnny930/avbuzz.git
cd avbuzz
npm install
cp config.example.json config.json # Edit with your tokens
npm start
Requires: node, npm, git
All settings in config.json:
{
"discord": {
"token": "YOUR_DISCORD_BOT_TOKEN",
"guildId": "YOUR_GUILD_ID",
"channelId": "YOUR_CHANNEL_ID"
},
"telegram": {
"botToken": "YOUR_TELEGRAM_BOT_TOKEN",
"chatId": "YOUR_CHAT_ID"
},
"schedule": {
"dailyPushHourJST": 0,
"dailyPushMinuteJST": 5,
"actressCheckIntervalHours": 6
}
}
bot → permissions: Send Messages, Embed Links → invite bot@BotFather on Telegram → /newbot → copy Tokenhttps://api.telegram.org/bot<TOKEN>/getUpdates → find chat.id| Command | Description |
|---|---|
/new [date] | New releases for date (default: today JST) |
/today | Today's trending (by sales rank) |
/ranking <sales|review|bookmark> | Top 10 by category |
/search <keyword> | Search by actress, title, code |
/track <name> | Track actress — alerts on new releases |
/untrack <name> | Stop tracking |
/tracklist | Show all tracked actresses |
/random | Random video recommendation |
/status | System status and API health check |
/code <id> | Exact video code lookup (e.g., SSIS-001) |
/digest | Weekly top picks (rating, bookmark, sales) |
| Task | Frequency | Description |
|---|---|---|
| Daily Digest | Once/day (configurable JST time) | Top 20 new releases → Discord + Telegram |
| Actress Check | Every 6h (configurable) | New releases for tracked actresses → alerts |
| Weekly Digest | Sunday JST 20:00 | Top rated, bookmarked, best-selling → Discord + Telegram |
ssh root@your-vps.com
git clone https://github.com/zxcnny930/avbuzz.git /root/avbuzz
cd /root/avbuzz && npm install
cp config.example.json config.json && nano config.json
Create /etc/systemd/system/avbuzz.service:
[Unit]
Description=AVBUZZ Discord Bot
After=network.target
[Service]
Type=simple
WorkingDirectory=/root/avbuzz
ExecStart=/usr/bin/node src/index.js
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
systemctl daemon-reload && systemctl enable avbuzz && systemctl start avbuzz
journalctl -u avbuzz -f # View logs
nano config.json && systemctl restart avbuzz
Dual License — Non-commercial use is free under PolyForm Noncommercial 1.0.0. Commercial use requires a separate license from the author.
GitHub: github.com/zxcnny930/avbuzz
brew install curl