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ámetro | Tipo | Obligatorio | Notas |
|---|---|---|---|
q | string | sí | 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ámetro | Tipo | Predeterminado | Rango |
|---|---|---|---|
q | string | obligatorio | id o slug de /idols |
bucket | "day" | "week" | "month" | "week" | |
limit | integer | 500 | 10–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:
| Campo | Significado |
|---|---|
t | Inicio del periodo, YYYY-MM-DD. Una semana empieza en lunes y un mes el día 1. |
o | Recuento acumulado de lanzamientos en el primer lanzamiento del periodo. |
h | Mayor recuento acumulado alcanzado dentro del periodo. |
l | Menor recuento acumulado dentro del periodo. |
c | Recuento acumulado en el último lanzamiento del periodo. |
v | Nú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ámetro | Tipo | Obligatorio | Notas |
|---|---|---|---|
q | string | sí | 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ámetro | Tipo | Predeterminado | Rango |
|---|---|---|---|
q | string | obligatorio | id o slug de /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"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.
metric | Ordena por | score |
|---|---|---|
releases | Producción en la ventana | Sus lanzamientos ÷ los del líder, 0–1 |
rating | Media ajustada de javlibrary | 0–1 |
momentum | La ventana frente a la anterior | Cociente ÷ 3, limitado a 1 |
| Parámetro | Tipo | Predeterminado | Rango |
|---|---|---|---|
range | integer | 90 | 7–365, un número de días |
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"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ámetro | Tipo | Predeterminado | Rango |
|---|---|---|---|
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"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
| Endpoint | Página predeterminada | Por 1000 llamadas |
|---|---|---|
/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 |
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.