Перейти к содержимому
javinfo

Аналитика 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. Для шапки страницы или ранжирования шортлиста.

ПараметрТипОбязательноПримечания
qstringда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

Свечи карьеры: накопительное число релизов по дням, неделям или месяцам. Плоское закрытие — релизов в интервале не было; растущее — новый выпуск.

Не цена, и истории просмотров за этим нет. Наблюдать можно только когда выходили релизы; это свечи и рисуют.

ПараметрТипПо умолчаниюДиапазон
qstringобязательноid или slug из /idols
bucket"day" | "week" | "month""week"
limitinteger50010–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

Релизы по месяцам и четыре значения профиля: дебют, последний релиз, пиковый месяц, самый длинный перерыв. Всё из дат выпуска.

ПараметрТипОбязательноПримечания
qstringда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

Партнёры по общим тайтлам. Один фасетный запрос по фильмографии; сама исполнительница исключена.

ПараметрТипПо умолчаниюДиапазон
qstringобязательноid или slug из /idols
numinteger151–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Скорректированное среднее javlibrary0–1
momentumОкно против предыдущегоОтношение ÷ 3, с потолком 1
ПараметрТипПо умолчаниюДиапазон
rangeinteger907–365, число дней
metric"releases" | "rating" | "momentum""releases"
numinteger201–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 и жанры, которые растут и падают за окно. Для графика на главной или панели «что движется».

ПараметрТипПо умолчаниюДиапазон
weeksinteger122–52
moversinteger101–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/ohlclimit=500$0.60
/analytics/idols/timeline$0.60
/analytics/idols/costarsnum=15$0.90
/analytics/leaderboardnum=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" }

На аккаунт, не на ключ. См. лимиты.

На этой странице