Pemfilteran
Filter, urutkan, dan paginasi hasil /query — beserta apa yang didukung oleh setiap penyedia.
Pemfilteran hanya berlaku untuk
/query(pencarian multi-hasil). Endpoint hasil-tunggal/moviedan/randomtidak menerima filter.
1. Memulai Cepat
Setiap permintaan /query menerima empat masukan opsional di samping istilah
pencarian q: filter, sort, page, dan num (ukuran halaman). Berfungsi
baik pada GET (string kueri) maupun POST (body JSON).
KEY="jvi_..." # your API key, sent as the x-javinfo-key header
# POST — genre + runtime filter, newest first
curl -s -X POST https://api.javinfo.dev/query \
-H "x-javinfo-key: $KEY" -H 'content-type: application/json' \
-d '{
"q": "ema kisaki",
"filter": { "genre": "Big Tits", "runtimeMin": 120 },
"sort": "release",
"page": 1
}'
# GET — same thing, flattened into query params
curl -s "https://api.javinfo.dev/query?q=ema%20kisaki&filter[genre]=Big%20Tits&filter[runtimeMin]=120&sort=release" \
-H "x-javinfo-key: $KEY"q opsional jika ada filter — Anda dapat menjelajahi seluruh kategori tanpa
kata kunci:
# All "creampie" titles, no search term
curl -s -X POST https://api.javinfo.dev/query \
-H "x-javinfo-key: $KEY" -H 'content-type: application/json' \
-d '{ "filter": { "genre": "creampie" } }'Permintaan tanpa q maupun filter akan ditolak dengan 400
("provide a search query or at least one filter").
Biayanya tetap 200 unit per panggilan /query yang berhasil, terlepas dari
filternya. Permintaan yang tidak mengembalikan hasil (404) atau error adalah
gratis.
2. Masukan
filter
Sebuah objek. Semua field opsional. Setel hanya yang Anda butuhkan.
| Field | Tipe | Arti |
|---|---|---|
genre | string | Kategori / genre |
actress | string | Aktris (pemeran) |
maker | string | Pembuat / studio |
series | string | Seri |
director | string | Sutradara |
label | string | Label |
actor | string | Aktor pria |
censored | "censored" | "uncensored" | Status mosaik |
runtimeMin | number (menit) | Durasi minimum |
runtimeMax | number (menit) | Durasi maksimum |
releaseAfter | string YYYY-MM-DD | Dirilis pada/setelah |
releaseBefore | string YYYY-MM-DD | Dirilis pada/sebelum |
availability | "playable" | "magnets" | "subtitle" | "single" | Memiliki stream / magnet / subtitle / merupakan judul tunggal |
sort
Salah satu dari: relevance (default), release, update, rating, views.
relevance— relevansi kecocokan teks (default jika dihilangkan).release— tanggal rilis terbaru dulu.update— yang baru ditambahkan/diperbarui dulu.rating— rating tertinggi dulu.views— dicadangkan; belum ada penyedia yang mendukungnya (selalu ditolak).
page
Bilangan bulat berbasis 1. Dihilangkan = halaman 1. Ukuran halaman diatur oleh
num.
num
Hasil per halaman. Bilangan bulat, default 10, maksimum 50 (nilai lebih
tinggi dipangkas, bukan ditolak; num < 1 → 400). Upaya-terbaik per penyedia:
javdatabase menghormatinya hanya sampai ukuran halaman arsip tetap situs
(membatasi baris yang dikembalikan); missav membatasinya pada jumlah
pencariannya. Offset page dihitung dari num (halaman 2 dengan num=10
melewati 10 pertama).
Koersi numerik GET.
numdikoersi dari string kueri, tetapi angkapagedanfilter[...]bersarang belum — pada GET keduanya ditolak dengan400 "expected number, received string". Kirimpagedan filter numerik melalui POST JSON sampai itu diperbaiki.
3. Matriks Kemampuan Penyedia
/query mencari di beberapa penyedia. Tidak setiap penyedia mendukung setiap
filter. Ini adalah inti dari sistem — baca sebelum menyusun kueri.
Penyedia (dan id-nya): query:fanza, query:dmm (dua etalase DMM + FANZA),
query:missav, query:javdb, query:javdatabase.
| Kemampuan | fanza / dmm | missav | javdb | javdatabase |
|---|---|---|---|---|
genre | ✅ | ✅ | ❌ | ✅ |
actress | ✅ | ✅ | ❌ | ✅ |
maker | ✅ | ✅ | ❌ | ✅ |
series | ✅ | ✅ | ❌ | ✅ |
director | ✅ | ✅ | ❌ | ✅ |
label | ✅ | ✅ | ❌ | ❌ |
actor | ✅ | ✅ | ❌ | ❌ |
censored: censored | ✅ | ✅ | ✅ | ✅ |
censored: uncensored | ❌ | ✅ | ✅ | ✅ |
runtimeMin / runtimeMax | ✅ | ✅ | ❌ | ❌ |
releaseAfter / releaseBefore | ❌ | ✅ | ❌ | ❌ |
availability | ❌ | ❌ | ✅ | ❌ |
| Gabungkan beberapa filter | kombinasi apa pun | kombinasi apa pun | ❌ tidak ada | hanya genre+maker |
sort: relevance | ✅ | ✅ | ✅ | ✅ |
sort: release | ✅ | ❌ | ✅ | ≈ (selalu terbaru) |
sort: update | ❌ | ❌ | ✅ | ❌ |
sort: rating | ❌ | ❌ | ✅ | ❌ |
sort: views | ❌ | ❌ | ❌ | ❌ |
page | ✅ | ❌ (selalu halaman 1) | ✅ | ✅ |
Legenda: ✅ didukung · ❌ tidak didukung · ≈ diterima tetapi berperilaku sebagai default.
Catatan:
- fanza/dmm hanya tersensor — filter
uncensoredmengecualikannya. - javdb tidak memiliki filter per-field (genre/actress/dll). Ia hanya
menawarkan tab tersensor yang kasar,
availability, dan pengurutan yang kaya. Meminta javdb untuk dimensi bernama apa pun akan mengecualikannya. - javdatabase hanya menggabungkan
genre+maker(arsip genre ∩ studio); pasangan lain apa pun akan mengecualikannya. - missav mengabaikan
page— ia selalu mengembalikan halaman pertama dari kecocokan. - missav mengabaikan
sort— hasil hanya diurutkan berdasarkan relevansi.
4. Cara Kerja Pemilihan Penyedia (waterfall)
/query mencoba penyedia secara berurutan, hasil valid pertama yang menang:
FANZA → DMM → missav → javdb → javdatabaseApa yang terjadi pada filter yang tidak dapat dipenuhi oleh penyedia bergantung pada apakah Anda menyematkan penyedia.
Tanpa disematkan (default) — lewati dan lanjutkan
Jika Anda tidak mengirim providers, setiap penyedia terdaftar menjadi kandidat.
Penyedia mana pun yang tidak dapat sepenuhnya memenuhi filter Anda akan dilewati
secara diam-diam, dan waterfall lanjut ke berikutnya. Anda mendapatkan hasil
dari penyedia pertama yang dapat memenuhi seluruh permintaan.
# sort=rating is javdb-only → fanza/dmm/missav/javdatabase are skipped,
# javdb answers.
curl -s -X POST https://api.javinfo.dev/query \
-H "x-javinfo-key: $KEY" -H 'content-type: application/json' \
-d '{ "q": "ABP", "sort": "rating" }'
# → { "source": "javdb", ... }Jika tidak ada penyedia yang dapat memenuhi permintaan, Anda mendapatkan 422
dengan pesan yang menjelaskan alasannya.
Disematkan — error keras
Kirim providers untuk memaksa penyedia tertentu (atau sekumpulan). Jika penyedia
yang disematkan tidak dapat memenuhi filter, permintaan gagal dengan 422 dan
sebuah message yang menyebutkan alasannya — tidak pernah dibuang secara
diam-diam.
# Pin javdb, ask for a genre it can't filter → 422
curl -s -X POST https://api.javinfo.dev/query \
-H "x-javinfo-key: $KEY" -H 'content-type: application/json' \
-d '{ "q": "x", "providers": ["query:javdb"], "filter": { "genre": "creampie" } }'
# → 422 { "message": "does not support filter \"genre\"" }
# Pin fanza, ask for uncensored → 422
# → { "message": "does not support uncensored content" }providers menerima daftar dipisah koma atau array, dengan atau tanpa prefiks
query:: "providers": ["fanza","missav"] atau "providers": "javdb".
5. Nilai Diteruskan Apa Adanya (penting)
Ini adalah desain pass-through v1: apa pun yang Anda masukkan ke nilai filter dikirim ke backend penyedia itu sendiri apa adanya. Tidak ada taksonomi bersama dan tidak ada pencocokan samar (fuzzy) antar penyedia. Nilai yang berfungsi pada satu penyedia sering kali tidak cocok pada penyedia lain, karena setiap sumber menyimpan metadatanya secara berbeda.
Konsekuensi yang harus Anda antisipasi:
-
Genre berbeda per penyedia.
- fanza/dmm dan javdatabase menggunakan nama genre bahasa Inggris
(
"Big Tits","creampie"). - genre missav berbahasa Jepang (
"巨乳","フィスト"). Genre bahasa Inggris tidak akan mengembalikan apa pun di missav.
- fanza/dmm dan javdatabase menggunakan nama genre bahasa Inggris
(
-
Nama harus cocok persis. Filter bersifat cocok-persis, bukan substring. Pada indeks DMM + FANZA, seorang aktris disimpan dengan alias-nya menyatu di dalam nama, mis.
"Ema Kisaki (HARUKI, Haruki Kato)". Memfilteractress: "Ema Kisaki"mengembalikan nol baris di sana — Anda memerlukan string lengkap yang tersimpan. (Ini adalah kekasaran v1 yang diketahui.) -
censoredberarti hal yang berbeda per sumber. Di missav tidak ada flag "censored/uncensored" harfiah; API memetakancensored→ judul mosaik arus utama danuncensored→ segala hal lainnya (Caribbeancom, 10musume, Tokyo-Hot, 1pondo, FC2, bocoran tanpa sensor, …). -
Path javdatabase diubah menjadi slug.
maker: "S1 NO.1 STYLE"otomatis menjadi arsip studios1-no-1-style— masukkan nama yang mudah dibaca manusia, slug diturunkan untuk Anda.
Jika sebuah nilai tidak cocok, Anda hanya mendapatkan lebih sedikit/tidak ada baris dari penyedia tersebut (dan, jika tidak disematkan, waterfall lanjut). Tidak ada yang error — kecocokan kosong bukanlah error.
6. Bentuk Respons
Body-nya adalah kumpulan hasil dari penyedia yang menang:
{
"q": "ema kisaki", // your query, echoed
"source": "fanza", // which provider answered
"count": 10, // default 10, set by num
"results": [
{
"id": "118abp00999", // stable id (content id or dvd id)
"dvdId": "ABP-999",
"title": "…",
"cover": "https://…/…ps.jpg",
"releaseDate": "2019-01-04",
"extra": { // provider-specific, keys vary by source
"runtimeMins": 130,
"maker": "…",
"categories": ["Big Tits", "…"],
"actresses": [{ "name": "…", "image": "https://…|null" }],
"duration": 7800, // missav (seconds)
"genres": ["巨乳"], // missav
"studio": "…", "url": "…" // javdatabase
// …
}
}
]
}extra adalah superset — hanya kunci yang dihasilkan oleh penyedia yang menjawab
yang ada. Field inti (id, dvdId, title, cover, releaseDate) konsisten di
semua penyedia.
Header respons membawa metadata: X-Response-Time-Ms, X-Balance-Remaining.
7. Contekan Per-Penyedia
fanza / dmm (etalase DMM + FANZA) — pemfilteran terstruktur terkaya.
- Semua dimensi bernama, digabungkan bebas. Nilai genre/nama bahasa Inggris.
runtimeMin/runtimeMaxdalam menit.sort: release. Berpaginasi.- Hanya katalog tersensor — tanpa
uncensored, tanpaavailability, tanpa rentang rilis.
# Big-tits titles over 120 min, newest first
-d '{ "filter": { "genre": "Big Tits", "runtimeMin": 120 }, "sort": "release" }'missav — permukaan filter terluas, hanya diurutkan berdasarkan relevansi.
- Semua dimensi bernama (genre berbahasa Jepang), rentang durasi dan rilis,
censoreddua arah. - Tanpa
sort(hanya relevansi), tanpa paginasi sungguhan (hanya halaman 1), tanpaavailability.
# Uncensored titles matching "caribbean"
-d '{ "q": "caribbean", "filter": { "censored": "uncensored" } }'
# Japanese genre browse
-d '{ "q": "SSIS", "filter": { "genre": "巨乳" } }'javdb — tanpa filter field, tetapi pengurutan + ketersediaan terbaik.
- Hanya
censored(keduanya),availability, dansort(relevance/release/update/rating). - Berpaginasi. Tanpa genre/actress/maker/dll.
# Playable, highest rated
-d '{ "q": "ABP", "filter": { "availability": "playable" }, "sort": "rating" }'javdatabase — penjelajahan arsip berdasarkan satu dimensi (atau genre ∩ maker).
genre,actress,maker,series,director; hanyagenre+makeryang dapat digabungkan. Tersensor + tanpa sensor. Nilai bahasa Inggris, otomatis di-slug. Berpaginasi.- Tanpa rentang durasi/rilis, tanpa
label/actor, tanpa pengurutan sungguhan (terbaru dulu).
# Creampie titles from S1
-d '{ "filter": { "genre": "creampie", "maker": "S1 NO.1 STYLE" } }'8. Yang TIDAK Mungkin (v1)
- Normalisasi nilai antar penyedia. Tidak ada kosakata genre/aktris yang terpadu — Anda harus berbicara dalam dialek masing-masing penyedia (Inggris vs Jepang, string persis).
sort: views— dicadangkan, tidak ada penyedia yang mengimplementasikannya.- Multi-nilai per dimensi. Satu nilai per field (tanpa
genre: ["a","b"]). - Rentang di luar penyedianya. Rentang durasi hanya fanza/dmm/missav; rentang rilis hanya missav.
availabilitydi mana pun selain javdb.- Menggabungkan filter sembarang pada javdb (tidak ada) atau javdatabase (hanya genre+maker).
- Paginasi / pengurutan pada missav.
- Memfilter
/movieatau/random.
Ketika sebuah kombinasi tidak mungkin: disematkan → 422 dengan alasan; tanpa
disematkan → penyedia tersebut dilewati dan yang berikutnya dicoba.
Selanjutnya
- Jelajahi referensi API lengkap — operasi
/querymencantumkan setiap parameter filter dengan playground interaktif. - Lihat Error untuk kasus
400dan422.