Saltar al contenido
javinfo

Analítica API

Estadísticas de intérpretes, velas, compañeros, clasificación y volumen semanal del mercado.

/analytics convierte el catálogo en números: producción, valoración y reparto de estudios, compañeros, clasificación y volumen semanal del mercado. Todo sale de fechas de lanzamiento, valoraciones de javlibrary y recuentos de facetas que ya tenemos. Sin recuentos de visitas ni series inventadas.

Seis endpoints GET con clave, desde $0.60 por 1000 llamadas; clasificación y grafo de compañeros suben con num.

Id del intérprete

Cuatro endpoints toman q: estadísticas, velas, cronología y compañeros. q es un id de /idols: un slug de javdatabase como yua-mikami o un dmm-1005467 solo de DMM.

q lee un documento por id; no busca texto. Un nombre japonés como 三上悠亜 devuelve 404: no coincide con nombres ni alias. Busca antes en /idols y pasa el id:

curl -s -X POST https://api.javinfo.dev/idols \
  -H "x-javinfo-key: $KEY" -H 'content-type: application/json' \
  -d '{ "q": "yua" }'

Estadísticas — /analytics/idols/stats

Ficha de perfil en una llamada: producción, periodo, valoración, reparto de géneros y estudios, estrellato de 0 a 1. Para la cabecera de una página de intérprete o para ordenar una lista corta.

ParámetroTipoObligatorioNotas
qstringsíid o slug de /idols
curl -s 'https://api.javinfo.dev/analytics/idols/stats?q=yua-mikami' \
  -H "x-javinfo-key: jvi_your_key_here"

Respuesta 200 (arrays recortados):

{
  "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 es el mayor recuento de una sola fuente, no una suma. El mismo título está en fanza, javdatabase, javlibrary, javbus y missav; sumar fuentes lo inflaría unas cuatro veces. worksBySource muestra el solapamiento: los recuentos son por fuente y no suman works.

avgRating es la media de javlibrary en su escala de 1 a 10, sobre hasta 200 títulos valorados; ratedTitles indica cuántas valoraciones entraron.

studioCount, topGenres y topStudios cuentan títulos deduplicados, nunca sumados entre fuentes, así que ninguno supera works. Yua Mikami: works 1127, studioCount 8, género principal "Big Tits" con 765 títulos, estudio principal "S1 NO.1 STYLE" con 991.

cadenceDays es el mayor intervalo en días entre lanzamientos consecutivos, no una media. starPower combina volumen, valoración, producción de los últimos 90 días, reparto de estudios, antigüedad y frescura del último lanzamiento en una escala de 0 a 1; starPower100 es el mismo número de 0 a 100.

Fallo: 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"
}

Coste: $0.60 por 1000 llamadas. Códigos: 200, 400, 401, 402, 404, 429. Referencia: idolStats.

Velas — /analytics/idols/ohlc

Velas de la carrera de un intérprete: recuento acumulado de lanzamientos, agrupado por día, semana o mes. Un cierre plano significa que no hubo lanzamientos en ese periodo; uno ascendente, producción nueva.

No es un precio y no hay historial de visitas. Lo único observable es cuándo se publicó, y eso dibujan las velas.

ParámetroTipoPredeterminadoRango
qstringobligatorioid o slug de /idols
bucket"day" | "week" | "month""week"
limitinteger50010–2000

limit es el máximo de velas. Con más periodos, conserva las nuevas y descarta las antiguas. Un limit menor que 10 o un bucket distinto de day, week o month es un 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"

Respuesta 200. Doce velas mensuales cubren el último año; las antiguas se descartan (velas y ema recortados):

{
  "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"
}

Campos de la vela:

CampoSignificado
tInicio del periodo, YYYY-MM-DD. Una semana empieza en lunes y un mes el día 1.
oRecuento acumulado de lanzamientos en el primer lanzamiento del periodo.
hMayor recuento acumulado alcanzado dentro del periodo.
lMenor recuento acumulado dentro del periodo.
cRecuento acumulado en el último lanzamiento del periodo.
vNúmero de observaciones en el periodo.

