Аналитика API
Статистика исполнителей, свечи, партнёры, рейтинг и недельный объём рынка.
/analytics превращает каталог в числа: объём выпуска, рейтинг и разброс студий, партнёров
по съёмкам, рейтинг и недельный объём рынка. Всё считается по датам выпуска, рейтингам
javlibrary и счётчикам фасетов, которые у нас уже есть. Без числа просмотров и выдуманных
серий.
Шесть эндпоинтов GET с ключом. От $0.60 за 1000 вызовов; рейтинг и граф партнёров дорожают
с num.
id исполнительницы
Четыре эндпоинта принимают q: stats, свечи, хронология и партнёры. q — id из
/idols: slug javdatabase вроде yua-mikami или dmm-1005467 только из DMM.
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 | да | id или slug из /idols |
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. 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"
}Стоимость: $0.60 за 1000 вызовов. Коды: 200, 400, 401, 402, 404, 429.
Справочник: idolStats.
Свечи — /analytics/idols/ohlc
Свечи карьеры: накопительное число релизов по дням, неделям или месяцам. Плоское закрытие — релизов в интервале не было; растущее — новый выпуск.
Не цена, и истории просмотров за этим нет. Наблюдать можно только когда выходили релизы; это свечи и рисуют.
| Параметр | Тип | По умолчанию | Диапазон |
|---|---|---|---|
q | string | обязательно | id или slug из /idols |
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. Двенадцать месячных свечей покрывают год, более старые отбрасываются (свечи и
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": свечи
измеряют звёздный балл во времени, умноженный на 1000, с totalReleases: 0 и
truncated: false.
changePct — изменение от первого открытия до последнего закрытия, по полученным свечам.
ema — 7-периодное экспоненциальное скользящее среднее закрытий, той же длины, что
candles.
truncated: true значит, что старые свечи отброшены ради limit; новые есть всегда.
totalReleases — полное число за карьеру, каким бы ни был limit. Поднимите limit до 2000
свечей ради всей кривой.
Стоимость: $0.60 за 1000 вызовов. Коды: 200, 400, 401, 402, 404, 429.
Справочник: idolOhlc.
Хронология — /analytics/idols/timeline
Релизы по месяцам и четыре значения профиля: дебют, последний релиз, пиковый месяц, самый длинный перерыв. Всё из дат выпуска.
| Параметр | Тип | Обязательно | Примечания |
|---|---|---|---|
q | string | да | id или slug из /idols |
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 строк; тогда список
обрывается до новейших релизов.
Стоимость: $0.60 за 1000 вызовов. Коды: 200, 400, 401, 402, 404, 429.
Справочник: idolTimeline.
Партнёры — /analytics/idols/costars
Партнёры по общим тайтлам. Один фасетный запрос по фильмографии; сама исполнительница исключена.
| Параметр | Тип | По умолчанию | Диапазон |
|---|---|---|---|
q | string | обязательно | id или slug из /idols |
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 считает тайтлы с обоими именами в каталоге.
Стоимость: $0.90 за 1000 вызовов при num=15. num до 10 стоит $0.60; выше — до $3.00 при
num=50. Коды: 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 берутся из 1000 новейших
попаданий, поэтому на длинном range могут недосчитывать.
avgRating — среднее javlibrary 1–10 по оценённым тайтлам окна, или null, если их нет.
Метрика rating ранжирует только исполнительниц хотя бы с одним оценённым тайтлом и тянет
среднее к приору 3.5/5 по их числу; одна 10/10 не выведет на первое место.
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 вне диапазона, num выше 100, неверный
bucket. Issue указывает параметр.
Стоимость: $1.20 за 1000 вызовов при num=20. num до 10 стоит $0.60; выше — до $6.00 при
num=100. Коды: 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 значит, что фасет жанров упёрся в лимит: списки покрывают верхние жанры.
Стоимость: $0.60 за 1000 вызовов. weeks и movers цену не меняют. Коды:
200, 400, 401, 402, 429. Справочник: market.
Стоимость
| Эндпоинт | Страница по умолчанию | За 1000 вызовов |
|---|---|---|
/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" }На аккаунт, не на ключ. См. лимиты.