분석 API
출연자 통계, 캔들, 공동 출연, 리더보드, 주간 시장 물량.
/analytics는 카탈로그를 숫자로 바꿉니다: 산출량, 평점, 스튜디오 분포, 공동 출연,
리더보드, 주간 출시 물량. 출시일, javlibrary 평점, 보유 패싯 수에서 계산하며 조회수는 읽지
않고 시리즈도 만들지 않습니다.
여섯 개의 GET 엔드포인트이며 키가 필요합니다. 1,000회 호출당 $0.60부터, 리더보드와 공동
출연 그래프는 num이 커질수록 비쌉니다.
출연자 id
네 엔드포인트가 q를 받습니다. q는 /idols의 id이며 yua-mikami 같은
javdatabase slug 또는 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
| 매개변수 | 타입 | 필수 | 비고 |
|---|---|---|---|
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은 최대 200개의 평점 있는 작품에 대한 javlibrary 1–10 평균입니다. ratedTitles는
평균에 들어간 평점 수입니다.
studioCount, topGenres, topStudios는 중복을 제거해 세므로 어떤 수치도 works보다
크지 않습니다. Yua Mikami: 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.
캔들 — /analytics/idols/ohlc
출연자 경력의 캔들스틱입니다. 누적 출시 수를 일, 주, 월로 묶습니다. 종가가 평평하면 그 버킷에 출시가 없고, 상승하면 새 산출량이 있습니다.
가격이 아니고 조회수 이력도 없습니다. 시간에 따라 관찰되는 것은 출시 시점뿐입니다.
| 매개변수 | 타입 | 기본값 | 범위 |
|---|---|---|---|
q | string | 필수 | /idols의 id 또는 slug |
bucket | "day" | "week" | "month" | "week" | |
limit | integer | 500 | 10–2000 |
limit은 돌아오는 최대 캔들 수입니다. 버킷이 더 많으면 최신 캔들이 남습니다. 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. 월간 캔들 12개가 지난 1년을 덮어 오래된 캔들은 버려집니다(캔들과 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"
}캔들 필드:
| 필드 | 의미 |
|---|---|
t | 버킷 시작일, YYYY-MM-DD. 주는 월요일에, 월은 1일에 시작합니다. |
o | 버킷의 첫 출시 시점 누적 출시 수. |
h | 버킷 안에서 도달한 최고 누적 수. |
l | 버킷 안의 최저 누적 수. |
c | 버킷의 마지막 출시 시점 누적 수. |
v | 버킷의 관측 수. |
관측 하나는 출시 행 하나이므로 v는 버킷의 출시 수입니다. 출시 두 개가 든 버킷은 v: 2를
보고합니다.
metric과 source는 받은 시리즈입니다. 일일 스냅샷 작업이 이틀 이상 기록하면
metric: "star_power", source: "snapshots"로 전환하고, 캔들은 스타 점수를 1,000배로
확장해 측정하며 totalReleases: 0, truncated: false입니다.
changePct는 받은 캔들에서 첫 시가에서 마지막 종가까지의 변화율입니다. ema는 종가의 7기간
지수 이동 평균이며 candles와 길이가 같습니다.
truncated: true는 limit에 맞추려고 오래된 캔들을 버렸다는 뜻입니다. 최신 캔들은 항상 들어
있습니다. 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 하나로는 1위를 못 합니다.
momentum은 이번 기간 출시 수를 같은 길이의 직전 기간으로 나눕니다. 직전 기간에 출시가 없으면
비율 2로 0.667점입니다. 동점은 출시 수로 가립니다.
name은 패싯 키로, 인덱스의 라틴 이름 또는 일본어 이름입니다. nameJa는 항상 null입니다.
truncated: true는 이름 패싯이 인덱스 값 상한에 도달했다는 뜻으로, 수는 상위 이름만
포괄합니다.
잘못된 enum은 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. 이슈가 해당 매개변수를 지목합니다.
비용: num=20에서 1,000회 호출당 $1.20. num이 10 이하면 $0.60이고, 위로는 올라 num=100에서
$6.00입니다. 상태 코드: 200, 400, 401, 402, 429. 참조:
leaderboard.
시장 — /analytics/market
| 매개변수 | 타입 | 기본값 | 범위 |
|---|---|---|---|
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는 previous 대비 current이며, 직전 절반에 출시가 없으면
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" }상한은 키가 아니라 계정 단위입니다. 속도 제한을 참조하세요.