Résolution API
Normalisez n'importe quelle écriture d'un code et obtenez variantes, sources, carte, provenance et flux.
/resolve dit ce qu'est un code et ce que dit chaque source. /movie renvoie le
premier fournisseur qui répond ; ces endpoints consultent toutes les sources et gardent les
désaccords.
Utilisez-les pour normaliser abp002, ABP-002 ou ABP-2, lister toutes les sources d'un
titre, ou obtenir une carte de partage ou une carte des flux en un appel.
| Endpoint | Renvoie | Pour 1 000 appels |
|---|---|---|
GET /resolve | Code canonique, variantes, sources, lien, carte intégrée | $1.20 |
POST /resolve/batch | Trouvé ou introuvable pour jusqu'à 100 codes | $0.40 par groupe entamé de 10 codes uniques |
GET /resolve/compare | Deux titres côte à côte | $0.40 |
GET /resolve/provenance | Source et confiance par champ | $0.40 |
GET /resolve/streams | Disponibilité en flux, extrait et aimant | $0.40 |
GET /resolve
Normalise une écriture en un code canonique et renvoie tout ce qui s'y rattache : variantes,
sources, un lien vers /movie, une carte de 1200×630.
| Paramètre | Type | Obligatoire | Signification |
|---|---|---|---|
q | string | oui | Le code ou l'écriture à résoudre. Au moins 2 caractères. |
format | png, jpg ou svg | non | Encodage de la carte. Par défaut png. |
curl -s 'https://api.javinfo.dev/resolve?q=abp002&format=jpg' \
-H "x-javinfo-key: jvi_your_key_here"{
"input": "abp002",
"code": "ABP-002",
"shareSlug": "85150B9G60S0M",
"found": true,
"variants": ["ABP-002", "ABP002"], // 7 total
"contentIdGuess": "118abp00002",
"sources": ["fanza", "javdatabase"], // 6 total
"link": "/movie?q=ABP-002",
"card": {
"format": "jpg",
"mime": "image/jpeg",
"dataUri": "data:image/jpeg;base64,…"
}
}La carte est intégrée dans card.dataUri, donc la réponse est volumineuse : environ 1,1 MB avec
png (par défaut), 900 KB avec svg, 180 KB avec jpg. Choisissez jpg quand la taille
compte : raster avec perte, environ six fois plus léger que png. La charge base64 est tronquée
dans l'exemple ; dataUri est un URI data: complet pour un <img src>.
| Champ | Signification |
|---|---|
input | La chaîne envoyée, inchangée. |
code | Le code canonique. |
variants | Chaque écriture qui désigne le même titre, de la plus canonique à la moins canonique. |
sources | Ids publics des sources qui listent le titre. |
contentIdGuess | Id de contenu DMM quand l'index de la vitrine l'a, sinon null. |
link | Chemin d'API pour le même titre, /movie?q=<code>. Il est relatif à https://api.javinfo.dev et demande votre en-tête x-javinfo-key. |
card | La carte 1200×630 sous forme d'URI de données, ou null. |
found | true sur un 200. Un échec est un 404. |
shareSlug | Slug avec somme de contrôle pour le code canonique. |
La carte affiche le code, le titre anglais (raccourci ou le code s'il n'y en a pas), jusqu'à
trois noms et le studio, jusqu'à quatre puces de genre, puis la note, la
durée, la date de sortie et les magnets quand ils sont connus. Un badge STREAMABLE signale un
stream. La jaquette est à droite, sur une copie floutée. null si le rendu est
indisponible : traitez-la comme facultative et gardez les métadonnées.
Un code sans correspondance est un 404, pas une carte vide :
{
"defined": false,
"code": "NOT_FOUND",
"status": 404,
"message": "no title found for \"ZZZZ-99999\""
}POST /resolve/batch
Vérifie jusqu'à 100 codes en une requête : nettoyez une liste utilisateur ou comparez votre catalogue sans 100 appels séquentiels.
| Champ du corps | Type | Obligatoire | Signification |
|---|---|---|---|
codes | tableau de chaînes | oui | De 1 à 100 chaînes non vides. |
curl -s -X POST 'https://api.javinfo.dev/resolve/batch' \
-H "x-javinfo-key: jvi_your_key_here" \
-H 'content-type: application/json' \
-d '{"codes":["ABP-002","beb001","ZZZZ-99999"]}'{
"count": 3,
"found": 2,
"results": [
{ "input": "ABP-002", "code": "ABP-002", "found": true },
{ "input": "beb001", "code": "BEB-001", "found": true },
{ "input": "ZZZZ-99999", "code": "ZZZZ-99999", "found": false }
]
}Un code introuvable est found: false dans un 200 normal, pas un 404 ; code contient la
meilleure estimation canonique. count compte les codes après déduplication ; found, ceux qui
ont abouti.
Les codes sont élagués et dédupliqués avant comptage. "ABP-002" et " ABP-002 " coûtent un
emplacement et n'apparaissent qu'une fois dans results. Après élagage la correspondance est
exacte : abp-002 et ABP-002 sont deux emplacements.
Un tableau codes vide, plus de 100 codes ou une chaîne vide sont un 400 :
{
"defined": false,
"code": "BAD_REQUEST",
"status": 400,
"message": "Input validation failed",
"data": {
"issues": [
{
"origin": "array",
"code": "too_small",
"minimum": 1,
"inclusive": true,
"path": ["codes"],
"message": "Too small: expected array to have >=1 items"
}
]
}
}La même forme couvre les autres échecs de validation, avec une entrée issues différente.
GET /resolve/compare
Deux titres côte à côte : fiche de base de chacun, champs partagés, score de similarité.
| Paramètre | Type | Obligatoire | Signification |
|---|---|---|---|
a | string | oui | Premier code. Au moins 2 caractères. |
b | string | oui | Second code. Au moins 2 caractères. |
curl -s 'https://api.javinfo.dev/resolve/compare?a=SSIS-001&b=ABP-002' \
-H "x-javinfo-key: jvi_your_key_here"{
"a": {
"input": "SSIS-001",
"code": "SSIS-001",
"shareSlug": "AD9MJMSD60R32E",
"found": true,
"variants": [
"SSIS-001",
"SSIS001",
"…"
],
"contentIdGuess": "ssis00001",
"sources": [
"fanza",
"javdatabase",
"javlibrary",
"javbus",
"missav",
"sextb"
],
"link": "/movie?q=SSIS-001"
},
"b": {
"input": "ABP-002",
"code": "ABP-002",
"shareSlug": "85150B9G60S0M",
"found": true,
"variants": [
"ABP-002",
"ABP002",
"…"
],
"contentIdGuess": "118abp00002",
"sources": [
"fanza",
"javdatabase",
"javlibrary",
"javbus",
"missav",
"sextb"
],
"link": "/movie?q=ABP-002"
},
"shared": {
"actresses": [],
"categories": [],
"maker": null
},
"similarity": 0.05
}Chaque côté a la forme /resolve, sans carte. sources liste les sources qui
correspondent ; contentIdGuess est l'id de contenu DMM quand l'index de la vitrine l'a, comme
sur /resolve.
shared contient l'intersection insensible à la casse de actresses et categories ; maker
n'est rempli que si les deux titres portent exactement la même chaîne.
similarity est un mélange de 0 à 1, surtout actrices partagées (0.34) et catégories (0.26),
plus le même maker (0.1), la durée (0.06) et la proximité des dates (0.06), arrondi à 3
décimales. Si un code manque, ce côté est found: false, shared vide, similarity 0.
Jamais 404.
GET /resolve/provenance
Montre la source de chaque champ, la confiance de l'API, et ce que disaient les autres.
| Paramètre | Type | Obligatoire | Signification |
|---|---|---|---|
q | string | oui | Le code ou l'écriture à résoudre. Au moins 2 caractères. |
curl -s 'https://api.javinfo.dev/resolve/provenance?q=ABP-002' \
-H "x-javinfo-key: jvi_your_key_here"{
"code": "ABP-002",
"found": true,
"sources": ["fanza", "javbus"], // 6 total, alphabetical
"fields": {
"title": {
"value": "NEW TOKYO Style 01 - Aikarin",
"source": "fanza",
"confidence": 1,
"candidates": [ // 6 total, trust order
{ "source": "fanza", "value": "NEW TOKYO Style 01 - Aikarin" },
{ "source": "javdatabase", "value": "NEW TOKYO Style 01 - Aikarin" }
]
},
"titleJa": {
"value": "NEW TOKYO流儀 01 あいかりん",
"source": "javlibrary",
"confidence": 0.8,
"candidates": [ // 4 total
{ "source": "javlibrary", "value": "NEW TOKYO流儀 01 あいかりん" },
{ "source": "javbus", "value": "NEW TOKYO流儀 01 あいかりん" }
]
},
"rating": {
"value": 8.1,
"source": "javlibrary",
"confidence": 0.8,
"candidates": [{ "source": "javlibrary", "value": 8.1 }]
}
// releaseDate, runtimeMins, maker, label, series, categories,
// actresses and cover follow the same shape
},
"data": {
"title": "NEW TOKYO Style 01 - Aikarin",
"titleJa": "NEW TOKYO流儀 01 あいかりん",
"rating": 8.1
// the merged value for every field above
}
}fields couvre title, titleJa, releaseDate, runtimeMins, maker, label, series,
categories, actresses, cover et rating.
Les scalaires vont à la source de plus fort poids ; les tableaux comme categories et
actresses sont réunis, pas remplacés. candidates liste les sources ayant proposé une
valeur, de la meilleure à la moins bonne, pour voir un désaccord.
confidence est le poids gagnant divisé par le meilleur poids de la réponse : 1 pour la
source principale, moins pour les autres. Poids, du plus fort au plus faible : vitrines 1,
javdatabase 0.85, javlibrary 0.8, javbus 0.7, missav 0.6, sextb 0.55. sources est
alphabétique ; candidates suit la confiance.
Code inconnu : 404 avec le corps de GET /resolve.
GET /resolve/streams
Indique où regarder ou télécharger un titre : flux HLS, extraits, aimants, sous-titres, taille de galerie.
| Paramètre | Type | Obligatoire | Signification |
|---|---|---|---|
q | string | oui | Le code ou l'écriture à résoudre. Au moins 2 caractères. |
curl -s 'https://api.javinfo.dev/resolve/streams?q=ABP-002' \
-H "x-javinfo-key: jvi_your_key_here"{
"code": "ABP-002",
"found": true,
"playback": "hls",
"availability": {
"magnets": 47,
"stream": true,
"sample": false,
"trailer": false,
"gallery": 0,
"subtitles": [],
"uncensored": false,
"score": 0.7
},
"streams": {
"master": "https://surrit.com/c511196b-b4f8-47bf-a6b0-64ba625fc2a4/playlist.m3u8",
"variants": [
"https://surrit.com/c511196b-b4f8-47bf-a6b0-64ba625fc2a4/1280x720/video.m3u8",
"https://surrit.com/c511196b-b4f8-47bf-a6b0-64ba625fc2a4/842x480/video.m3u8"
]
},
"sampleUrl": null,
"galleryCount": 106,
"sources": ["fanza", "javdatabase"] // 6 total
}playback répond en une ligne : hls avec un flux, sinon magnet avec des aimants, sinon
sample avec seul un extrait ou une bande-annonce, sinon none.
availability ajoute le détail :
| Champ | Signification |
|---|---|
magnets | Infohashes d'aimants distincts sur toutes les sources. |
stream | Un master HLS est présent. |
sample | Un extrait ou une bande-annonce est présent. |
trailer | Une bande-annonce spécifiquement. |
gallery | Nombre d'images de la galerie de la source choisie pour les médias. |
subtitles | Langues de sous-titres détectées dans les métadonnées. Seul zh est étiqueté aujourd'hui. |
uncensored | Les métadonnées marquent le titre comme non censuré. |
score | Complétude de 0 à 1 : aimants 0.35, flux 0.35, extrait 0.15, galerie 0.1, sous-titres 0.05. |
streams vaut {master, variants} avec un flux HLS, sinon null. master est la playlist
pour un lecteur ; variants, les playlists par résolution. sampleUrl est le clip d'extrait
s'il existe ; galleryCount, le plus grand nombre d'images entre les sources.
Code inconnu : 404 avec le corps de GET /resolve.
Coût
Seul un 200 frais est facturé. Cache (X-Cache: HIT), réponses 4xx et réponses dégradées
(X-Degraded) sont gratuits. Resolve, compare et provenance cachent 1 heure ; streams 15
minutes. Batch ne cache rien.
GET /resolve coûte $1.20 pour 1 000 appels parce qu'il génère la carte ; les autres endpoints
resolve, $0.40 pour 1 000 appels.
Batch facture les codes restants après élagage et déduplication, par groupes entamés de 10 :
| Codes uniques | Pour 1 000 appels |
|---|---|
| 1–10 | $0.40 |
| 11–20 | $0.80 |
| 21–30 | $1.20 |
| 100 | $4.00 |
Codes d'état
| Endpoint | Codes |
|---|---|
GET /resolve | 200, 400, 401, 402, 404, 429 |
POST /resolve/batch | 200, 400, 401, 402, 429 |
GET /resolve/compare | 200, 400, 401, 402, 429 |
GET /resolve/provenance | 200, 400, 401, 402, 404, 429 |
GET /resolve/streams | 200, 400, 401, 402, 404, 429 |
Un q de moins de 2 caractères, un format inconnu et les échecs batch ci-dessus sont 400.
Erreurs courantes
Sans clé ou mauvaise clé : 401, corps différents.
# No key
curl -s 'https://api.javinfo.dev/resolve?q=ABP-002'{
"defined": false,
"code": "UNAUTHORIZED",
"status": 401,
"message": "Unauthorized"
}# Bad key
curl -s 'https://api.javinfo.dev/resolve?q=ABP-002' \
-H "x-javinfo-key: jvi_not_a_real_key"{ "error": "invalid api key" }402 signifie que le solde est inférieur au prix de l'appel. Rien n'est facturé ;
Retry-After: 3600 est une indication aux clients automatisés.
{
"defined": false,
"code": "PAYMENT_REQUIRED",
"status": 402,
"message": "insufficient balance"
}429 est le plafond par compte et minute ; Retry-After donne les secondes à attendre.
{ "error": "rate limit exceeded" }Côté compte : Limites de débit et facturation et Erreurs.
Référence générée : /docs/api/discovery/resolve.