En la serie del catálogo, una observación es una fila de lanzamiento, así que v cuenta los lanzamientos del periodo. Un periodo con dos abre tras el primero, cierra tras el segundo e informa v: 2.

metric y source indican qué serie obtuviste. Cuando el trabajo de instantáneas tiene al menos dos días registrados, el endpoint cambia a metric: "star_power" y source: "snapshots": las velas miden la puntuación de estrellato, escalada por 1000, con totalReleases: 0 y truncated: false.

changePct es el cambio de la primera apertura al último cierre, sobre las velas recibidas. ema es una media móvil exponencial de 7 periodos de los cierres, de la misma longitud que candles.

truncated: true significa que se descartaron velas antiguas para ajustarse a limit; las nuevas siempre están. totalReleases es el recuento completo de la carrera, sea cual sea limit. Sube limit hasta 2000 velas para la curva entera.

Coste: $0.60 por 1000 llamadas. Códigos: 200, 400, 401, 402, 404, 429. Referencia: idolOhlc.

Cronología — /analytics/idols/timeline

Recuentos mensuales de lanzamientos y los cuatro valores de una página de perfil: debut, último lanzamiento, mes punta y mayor intervalo. Todo de las fechas de lanzamiento.

ParámetroTipoObligatorioNotas
qstringsíid o slug de /idols
curl -s 'https://api.javinfo.dev/analytics/idols/timeline?q=yua-mikami' \
  -H "x-javinfo-key: jvi_your_key_here"

Respuesta 200 (months recortado):

{
  "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 es ascendente, YYYY-MM, y solo lista meses con lanzamientos. peakMonth es el mes con más; longestGapDays, el mayor intervalo entre fechas consecutivas.

latest viene de su propia consulta de más reciente a más antiguo, así que sigue siendo exacto aunque truncated sea true. Ese indicador significa que la página ascendente alcanzó las 10 000 filas; la lista mensual se queda antes de los lanzamientos más nuevos.

Coste: $0.60 por 1000 llamadas. Códigos: 200, 400, 401, 402, 404, 429. Referencia: idolTimeline.

Compañeros — /analytics/idols/costars

Colaboradores ordenados por títulos compartidos. Una consulta de facetas sobre la filmografía construye la lista; el intérprete queda excluido.

ParámetroTipoPredeterminadoRango
qstringobligatorioid o slug de /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"

Respuesta 200 (results recortado):

{
  "id": "yua-mikami",
  "count": 3,
  "results": [
    { "name": "Aika Yumeno", "sharedTitles": 771 },
    { "name": "Miharu Usa", "sharedTitles": 675 }
  ],
  "asOf": "2026-11-06T18:31:34.119Z"
}

sharedTitles cuenta los títulos con ambos nombres en el catálogo.

Coste: $0.90 por 1000 llamadas con num=15. Un num de hasta 10 cuesta $0.60; por encima, escala hasta $3.00 con num=50. Códigos: 200, 400, 401, 402, 404, 429. Referencia: idolCostars.

Clasificación — /analytics/leaderboard

Tres métricas para ordenar intérpretes en una ventana.

metricOrdena porscore
releasesProducción en la ventanaSus lanzamientos ÷ los del líder, 0–1
ratingMedia ajustada de javlibrary0–1
momentumLa ventana frente a la anteriorCociente ÷ 3, limitado a 1
ParámetroTipoPredeterminadoRango
rangeinteger907–365, un número de días
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"

Respuesta 200 (results recortado):

{
  "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 es un recuento de facetas exacto. studios y lastRelease vienen de los 1000 resultados más recientes, así que pueden quedarse cortos con un range largo.

avgRating es la media de javlibrary de 1 a 10 para los títulos valorados, o null si no hay. La métrica rating solo ordena a intérpretes con al menos un título valorado y atrae la media hacia un prior de 3.5/5 según las valoraciones; un único 10/10 no se lleva el primer puesto.

momentum divide los lanzamientos de esta ventana por los de la anterior, de igual longitud. Sin lanzamientos en la anterior, el cociente es 2, que puntúa 0.667. Los empates van por recuento.

name es la clave de la faceta: nombre latino si el índice tiene uno, japonés si no. nameJa siempre es null por ahora.

truncated: true significa que la faceta de nombres alcanzó el tope del índice: los recuentos cubren los nombres principales, no todos.

Un enum incorrecto es 400; el parámetro falla en 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\""
      }
    ]
  }
}

