Analytique API
Statistiques d'interprètes, chandeliers, partenaires, classement et volume hebdomadaire du marché.
/analytics transforme le catalogue en chiffres : production, note et répartition par studio,
partenaires, classement et volume hebdomadaire du marché. Tout vient des dates de sortie, des
notes javlibrary et des facettes déjà là. Ni compteurs de vues ni séries inventées.
Six endpoints GET avec clé. À partir de $0.60 pour 1 000 appels ; classement et graphe des
partenaires coûtent plus cher avec num.
Id de l'interprète
Quatre endpoints prennent q : statistiques, chandeliers, chronologie et partenaires. q est
un id de /idols : un slug javdatabase comme yua-mikami, ou un dmm-1005467
connu de DMM seul.
q lit un document par id ; ce n'est pas une recherche de texte. Un nom japonais comme 三上悠亜
renvoie 404 : il ne correspond ni aux noms ni aux alias. Cherchez dans /idols, puis passez
l'id :
curl -s -X POST https://api.javinfo.dev/idols \
-H "x-javinfo-key: $KEY" -H 'content-type: application/json' \
-d '{ "q": "yua" }'Statistiques — /analytics/idols/stats
La fiche de profil en un appel : production, période, note, genres et studios, score de star de 0 à 1.
| Paramètre | Type | Obligatoire | Notes |
|---|---|---|---|
q | string | oui | id ou slug de /idols |
curl -s 'https://api.javinfo.dev/analytics/idols/stats?q=yua-mikami' \
-H "x-javinfo-key: jvi_your_key_here"Réponse 200 (tableaux tronqués) :
{
"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 est le plus grand comptage d'une seule source, pas une somme. Le même titre figure dans
fanza, javdatabase, javlibrary, javbus et missav ; les additionner le gonflerait environ quatre
fois. worksBySource montre le chevauchement : des comptages par source qui ne donnent
pas works.
avgRating est la moyenne javlibrary de 1 à 10, sur jusqu'à 200 titres notés ;
ratedTitles indique combien de notes y sont entrées.
studioCount, topGenres et topStudios comptent des titres dédupliqués, jamais additionnés
entre sources ; aucun comptage ne dépasse works. Yua Mikami : works 1127, studioCount 8,
genre principal « Big Tits » 765 titres, studio principal « S1 NO.1 STYLE » 991.
cadenceDays est le plus long intervalle en jours entre sorties consécutives, pas une moyenne.
starPower combine volume, note, production des 90 derniers jours, répartition par studio,
ancienneté et fraîcheur de la dernière sortie sur 0 à 1 ; starPower100 donne le même nombre
sur 0 à 100.
Un échec renvoie 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"
}Coût : $0.60 pour 1 000 appels. Codes : 200, 400, 401, 402, 404, 429.
Référence : idolStats.
Chandeliers — /analytics/idols/ohlc
Chandeliers de la carrière d'un interprète : nombre cumulé de sorties, groupé par jour, semaine ou mois. Une clôture plate signifie aucune sortie dans le groupe ; une clôture en hausse, une production nouvelle.
Pas un prix, aucun historique de vues. Le seul observable est la date des sorties ; c'est ce que dessinent les chandeliers.
| Paramètre | Type | Défaut | Plage |
|---|---|---|---|
q | string | obligatoire | id ou slug de /idols |
bucket | "day" | "week" | "month" | "week" | |
limit | integer | 500 | 10–2000 |
limit est le nombre maximal de chandeliers. Si la carrière compte plus de groupes, les plus
récents sont conservés, les anciens écartés. Un limit inférieur à 10 ou un bucket
autre que day, week ou month est 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"Réponse 200. Douze chandeliers mensuels couvrent la dernière année ; les plus anciens sont
écartés (chandeliers et ema tronqués) :
{
"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"
}Champs du chandelier :
| Champ | Signification |
|---|---|
t | Début du groupe, YYYY-MM-DD. Une semaine commence le lundi, un mois le 1er. |
o | Nombre cumulé de sorties à la première sortie du groupe. |
h | Plus haut comptage cumulé atteint dans le groupe. |
l | Plus bas comptage cumulé dans le groupe. |
c | Comptage cumulé à la dernière sortie du groupe. |
v | Nombre d'observations dans le groupe. |
Pour la série du catalogue, une observation est une ligne de sortie ; v compte donc les
sorties du groupe. Un groupe de deux ouvre après la première, clôture après la seconde,
indique v: 2.
metric et source indiquent la série obtenue. Dès que la tâche d'instantanés a au moins deux
jours enregistrés, l'endpoint passe à metric: "star_power" et source: "snapshots" : les
chandeliers mesurent le score de star dans le temps, multiplié par 1 000, avec
totalReleases: 0 et truncated: false.
changePct est la variation entre la première ouverture et la dernière clôture, sur les
chandeliers reçus. ema est une moyenne mobile exponentielle sur 7 périodes des clôtures, de
même longueur que candles.
truncated: true signifie que des chandeliers anciens ont été écartés pour tenir dans limit ;
les récents restent. totalReleases est le comptage complet de la carrière, quel
que soit limit. Augmentez limit jusqu'à 2000 chandeliers pour la courbe entière.
Coût : $0.60 pour 1 000 appels. Codes : 200, 400, 401, 402, 404, 429.
Référence : idolOhlc.
Chronologie — /analytics/idols/timeline
Comptages mensuels et les quatre valeurs d'une page de profil : début, dernière sortie, mois record, plus long intervalle. Tout vient des dates de sortie.
| Paramètre | Type | Obligatoire | Notes |
|---|---|---|---|
q | string | oui | id ou slug de /idols |
curl -s 'https://api.javinfo.dev/analytics/idols/timeline?q=yua-mikami' \
-H "x-javinfo-key: jvi_your_key_here"Réponse 200 (months tronqué) :
{
"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 est ascendant, YYYY-MM, et ne liste que les mois avec une sortie. peakMonth est le
mois le plus chargé ; longestGapDays, le plus grand intervalle entre deux dates consécutives.
latest vient de sa propre requête du plus récent au plus ancien, donc reste exact même quand
truncated vaut true. Ce drapeau signifie que la page ascendante a atteint 10 000 lignes ; la
liste mensuelle s'arrête alors avant les sorties les plus récentes.
Coût : $0.60 pour 1 000 appels. Codes : 200, 400, 401, 402, 404, 429.
Référence : idolTimeline.
Partenaires — /analytics/idols/costars
Collaborateurs classés par titres partagés. Une requête de facettes sur la filmographie ; l'interprète en est exclu.
| Paramètre | Type | Défaut | Plage |
|---|---|---|---|
q | string | obligatoire | id ou 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"Réponse 200 (results tronqué) :
{
"id": "yua-mikami",
"count": 3,
"results": [
{ "name": "Aika Yumeno", "sharedTitles": 771 },
{ "name": "Miharu Usa", "sharedTitles": 675 }
],
"asOf": "2026-11-06T18:31:34.119Z"
}sharedTitles compte les titres où les deux noms figurent au catalogue.
Coût : $0.90 pour 1 000 appels avec num=15. Un num jusqu'à 10 coûte $0.60 ; au-delà,
jusqu'à $3.00 avec num=50. Codes : 200, 400, 401, 402, 404, 429. Référence :
idolCostars.
Classement — /analytics/leaderboard
Classe les interprètes sur une fenêtre selon trois métriques.
metric | Classe par | score |
|---|---|---|
releases | Production dans la fenêtre | Ses sorties ÷ celles du leader, 0–1 |
rating | Moyenne javlibrary ajustée | 0–1 |
momentum | La fenêtre face à la précédente | Ratio ÷ 3, plafonné à 1 |
| Paramètre | Type | Défaut | Plage |
|---|---|---|---|
range | integer | 90 | 7–365, un nombre de jours |
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"Réponse 200 (results tronqué) :
{
"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 est un comptage de facettes exact. studios et lastRelease viennent des 1 000
résultats les plus récents, donc peuvent sous-compter sur un range long.
avgRating est la moyenne javlibrary 1 à 10 des titres notés de la fenêtre, ou null si aucun. rating ne classe que les interprètes ayant au moins un titre noté et tire la
moyenne vers un a priori de 3.5/5 selon leur nombre ; un 10/10 ne prend pas la première place.
momentum divise les sorties de cette fenêtre par celles de la précédente, de même longueur.
Sans sortie avant, un ratio de 2, soit 0.667. Les égalités se départagent au nombre de sorties.
name est la clé de facette : nom latin quand l'index en a un, nom japonais sinon. nameJa est
toujours null.
truncated: true signifie que la facette de noms a atteint le plafond de l'index ; les comptages
couvrent les principaux noms, pas tous.
Une valeur d'enum invalide est un 400, le paramètre fautif dans 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 même forme couvre les autres paramètres : range hors plage, num au-dessus de 100,
bucket invalide. L'issue nomme le paramètre.
Coût : $1.20 pour 1 000 appels avec num=20. Un num jusqu'à 10 coûte $0.60 ; au-delà,
jusqu'à $6.00 avec num=100. Codes : 200, 400, 401, 402, 429. Référence :
leaderboard.
Marché — /analytics/market
Volume hebdomadaire de sorties du catalogue DMM + FANZA, plus les genres qui gagnent et perdent sur la fenêtre.
| Paramètre | Type | Défaut | Plage |
|---|---|---|---|
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"Réponse 200 (tronquée) :
{
"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 a une entrée par fenêtre de 7 jours, de la plus ancienne à la plus récente ; week est
la date de début. Fenêtres glissantes depuis aujourd'hui, pas semaines calendaires.
weeks fixe le nombre de fenêtres ; totalReleases est leur somme. changePct compare la plus
récente à la plus ancienne, avec une décimale.
genres compare les floor(weeks ÷ 2) semaines les plus récentes à l'intervalle précédent. Les
genres avec moins de 5 sorties dans les deux sont ignorés, pour éviter le bruit. changePct
compare current à previous ; sans sortie dans la moitié précédente, il affiche 100.
gainers et losers sont limités à movers.
truncated: true signifie que la facette de genres a atteint son plafond : les listes ne
couvrent que les principaux genres.
Coût : $0.60 pour 1 000 appels. weeks et movers ne changent pas le prix. Codes : 200,
400, 401, 402, 429. Référence : market.
Coût
| Endpoint | Page par défaut | Pour 1 000 appels |
|---|---|---|
/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 |
La taille sur les autres endpoints n'affecte pas le prix : limit, weeks et movers gratuits à augmenter.
Seul un 200 frais est facturé ; cache, erreurs et réponses dégradées sont gratuits. Les réponses sont en cache 30 à 60 minutes ; un appel répété dans cette fenêtre est
un hit. Voir limites de débit et facturation.
Erreurs courantes
401 sans clé. Le portail la laisse passer ; le gestionnaire la refuse :
curl -s 'https://api.javinfo.dev/analytics/leaderboard'{
"defined": false,
"code": "UNAUTHORIZED",
"status": 401,
"message": "Unauthorized"
}401 mauvaise clé. Rejetée plus tôt par le portail ; corps plus court :
curl -s 'https://api.javinfo.dev/analytics/leaderboard' \
-H "x-javinfo-key: jvi_not_a_real_key"{ "error": "invalid api key" }Même statut, deux corps. Branchez sur le code d'état, pas code.
402 crédit insuffisant. Rien n'est facturé. Retry-After: 3600 est indicatif ; une
recharge débloque immédiatement :
{
"defined": false,
"code": "PAYMENT_REQUIRED",
"status": 402,
"message": "insufficient balance"
}429 au-dessus du plafond par minute. Appliqué avant le gestionnaire ; Retry-After en
secondes :
{ "error": "rate limit exceeded" }Plafond par compte, pas par clé. Voir limites de débit.