javinfo

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 /movie dan /random tidak 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.

FieldTipeArti
genrestringKategori / genre
actressstringAktris (pemeran)
makerstringPembuat / studio
seriesstringSeri
directorstringSutradara
labelstringLabel
actorstringAktor pria
censored"censored" | "uncensored"Status mosaik
runtimeMinnumber (menit)Durasi minimum
runtimeMaxnumber (menit)Durasi maksimum
releaseAfterstring YYYY-MM-DDDirilis pada/setelah
releaseBeforestring YYYY-MM-DDDirilis 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 < 1400). 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. num dikoersi dari string kueri, tetapi angka page dan filter[...] bersarang belum — pada GET keduanya ditolak dengan 400 "expected number, received string". Kirim page dan 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.

Kemampuanfanza / dmmmissavjavdbjavdatabase
genre
actress
maker
series
director
label
actor
censored: censored
censored: uncensored
runtimeMin / runtimeMax
releaseAfter / releaseBefore
availability
Gabungkan beberapa filterkombinasi apa punkombinasi apa pun❌ tidak adahanya 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 uncensored mengecualikannya.
  • 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 → javdatabase

Apa 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.
  • 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)". Memfilter actress: "Ema Kisaki" mengembalikan nol baris di sana — Anda memerlukan string lengkap yang tersimpan. (Ini adalah kekasaran v1 yang diketahui.)

  • censored berarti hal yang berbeda per sumber. Di missav tidak ada flag "censored/uncensored" harfiah; API memetakan censored → judul mosaik arus utama dan uncensored → 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 studio s1-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/runtimeMax dalam menit. sort: release. Berpaginasi.
  • Hanya katalog tersensor — tanpa uncensored, tanpa availability, 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, censored dua arah.
  • Tanpa sort (hanya relevansi), tanpa paginasi sungguhan (hanya halaman 1), tanpa availability.
# 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, dan sort (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; hanya genre+maker yang 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.
  • availability di mana pun selain javdb.
  • Menggabungkan filter sembarang pada javdb (tidak ada) atau javdatabase (hanya genre+maker).
  • Paginasi / pengurutan pada missav.
  • Memfilter /movie atau /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 /query mencantumkan setiap parameter filter dengan playground interaktif.
  • Lihat Error untuk kasus 400 dan 422.

On this page