La misma forma cubre los demás parámetros: un range fuera de rango, un num por encima de 100, un bucket incorrecto. El problema nombra el parámetro.

Coste: $1.20 por 1000 llamadas con num=20. Un num de hasta 10 cuesta $0.60; por encima, escala hasta $6.00 con num=100. Códigos: 200, 400, 401, 402, 429. Referencia: leaderboard.

Mercado — /analytics/market

Volumen semanal de lanzamientos del catálogo DMM + FANZA, más los géneros que ganan y pierden en la ventana. Para gráficos de portada o paneles de "qué se mueve".

ParámetroTipoPredeterminadoRango
weeksinteger122–52
moversinteger101–50
curl -s 'https://api.javinfo.dev/analytics/market?weeks=4&movers=3' \
  -H "x-javinfo-key: jvi_your_key_here"

Respuesta 200 (recortada):

{
  "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 tiene una entrada por ventana de 7 días, de la más antigua a la más reciente; week es la fecha de inicio. Son ventanas móviles desde hoy, no semanas naturales.

weeks fija el número de ventanas; totalReleases es su suma. changePct compara la más nueva con la más antigua, con un decimal.

genres compara las floor(weeks ÷ 2) semanas más recientes con el tramo anterior. Los géneros con menos de 5 lanzamientos en ambos tramos se omiten; los pequeños no generan ruido. changePct compara current con previous; sin lanzamientos en la mitad anterior, muestra 100. gainers y losers se recortan a movers.

truncated: true significa que la faceta de géneros alcanzó su tope: las listas solo cubren los principales.

Coste: $0.60 por 1000 llamadas. weeks y movers no cambian el precio. Códigos: 200, 400, 401, 402, 429. Referencia: market.

Coste

EndpointPágina predeterminadaPor 1000 llamadas
/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

El tamaño no afecta al precio en los demás: limit, weeks y movers gratis.

Solo se cobra un 200 nuevo; los aciertos de caché, los errores y las respuestas degradadas son gratis. Las respuestas se guardan entre 30 y 60 minutos; repetir en esa ventana es un acierto. Consulta límites de tasa y facturación.

Errores comunes

401 sin clave. La puerta la deja pasar; el manejador la rechaza:

curl -s 'https://api.javinfo.dev/analytics/leaderboard'
{
  "defined": false,
  "code": "UNAUTHORIZED",
  "status": 401,
  "message": "Unauthorized"
}

401 clave incorrecta. Rechazada antes por la puerta, con un cuerpo más corto:

curl -s 'https://api.javinfo.dev/analytics/leaderboard' \
  -H "x-javinfo-key: jvi_not_a_real_key"
{ "error": "invalid api key" }

Mismo estado, dos cuerpos. Decide por el estado, no por code.

402 crédito insuficiente. No se cobra nada; Retry-After: 3600 es orientativo; una recarga desbloquea al instante:

{
  "defined": false,
  "code": "PAYMENT_REQUIRED",
  "status": 402,
  "message": "insufficient balance"
}

429 por encima del tope por minuto. Se aplica antes del manejador; Retry-After en segundos:

{ "error": "rate limit exceeded" }

Por cuenta, no por clave. Consulta límites de tasa.

En esta página