本文へスキップ
javinfo

正規化 API

どんな品番表記も正規化し、変体、ソース、カード、出典、ストリームを1作品分取得します。

/resolve は品番が何か、各ソースが何と言うかを示します。/movie は最初に応答した プロバイダーを返し、こちらは全ソースを見て食い違いを保持します。

abp002、ABP-002、ABP-2 の正規化、全ソースの列挙、共有カードやストリームマップの 取得に使います。

エンドポイント返すもの1,000 コールあたり
GET /resolve正規品番、変体、ソース、リンク、インラインカード$1.20
POST /resolve/batch最大100品番のヒット状況開始した10個のユニーク品番ごとに $0.40
GET /resolve/compare2作品の並列比較$0.40
GET /resolve/provenanceフィールドごとのソースと信頼度$0.40
GET /resolve/streamsストリーム、サンプル、マグネットの可用性$0.40

GET /resolve

どんな表記も1つの正規品番に正規化し、変体、ソース、/movie へのリンク、1200×630 カードを 返します。

パラメータ型必須意味
qstringはい正規化する品番または表記。2文字以上。
formatpng、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 ヘッダーが必要です。
carddata URI 形式の 1200×630 カード、または null。
found200 なら 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作品を並べます:コアカード、共有フィールド、類似度スコア。

パラメータ型必須意味
astringはい最初の品番。2文字以上。
bstringはい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 の信頼度、他のソースの主張を示します。

パラメータ型必須意味
qstringはい正規化する品番または表記。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 ストリーム、サンプル、マグネット、 字幕、ギャラリー数。

パラメータ型必須意味
qstringはい正規化する品番または表記。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 の数。
streamHLS master が存在する。
sampleサンプルクリップまたはトレーラーが存在する。
trailer特にトレーラー。
galleryメディア提供元として選ばれたソースのギャラリー画像数。
subtitlesメタデータで検出された字幕言語。現在タグ付けされているのは zh だけです。
uncensoredメタデータが作品を無修正と示している。
score0〜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 /resolve200、400、401、402、404、429
POST /resolve/batch200、400、401、402、429
GET /resolve/compare200、400、401、402、429
GET /resolve/provenance200、400、401、402、404、429
GET /resolve/streams200、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 にあります。

このページの内容