Phân giải API
Chuẩn hóa mọi cách viết mã và lấy biến thể, nguồn, thẻ, nguồn gốc và stream cho một tựa.
/resolve cho biết mã này là gì và mỗi nguồn nói gì. /movie trả về nhà cung
cấp đầu tiên trả lời; các endpoint này xem mọi nguồn và giữ những bất đồng.
Dùng để chuẩn hóa abp002, ABP-002 hoặc ABP-2, liệt kê mọi nguồn của một tựa, hoặc lấy
thẻ chia sẻ hay bản đồ stream.
| Endpoint | Trả về | Mỗi 1.000 lần gọi |
|---|---|---|
GET /resolve | Mã chuẩn, biến thể, nguồn, liên kết, thẻ nội tuyến | $1.20 |
POST /resolve/batch | Tìm thấy hoặc không cho tối đa 100 mã | $0.40 cho mỗi nhóm 10 mã duy nhất đã bắt đầu |
GET /resolve/compare | Hai tựa đề cạnh nhau | $0.40 |
GET /resolve/provenance | Nguồn và độ tin cậy theo từng trường | $0.40 |
GET /resolve/streams | Khả dụng stream, mẫu và magnet | $0.40 |
GET /resolve
Chuẩn hóa mọi cách viết thành một mã chuẩn và trả về mọi thứ gắn với nó: biến thể, nguồn,
liên kết tới /movie, thẻ 1200×630.
| Tham số | Kiểu | Bắt buộc | Ý nghĩa |
|---|---|---|---|
q | string | có | Mã hoặc cách viết cần phân giải. Ít nhất 2 ký tự. |
format | png, jpg hoặc svg | không | Mã hóa thẻ. Mặc định là 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,…"
}
}Thẻ nằm trong card.dataUri, nên phản hồi rất lớn: khoảng 1,1 MB với png (mặc định), 900 KB
với svg, 180 KB với jpg. Chọn jpg khi kích thước quan trọng: raster nén mất dữ liệu, nhỏ
hơn png khoảng sáu lần. Payload base64 bị cắt trong ví dụ; dataUri là URI data: đầy đủ
cho <img src>.
| Trường | Ý nghĩa |
|---|---|
input | Chuỗi bạn đã gửi, không đổi. |
code | Mã chuẩn. |
variants | Mọi cách viết trỏ đến cùng tựa đề, chuẩn nhất trước. |
sources | id công khai của các nguồn liệt kê tựa đề. |
contentIdGuess | id nội dung DMM khi chỉ mục cửa hàng có, ngược lại null. |
link | Đường dẫn API cho cùng tựa đề, /movie?q=<code>. Tương đối so với https://api.javinfo.dev và cần header x-javinfo-key. |
card | Thẻ 1200×630 dưới dạng data URI, hoặc null. |
found | true trên 200. Trượt là 404. |
shareSlug | Slug có checksum cho mã chuẩn. |
Thẻ hiển thị mã, tiêu đề tiếng Anh (rút gọn hoặc mã nếu không có), tối đa ba tên và studio,
tối đa bốn nhãn thể loại, rồi điểm đánh giá, thời lượng, ngày phát hành và số magnet khi biết.
Huy hiệu STREAMABLE đánh dấu stream. Ảnh bìa bên phải, trên bản sao mờ. null nếu không
render được: coi là tùy chọn và giữ metadata.
Mã không khớp gì: 404, không phải thẻ rỗng:
{
"defined": false,
"code": "NOT_FOUND",
"status": 404,
"message": "no title found for \"ZZZZ-99999\""
}POST /resolve/batch
Kiểm tra tối đa 100 mã mỗi yêu cầu: dọn danh sách người dùng hoặc đối chiếu danh mục mà không cần 100 lần gọi.
| Trường trong body | Kiểu | Bắt buộc | Ý nghĩa |
|---|---|---|---|
codes | mảng string | có | 1 đến 100 chuỗi không rỗng. |
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 }
]
}Mã không tìm thấy là found: false trong 200 bình thường, không phải 404; code giữ
phỏng đoán chuẩn tốt nhất. count là số mã sau khử trùng lặp; found là số khớp.
Mã được cắt khoảng trắng và khử trùng lặp trước khi đếm. "ABP-002" và " ABP-002 " tốn một
chỗ và xuất hiện một lần trong results. Sau khi cắt, khớp chính xác: abp-002 và ABP-002
là hai chỗ.
Một mảng codes rỗng, hơn 100 mã, hoặc một chuỗi rỗng là 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"
}
]
}
}Cùng dạng đó bao phủ lỗi kiểm tra khác, với mục issues khác.
GET /resolve/compare
Hai tựa cạnh nhau: thẻ cốt lõi mỗi bên, trường chung, điểm tương đồng.
| Tham số | Kiểu | Bắt buộc | Ý nghĩa |
|---|---|---|---|
a | string | có | Mã thứ nhất. Ít nhất 2 ký tự. |
b | string | có | Mã thứ hai. Ít nhất 2 ký tự. |
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
}Mỗi bên có dạng /resolve, không có thẻ. sources liệt kê nguồn khớp; contentIdGuess là id
nội dung DMM khi chỉ mục cửa hàng có, như trên /resolve.
shared giữ phần giao không phân biệt hoa thường của actresses và categories; maker
chỉ điền khi cả hai tựa mang đúng cùng chuỗi nhà sản xuất.
similarity là hỗn hợp 0 đến 1, chủ yếu diễn viên chung (0.34) và thể loại chung (0.26),
cộng cùng nhà sản xuất (0.1), thời lượng (0.06) và độ gần ngày phát hành (0.06), làm tròn 3
chữ số. Nếu một mã không tìm thấy, bên đó found: false, shared rỗng, similarity 0.
Không bao giờ trả 404.
GET /resolve/provenance
Cho thấy nguồn mỗi trường, độ tin của API và các nguồn khác nói gì.
| Tham số | Kiểu | Bắt buộc | Ý nghĩa |
|---|---|---|---|
q | string | có | Mã hoặc cách viết cần phân giải. Ít nhất 2 ký tự. |
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 bao gồm title, titleJa, releaseDate, runtimeMins, maker, label,
series, categories, actresses, cover và rating.
Giá trị vô hướng lấy từ nguồn trọng số cao nhất; mảng như categories và actresses được
hợp nhất, không bị thay thế. candidates liệt kê mọi nguồn đã đưa giá trị, tốt nhất trước,
nên bất đồng hiện trong phản hồi.
confidence là trọng số nguồn thắng chia trọng số tốt nhất của phản hồi: 1 cho nguồn hàng
đầu, thấp hơn cho phần còn lại. Trọng số, cao nhất trước: cửa hàng 1, javdatabase 0.85,
javlibrary 0.8, javbus 0.7, missav 0.6, sextb 0.55. sources theo bảng chữ cái;
candidates theo độ tin.
Mã không tồn tại: 404 với nội dung GET /resolve.
GET /resolve/streams
Nơi xem hoặc tải tựa: stream HLS, mẫu, magnet, phụ đề, kích thước gallery.
| Tham số | Kiểu | Bắt buộc | Ý nghĩa |
|---|---|---|---|
q | string | có | Mã hoặc cách viết cần phân giải. Ít nhất 2 ký tự. |
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 trả lời một dòng: hls khi có stream, magnet khi có magnet, sample khi chỉ có
mẫu hoặc trailer, còn lại none.
availability thêm chi tiết:
| Trường | Ý nghĩa |
|---|---|
magnets | Số info hash magnet khác nhau trên mọi nguồn. |
stream | Có HLS master. |
sample | Có clip mẫu hoặc trailer. |
trailer | Cụ thể là trailer. |
gallery | Số ảnh gallery từ nguồn được chọn cho media. |
subtitles | Ngôn ngữ phụ đề phát hiện trong metadata. Hiện chỉ zh được gắn thẻ. |
uncensored | Metadata đánh dấu tựa đề là uncensored. |
score | Độ đầy đủ 0 đến 1: magnet 0.35, stream 0.35, mẫu 0.15, gallery 0.1, phụ đề 0.05. |
streams là {master, variants} khi có HLS, nếu không null. master là playlist cho trình
phát; variants theo độ phân giải. sampleUrl là clip mẫu khi có; galleryCount là số
gallery lớn nhất trên các nguồn.
Mã không tồn tại: 404 với nội dung GET /resolve.
Chi phí
Chỉ 200 mới bị tính phí. Lượt trúng bộ nhớ đệm (X-Cache: HIT), phản hồi 4xx và câu trả
lời suy giảm (X-Degraded) miễn phí. /resolve, compare và provenance cache 1 giờ;
streams 15 phút. Batch không cache.
GET /resolve tốn $1.20 mỗi 1.000 lần gọi vì render thẻ; endpoint resolve khác $0.40 mỗi
1.000 lần gọi.
Batch tính giá theo số mã còn lại sau khi cắt và khử trùng lặp, theo nhóm 10 đã bắt đầu:
| Mã duy nhất | Mỗi 1.000 lần gọi |
|---|---|
| 1–10 | $0.40 |
| 11–20 | $0.80 |
| 21–30 | $1.20 |
| 100 | $4.00 |
Mã trạng thái
| Endpoint | Mã |
|---|---|
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 |
q ngắn hơn 2 ký tự, format không xác định và lỗi nội dung batch ở trên là 400.
Lỗi thường gặp
Không khóa hoặc khóa sai: 401, nội dung khác nhau.
# 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 nghĩa là số dư thấp hơn giá lần gọi. Không gì bị tính phí; Retry-After: 3600 là gợi ý
cho máy khách tự động.
{
"defined": false,
"code": "PAYMENT_REQUIRED",
"status": 402,
"message": "insufficient balance"
}429 là giới hạn mỗi phút theo tài khoản; Retry-After mang số giây cần chờ.
{ "error": "rate limit exceeded" }Phía tài khoản: Giới hạn tốc độ & thanh toán và Lỗi.
Tham khảo từng thao tác: /docs/api/discovery/resolve.