分析 API
演员统计、K 线、合作演员、排行榜和每周市场发行量。
/analytics 把目录变成数字:作品量、评分和工作室分布、合作演员、排行榜和每周市场发行量。数字来自发行日期、javlibrary 评分和已有的分面计数。不读播放量,不编造。
六个 GET 端点,都需要密钥。每 1,000 次调用 $0.60 起;排行榜和合作演员图随 num 增长。
演员 id
四个端点接受 q:统计、K 线、时间线和合作演员。q 是 /idols 的 id:javdatabase slug(如 yua-mikami)或仅 DMM 的 dmm-1005467。
q 是文档查找,不是搜索。日文名如 三上悠亜 会返回 404:查找不匹配姓名或别名。先搜索 /idols,再传 id:
curl -s -X POST https://api.javinfo.dev/idols \
-H "x-javinfo-key: $KEY" -H 'content-type: application/json' \
-d '{ "q": "yua" }'统计 — /analytics/idols/stats
一次调用拿到资料卡:作品量、跨度、评分、类型和工作室分布,0–1 明星分数。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
q | string | 是 | 来自 /idols 的 id 或 slug |
curl -s 'https://api.javinfo.dev/analytics/idols/stats?q=yua-mikami' \
-H "x-javinfo-key: jvi_your_key_here"响应 200(数组已裁剪):
{
"idol": {
"id": "yua-mikami",
"name": "Yua Mikami",
"nameJa": "三上悠亜",
"image": "https://pics.dmm.co.jp/mono/actjpgs/mikami_yua.jpg",
"tags": [
"Twenties",
"Big Tits"
],
"age": 33,
"heightCm": 159,
"cup": "G",
"debut": null,
"birthplace": "Aichi",
"aliases": [
"みかみゆあ"
]
},
"works": 1127,
"worksBySource": {
"fanza": 1127,
"javdatabase": 365,
"javlibrary": 457,
"javbus": 417,
"missav": 358
},
"firstRelease": "2015-06-01",
"lastRelease": "2026-11-20",
"releasesLast90": 30,
"avgRating": 8.02,
"ratedTitles": 168,
"studioCount": 8,
"topGenres": [
{
"genre": "Big Tits",
"count": 765
},
{
"genre": "Over 4 Hours",
"count": 610
},
"…"
],
"topStudios": [
{
"studio": "S1 NO.1 STYLE",
"count": 991
},
{
"studio": "ROOKIE",
"count": 48
},
"…"
],
"cadenceDays": 115,
"starPower": 0.885,
"starPower100": 88,
"asOf": "2026-11-08T07:34:17.700Z"
}works 是单一来源的最大计数,不是总和。同一部影片存在于 fanza、javdatabase、javlibrary、javbus 和 missav,相加会放大约四倍。worksBySource 显示这种重叠:按来源计数,不等于 works。
avgRating 是 javlibrary 1–10 分制的平均值,最多取 200 部有评分影片;ratedTitles 说明有多少评分参与。
studioCount、topGenres 和 topStudios 统计去重后的影片,不跨来源求和,都不大于 works。三上悠亜:works 1127,studioCount 8,最多类型 "Big Tits" 765 部,最多工作室 "S1 NO.1 STYLE" 991 部。
cadenceDays 是两次连续发行间最长的间隔天数,不是平均值。starPower 综合作品量、评分、最近 90 天产量、工作室分布、发行时长和最近发行新鲜度,为 0–1;starPower100 是同一数字的 0–100 刻度。
未命中:404。
curl -s 'https://api.javinfo.dev/analytics/idols/stats?q=nobody-zzzz-qq' \
-H "x-javinfo-key: jvi_your_key_here"{
"defined": false,
"code": "NOT_FOUND",
"status": 404,
"message": "idol not found"
}费用:每 1,000 次调用 $0.60。状态码:200、400、401、402、404、429。
参考:idolStats。
K 线 — /analytics/idols/ohlc
演员生涯的蜡烛图:累计发行数,按天、周或月分桶。收盘走平表示该桶没有发行;上升表示有新作品。
不是价格,背后也没有播放量历史。唯一能长期观察的是发行时间,K 线画的就是它。
| 参数 | 类型 | 默认值 | 范围 |
|---|---|---|---|
q | string | 必填 | 来自 /idols 的 id 或 slug |
bucket | "day" | "week" | "month" | "week" | |
limit | integer | 500 | 10–2000 |
limit 是最多 K 线数。桶数超过时,保留最新的,丢掉最旧的。limit 小于 10,或 bucket 不是 day、week、month,都是 400。
curl -s 'https://api.javinfo.dev/analytics/idols/ohlc?q=yua-mikami&bucket=month&limit=12' \
-H "x-javinfo-key: jvi_your_key_here"响应 200。十二根月 K 线覆盖最近一年,更旧的丢掉(K 线和 ema 已裁剪):
{
"id": "yua-mikami",
"metric": "cumulative_releases",
"source": "catalogue",
"bucket": "month",
"candles": [
{
"t": "2025-12-01",
"o": 1075,
"h": 1083,
"l": 1075,
"c": 1083,
"v": 9
},
{
"t": "2026-01-01",
"o": 1084,
"h": 1091,
"l": 1084,
"c": 1091,
"v": 8
},
"…",
{
"t": "2026-11-01",
"o": 1125,
"h": 1127,
"l": 1125,
"c": 1127,
"v": 3
}
],
"changePct": 4.84,
"ema": [
1083,
1085,
"…"
],
"totalReleases": 1127,
"truncated": true,
"asOf": "2026-11-08T07:34:17.117Z"
}K 线字段:
| 字段 | 含义 |
|---|---|
t | 桶的起点,YYYY-MM-DD。周从周一开始,月从 1 号开始。 |
o | 桶内第一次发行时的累计发行数。 |
h | 桶内达到的最高累计数。 |
l | 桶内的最低累计数。 |
c | 桶内最后一次发行时的累计数。 |
v | 桶内的观察次数。 |
目录序列中,一次观察就是一条发行记录,v 是桶内发行数。装两次发行的桶在第一次之后开盘、第二次之后收盘,并报告 v: 2。
metric 和 source 说明拿到哪个序列。每日快照任务记录至少两天后,端点切换到 metric: "star_power" 和 source: "snapshots":K 线测量明星分数变化,按 1,000 缩放,totalReleases: 0,truncated: false。
changePct 是从第一个开盘到最后一个收盘的变化,限定在拿回的 K 线内。ema 是收盘价的 7 周期指数移动平均,长度与 candles 相同。
truncated: true 表示为适配 limit 丢掉更旧的 K 线;最新的始终在。totalReleases 是完整生涯计数,与 limit 无关。调高 limit 可拿到整条曲线,最多 2000 根。
费用:每 1,000 次调用 $0.60。状态码:200、400、401、402、404、429。
参考:idolOhlc。
时间线 — /analytics/idols/timeline
每月发行数,加上资料页的四个值:出道、最近发行、最高产月份和最长间隔。全部来自发行日期。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
q | string | 是 | 来自 /idols 的 id 或 slug |
curl -s 'https://api.javinfo.dev/analytics/idols/timeline?q=yua-mikami' \
-H "x-javinfo-key: jvi_your_key_here"响应 200(months 已裁剪):
{
"id": "yua-mikami",
"debut": "2015-06-01",
"latest": "2026-11-24",
"peakMonth": "2023-07",
"longestGapDays": 115,
"months": [
{ "month": "2015-06", "releases": 2 },
{ "month": "2015-09", "releases": 2 }
],
"truncated": false,
"asOf": "2026-11-06T18:31:34.750Z"
}months 升序,YYYY-MM,只列有发行的月。peakMonth 是发行最多的月份;longestGapDays 是连续发行日期间的最大间隔。
latest 来自独立最新优先查询,truncated 为 true 时仍准确。该标志表示升序分页碰到 10,000 行;月度列表停在新发行之前。
费用:每 1,000 次调用 $0.60。状态码:200、400、401、402、404、429。
参考:idolTimeline。
合作演员 — /analytics/idols/costars
合作对象,按共同影片数排名。一次分面查询生成列表;本人不出现在结果里。
| 参数 | 类型 | 默认值 | 范围 |
|---|---|---|---|
q | string | 必填 | 来自 /idols 的 id 或 slug |
num | integer | 15 | 1–50 |
curl -s 'https://api.javinfo.dev/analytics/idols/costars?q=yua-mikami&num=3' \
-H "x-javinfo-key: jvi_your_key_here"响应 200(results 已裁剪):
{
"id": "yua-mikami",
"count": 3,
"results": [
{ "name": "Aika Yumeno", "sharedTitles": 771 },
{ "name": "Miharu Usa", "sharedTitles": 675 }
],
"asOf": "2026-11-06T18:31:34.119Z"
}sharedTitles 统计两个名字都出现的影片数。
费用:num=15 时每 1,000 次调用 $0.90。num 不超过 10 时 $0.60;之后等比上涨,num=50 时 $3.00。状态码:200、400、401、402、404、429。参考:idolCostars。
排行榜 — /analytics/leaderboard
在窗口内按三种指标之一排名。
metric | 排名依据 | score |
|---|---|---|
releases | 窗口内的作品量 | 她的发行数 ÷ 榜首的发行数,0–1 |
rating | 调整后的 javlibrary 平均分 | 0–1 |
momentum | 本窗口对比上一个窗口 | 比值 ÷ 3,上限 1 |
| 参数 | 类型 | 默认值 | 范围 |
|---|---|---|---|
range | integer | 90 | 7–365,天数 |
metric | "releases" | "rating" | "momentum" | "releases" | |
num | integer | 20 | 1–100 |
curl -s 'https://api.javinfo.dev/analytics/leaderboard?range=30&metric=releases&num=3' \
-H "x-javinfo-key: jvi_your_key_here"响应 200(results 已裁剪):
{
"metric": "releases",
"range": 30,
"count": 3,
"truncated": false,
"results": [
{
"name": "Yui Hatano",
"nameJa": null,
"releases": 67,
"avgRating": null,
"studios": 10,
"lastRelease": "2026-11-06",
"score": 1
},
{
"name": "Yui Tenma",
"nameJa": null,
"releases": 55,
"avgRating": null,
"studios": 4,
"lastRelease": "2026-11-06",
"score": 0.821
}
],
"asOf": "2026-11-06T18:31:35.824Z"
}releases 是窗口内的精确分面计数。studios 和 lastRelease 来自最新 1,000 条命中,range 很长时可能偏少。
avgRating 是 javlibrary 对窗口内有评分影片的 1–10 平均分;没有则为 null。rating 指标只排至少有一部评分影片的演员,并按评分数量把平均分拉向 3.5/5 先验,所以单个 10/10 拿不到榜首。
momentum 用本窗口发行数除以上一个等长窗口。上一个窗口没有发行时比值为 2,得分 0.667。并列按发行数排序。
name 是分面键:索引有拉丁名时用拉丁名,否则用日文名。nameJa 目前始终为 null。
truncated: true 表示姓名分面碰到值上限:计数只覆盖头部姓名。
枚举值不对是 400,出错的参数在 data.issues[].path 里:
curl -s 'https://api.javinfo.dev/analytics/leaderboard?metric=views' \
-H "x-javinfo-key: jvi_your_key_here"{
"defined": false,
"code": "BAD_REQUEST",
"status": 400,
"message": "Input validation failed",
"data": {
"issues": [
{
"code": "invalid_value",
"values": ["releases", "rating", "momentum"],
"path": ["metric"],
"message": "Invalid option: expected one of \"releases\"|\"rating\"|\"momentum\""
}
]
}
}同样的形状覆盖其他参数:超出范围的 range、大于 100 的 num、错误的 bucket。issues 指出参数。
费用:num=20 时每 1,000 次调用 $1.20。num 不超过 10 时 $0.60;之后等比上涨,num=100 时 $6.00。状态码:200、400、401、402、429。参考:leaderboard。
市场 — /analytics/market
DMM + FANZA 目录每周发行量,以及窗口内增长和下降的类型。
| 参数 | 类型 | 默认值 | 范围 |
|---|---|---|---|
weeks | integer | 12 | 2–52 |
movers | integer | 10 | 1–50 |
curl -s 'https://api.javinfo.dev/analytics/market?weeks=4&movers=3' \
-H "x-javinfo-key: jvi_your_key_here"响应 200(已裁剪):
{
"weeks": 4,
"volume": [
{ "week": "2026-10-09", "releases": 1319 },
{ "week": "2026-10-16", "releases": 1421 }
],
"totalReleases": 5740,
"changePct": 1,
"truncated": false,
"genres": {
"gainers": [
{ "genre": "Knee-High Socks", "changePct": 700, "current": 8, "previous": 1 },
{ "genre": "Widow", "changePct": 700, "current": 16, "previous": 2 }
],
"losers": [
{ "genre": "Female Soldier", "changePct": -100, "current": 0, "previous": 19 },
{ "genre": "Fisting", "changePct": -100, "current": 0, "previous": 5 }
]
},
"asOf": "2026-11-06T18:31:37.397Z"
}volume 每个 7 天窗口一条,最旧在前;week 是起始日期。这是从今天回退的滚动窗口,不是自然周。
weeks 决定窗口数;totalReleases 是总和。changePct 比较最新和最旧窗口,保留一位小数。
genres 比较最近 floor(weeks ÷ 2) 周与之前等长的时间段。两段发行都少于 5 部的类型跳过,避免噪音。changePct 是 current 对 previous;前半段没有发行时显示 100。gainers 和 losers 截到 movers。
truncated: true 表示类型分面碰到值上限:列表只覆盖头部类型。
费用:每 1,000 次调用 $0.60。weeks 和 movers 不改变价格。状态码:200、400、401、402、429。参考:market。
费用
| 端点 | 默认页大小 | 每 1,000 次调用 |
|---|---|---|
/analytics/idols/stats | $0.60 | |
/analytics/idols/ohlc | limit=500 | $0.60 |
/analytics/idols/timeline | $0.60 | |
/analytics/idols/costars | num=15 | $0.90 |
/analytics/leaderboard | num=20 | $1.20 |
/analytics/market | $0.60 |
其他端点规模不影响价格:limit、weeks 和 movers 免费调大。
只有全新 200 收费;缓存命中、错误和降级答案免费。响应缓存 30 到 60 分钟,窗口内重复调用就是命中。见速率限制与计费。
常见错误
401 没有密钥。 网关放行;处理器拒绝:
curl -s 'https://api.javinfo.dev/analytics/leaderboard'{
"defined": false,
"code": "UNAUTHORIZED",
"status": 401,
"message": "Unauthorized"
}401 密钥不对。 更早被网关拒绝;响应体更短:
curl -s 'https://api.javinfo.dev/analytics/leaderboard' \
-H "x-javinfo-key: jvi_not_a_real_key"{ "error": "invalid api key" }同一状态,两种响应体。按状态码分支,不按 code。
402 额度不足。 不扣费。Retry-After: 3600 只是建议;充值后立刻恢复:
{
"defined": false,
"code": "PAYMENT_REQUIRED",
"status": 402,
"message": "insufficient balance"
}429 超过每分钟上限。 在处理器之前生效,Retry-After 以秒为单位:
{ "error": "rate limit exceeded" }上限按账户计算,不按密钥。见速率限制。