正規化 API
どんな品番表記も正規化し、変体、ソース、カード、出典、ストリームを1作品分取得します。
/resolve は品番が何か、各ソースが何と言うかを示します。/movie は最初に応答した
プロバイダーを返し、こちらは全ソースを見て食い違いを保持します。
abp002、ABP-002、ABP-2 の正規化、全ソースの列挙、共有カードやストリームマップの
取得に使います。
| エンドポイント | 返すもの | 1,000 コールあたり |
|---|---|---|
GET /resolve | 正規品番、変体、ソース、リンク、インラインカード | $1.20 |
POST /resolve/batch | 最大100品番のヒット状況 | 開始した10個のユニーク品番ごとに $0.40 |
GET /resolve/compare | 2作品の並列比較 | $0.40 |
GET /resolve/provenance | フィールドごとのソースと信頼度 | $0.40 |
GET /resolve/streams | ストリーム、サンプル、マグネットの可用性 | $0.40 |
GET /resolve
どんな表記も1つの正規品番に正規化し、変体、ソース、/movie へのリンク、1200×630 カードを
返します。
| パラメータ | 型 | 必須 | 意味 |
|---|---|---|---|
q | string | はい | 正規化する品番または表記。2文字以上。 |
format | png、jpg、svg のいずれか | いいえ | カードのエンコード。デフォルトは 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,…"
}
}カードは card.dataUri にインライン化され、レスポンスは大きくなります:png(デフォルト)で
約 1.1 MB、svg で約 900 KB、jpg で約 180 KB。サイズ重視なら jpg。非可逆ラスターで
png の約6分の1です。例の base64 は省略。dataUri は完全な data: URI で、<img src> に
そのまま渡せます。
| フィールド | 意味 |
|---|---|
input | 送った文字列。そのまま返ります。 |
code | 正規品番。 |
variants | 同じ作品を指すすべての表記。最も正規のものが先頭。 |
sources | 作品を掲載しているソースの公開 ID。 |
contentIdGuess | ストアフロントインデックスにあれば DMM content ID、なければ null。 |
link | 同じ作品の API パス。/movie?q=<code> の形です。https://api.javinfo.dev からの相対パスで、呼び出しには x-javinfo-key ヘッダーが必要です。 |
card | data URI 形式の 1200×630 カード、または null。 |
found | 200 なら true。ミスは 404。 |
shareSlug | 正規品番に対応するチェックサム付き slug。 |
カードには品番、英語タイトル(短縮、なければ品番)、最大3名の出演者とスタジオ、最大4つの
ジャンルチップ、わかれば評価、再生時間、発売日、マグネット数。ストリームがあれば
STREAMABLE バッジ。右にジャケット、背景はカバーのぼかし。レンダリング不可なら null:
オプション扱いで、メタデータは保持してください。
一致しない品番は 404 で、空のカードではありません:
{
"defined": false,
"code": "NOT_FOUND",
"status": 404,
"message": "no title found for \"ZZZZ-99999\""
}POST /resolve/batch
1回のリクエストで最大100品番を確認します。
| ボディフィールド | 型 | 必須 | 意味 |
|---|---|---|---|
codes | 文字列配列 | はい | 1〜100個の空でない文字列。 |
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 }
]
}見つからない品番は通常の 200 内で found: false、404 ではありません。ミスでは code に
最善の正規候補。count は重複排除後の品番数、found はヒット数です。
品番は数える前にトリム・重複排除します。"ABP-002" と " ABP-002 " は1枠で、results に
1回だけ。トリム後は完全一致なので、abp-002 と ABP-002 は2枠です。
空の codes 配列、100を超える品番、空文字列は 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"
}
]
}
}同じ形が他の検証失敗を覆い、issues のエントリだけが違います。
GET /resolve/compare
2作品を並べます:コアカード、共有フィールド、類似度スコア。
| パラメータ | 型 | 必須 | 意味 |
|---|---|---|---|
a | string | はい | 最初の品番。2文字以上。 |
b | string | はい | 2番目の品番。2文字以上。 |
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
}どちらも /resolve と同じコア形状で、カードはありません。sources は一致するソース、
contentIdGuess はストアフロントインデックスにあれば DMM content ID で、/resolve と同じです。
shared は actresses と categories の大文字小文字を無視した積集合。maker は両作品が
完全に同じメーカー文字列を持つ場合だけ埋まります。
similarity は 0〜1 の混合値で、共演者(0.34)とカテゴリー(0.26)が主、同じメーカー
(0.1)、再生時間(0.06)、発売日の近さ(0.06)が加わり、小数3桁に丸めます。どちらかの品番が
ない場合、その側は found: false、shared は空、similarity は 0。404 は返しません。
GET /resolve/provenance
各フィールドのソース、API の信頼度、他のソースの主張を示します。
| パラメータ | 型 | 必須 | 意味 |
|---|---|---|---|
q | string | はい | 正規化する品番または表記。2文字以上。 |
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 は title、titleJa、releaseDate、runtimeMins、maker、label、series、categories、actresses、cover、rating を覆います。
スカラーは最も重みの高いソースへ。categories や actresses のような配列は置き換えず、
ソース間で和集合を取ります。candidates は値を提供した全ソースを良い順に並べます。
confidence は勝ったソースの重みをレスポンス内の最高重みで割った値で、最上位が 1、他は
より低くなります。重みは高い順に、ストアフロント 1、javdatabase 0.85、javlibrary 0.8、
javbus 0.7、missav 0.6、sextb 0.55。sources はアルファベット順、candidates は
信頼順です。
未知の品番:404、ボディは GET /resolve と同じです。
GET /resolve/streams
作品をどこで視聴・ダウンロードできるかを返します:HLS ストリーム、サンプル、マグネット、 字幕、ギャラリー数。
| パラメータ | 型 | 必須 | 意味 |
|---|---|---|---|
q | string | はい | 正規化する品番または表記。2文字以上。 |
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 は一行の答え:ストリームがあれば hls、マグネットがあれば magnet、サンプルか
トレーラーだけなら sample、それ以外は none。
availability は詳細を追加します:
| フィールド | 意味 |
|---|---|
magnets | すべてのソースを通じた異なるマグネット infohash の数。 |
stream | HLS master が存在する。 |
sample | サンプルクリップまたはトレーラーが存在する。 |
trailer | 特にトレーラー。 |
gallery | メディア提供元として選ばれたソースのギャラリー画像数。 |
subtitles | メタデータで検出された字幕言語。現在タグ付けされているのは zh だけです。 |
uncensored | メタデータが作品を無修正と示している。 |
score | 0〜1 の完全度:マグネット 0.35、ストリーム 0.35、サンプル 0.15、ギャラリー 0.1、字幕 0.05。 |
streams は HLS があれば {master, variants}、なければ null。master はプレイヤー用
プレイリスト、variants は解像度ごと。sampleUrl はサンプルクリップ、galleryCount は
ソース間の最大ギャラリー数です。
未知の品番:404、ボディは GET /resolve と同じです。
料金
課金されるのは新しい 200 だけです。キャッシュヒット(X-Cache: HIT)、4xx、縮退した
回答(X-Degraded)は無料。正規化、比較、出典は1時間、ストリームは15分キャッシュし、
バッチはキャッシュしません。
GET /resolve はカードをレンダリングするため 1,000 コールあたり $1.20。他は 1,000 コールあたり $0.40 です。
バッチはトリムと重複排除後の品番を、開始した10個単位で課金します:
| ユニーク品番 | 1,000 コールあたり |
|---|---|
| 1〜10 | $0.40 |
| 11〜20 | $0.80 |
| 21〜30 | $1.20 |
| 100 | $4.00 |
ステータスコード
| エンドポイント | コード |
|---|---|
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 |
2文字未満の q、未知の format、上記のバッチボディ失敗は 400 です。
よくあるエラー
キーなしと不正なキーはどちらも 401、ボディが異なります。
# 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 は残高が呼び出し価格を下回ることを意味します。課金はなく、Retry-After: 3600 が
自動化クライアント向けのヒントです。
{
"defined": false,
"code": "PAYMENT_REQUIRED",
"status": 402,
"message": "insufficient balance"
}429 はアカウント単位の1分あたりの上限で、Retry-After に待つ秒数が入ります。
{ "error": "rate limit exceeded" }アカウント側:レート制限と料金とエラー。各オペレーションの
リファレンスは /docs/api/discovery/resolve にあります。