Skip to content
javinfo

Filtering

Filter, sort and paginate /query results. Per-provider support at a glance.

Filtering applies to /query only. The single-hit /movie and /random endpoints take no filters.


1. Quick start

/query takes four optional inputs on top of q: filter, sort, page and num (page size). GET and POST both work.

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 is optional with a filter. Browse a category with no keyword:

# 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" } }'

Neither q nor a filter returns 400 ("provide a search query or at least one filter").

Cost: $0.40 per 1,000 calls at num=10, scaling with page size (billing). Filters don't change it. An empty result (200 with count: 0) or an error is free.


2. Inputs

filter

An object. All fields optional.

FieldTypeMeaning
genrestringCategory / genre
actressstringActress (performer)
makerstringMaker / studio
seriesstringSeries
directorstringDirector
labelstringLabel
actorstringMale actor
censored"censored" | "uncensored"Mosaic status
runtimeMinnumber (minutes)Minimum runtime
runtimeMaxnumber (minutes)Maximum runtime
releaseAfterstring YYYY-MM-DDReleased on/after
releaseBeforestring YYYY-MM-DDReleased on/before
availability"playable" | "magnets" | "subtitle" | "single"Has stream / magnets / subtitles / is a single title

sort

One of relevance (default), release, update, rating, views.

  • relevance: text-match relevance. Default.
  • release: newest release first.
  • update: recently added first.
  • rating: highest rated first.
  • views: reserved. No provider supports it; always rejected.

page

1-based integer. Omitted = page 1. num sets the size.

Deep-pagination ceiling. The fanza/dmm index caps a result set at 1,000 rows, so page × num must stay ≤ 1000 — with num: 50, page 20 is the last. Beyond that: 404 (no results), not an error. Narrow with a filter instead of paging deeper.

num

Results per page. Integer, default 10, max 50. Higher values clamp, never reject; num < 1 → 400. missav caps at its own count; others paginate. The page offset comes from num (page 2 with num=10 skips 10).

Both methods coerce numeric inputs, including page and nested filter[...]. A GET with filter[runtimeMin]=120 works.


3. Provider capabilities

/query searches several providers; not every one supports every filter. Read the matrix first.

Providers and ids: query:fanza, query:dmm (DMM + FANZA storefronts), query:javdatabase, query:sextb, query:javlibrary, query:javbus, query:missav, query:javdb.

Capabilityfanza / dmmmissavjavdbjavdatabasesextbjavlibraryjavbus
genre✅✅❌✅✅✅✅
actress✅✅❌✅✅✅✅
maker✅✅❌✅✅✅✅
series✅✅❌✅✅✅✅
director✅✅❌✅✅✅✅
label✅✅❌✅✅✅✅
actor✅✅❌✅✅✅❌
censored: censored✅✅✅✅✅✅✅
censored: uncensored❌✅✅✅✅❌✅
runtimeMin / runtimeMax✅✅❌✅✅✅✅
releaseAfter / releaseBefore✅✅❌✅✅✅✅
availability❌❌✅❌❌❌❌
Combine multiple filtersany comboany combo❌ noneany comboany comboany comboany combo
sort: relevance✅✅✅✅✅✅✅
sort: release✅❌✅✅✅✅✅
sort: update❌❌✅❌❌❌❌
sort: rating❌❌✅❌❌❌❌
sort: views❌❌❌❌❌❌❌
page✅❌ (always page 1)✅✅✅✅✅

Legend: ✅ supported · ❌ not supported.

Notes:

  • fanza/dmm are censored-only. An uncensored filter excludes them.
  • javdb has no per-field filters. Only the censored tab, availability and rich sort; any named dimension excludes it.
  • javlibrary is censored-only. An uncensored filter excludes it.
  • javbus has no actor dimension. A pinned filter.actor returns 422. Sorts by relevance or release only; sort: rating is rejected.
  • javbus takes Japanese or English names. Actress, maker and genre read both fields, so 三上悠亜 and Yua Mikami match. Genres are English with Japanese equivalents.
  • javdatabase is English-only. The corpus is the English site; a Japanese query (巨乳) matches nothing and the provider is skipped. Pass romaji or English.
  • missav ignores page and sort. Page 1 only, relevance-ranked.
  • javdatabase, sextb, javlibrary and javbus use our own catalog. Filtering and pagination are fast and complete, with no upstream cap.

4. Provider selection

/query tries providers in order. First valid result wins:

FANZA → DMM → javdatabase → sextb → javlibrary → javbus → missav → javdb

The first seven, through missav, come from our own index. javdb is fetched live as fallback.

Unsupported filters depend on whether you pinned providers.

Unpinned: skip and advance

Without providers, every registered provider is a candidate. One that can't satisfy the filter is silently skipped; the first that can honor the whole request answers.

# sort=rating is javdb-only → every other provider is 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", ... }

If no provider can satisfy it, you get 422 with the reason.

Pinned: hard error

Send providers to force one provider or a set. A pinned provider that can't satisfy the filter fails with 422 and a message naming the reason. Never silently dropped.

# 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 takes a comma list or array, with or without the query: prefix: "providers": ["fanza","missav"] or "providers": "javdb".


5. Values pass through verbatim

v1 pass-through: filter values go to that provider's backend as-is. No shared taxonomy, no fuzzy matching. A value that works on one provider often does not match another; each source stores metadata differently.

Consequences:

  • Genres differ per provider.

    • fanza/dmm, javdatabase and sextb use English names ("Big Tits", "creampie").
    • missav uses Japanese ("巨乳", "フィスト"); an English genre returns nothing.
    • javbus takes either language and matches both.
  • Names must match exactly. Filters are exact-match, not substring. The DMM + FANZA index stores aliases in the name, e.g. "Ema Kisaki (HARUKI, Haruki Kato)"; actress: "Ema Kisaki" returns zero rows. Use the full stored string. (A known v1 rough edge.)

  • censored differs per source. missav has no literal flag; the API maps censored to mainstream mosaic titles and uncensored to everything else (Caribbeancom, 10musume, Tokyo-Hot, 1pondo, FC2, uncensored leaks, …).

  • javdatabase is English-only. Pass English or romaji; a Japanese q or value matches nothing and the provider is skipped.

A miss gives fewer or no rows; if unpinned, the waterfall moves on. Nothing errors.


6. Response shape

Body: the winning provider's result set.

{
  "q": "ema kisaki",        // your query, echoed
  "source": "fanza",        // which provider answered
  "count": 10,              // page size (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 is a superset: only the answering provider's keys appear. Core fields (id, dvdId, title, cover, releaseDate) are consistent.

Headers carry metadata: X-Response-Time-Ms, X-Balance-Remaining.


7. Per-provider reference

fanza / dmm (DMM + FANZA storefronts): richest filtering.

  • All named dimensions, freely combined. English genre and name values.
  • runtimeMin/runtimeMax in minutes. sort: release. Paginated.
  • Censored only. No uncensored, no availability.
# Big-tits titles over 120 min, newest first
-d '{ "filter": { "genre": "Big Tits", "runtimeMin": 120 }, "sort": "release" }'

Searching by name. English titles stop at mid-2022; newer titles are Japanese-only. Performer names (romaji) are indexed separately, so q like "Yua Mikami" still reaches recent releases. Add "sort": "release" for newest first: under relevance, older titles that mention the name rank higher.

# Newest Yua Mikami titles first
-d '{ "q": "Yua Mikami", "providers": ["fanza"], "sort": "release" }'
# Exact-match browse (see §5 on stored name strings)
-d '{ "filter": { "actress": "Yua Mikami" }, "sort": "release" }'

missav: broadest filter surface, relevance only.

  • All named dimensions (genres in Japanese), runtime and release ranges, censored both ways.
  • No sort, no pagination (page 1 only), no availability.
# Uncensored titles matching "caribbean"
-d '{ "q": "caribbean", "filter": { "censored": "uncensored" } }'
# Japanese genre browse
-d '{ "q": "SSIS", "filter": { "genre": "巨乳" } }'

javdb: no field filters; best sort and availability.

  • Only censored (both), availability, sort (relevance/release/update/rating).
  • Paginated. No genre, actress, maker.
# Playable, highest rated
-d '{ "q": "ABP", "filter": { "availability": "playable" }, "sort": "rating" }'

javdatabase: the full English catalog. Censored and uncensored, all named dimensions, both ranges. English values only (a Japanese q is skipped). sort: release. Paginated. No availability.

# Creampie titles from S1
-d '{ "filter": { "genre": "creampie", "maker": "S1 NO.1 STYLE" } }'

sextb: streams included, our own catalog. All named dimensions, both ranges, censored both ways. sort: release. Paginated. No availability.

javlibrary: censored-only, our own catalog. All named dimensions, both ranges. sort: release. Paginated. No availability.

javbus: torrents and a wide Japanese catalog, our own index. Every named dimension except actor, both ranges, censored both ways. Actress, maker and genre take Japanese or English. sort: relevance / release. Paginated. No availability. Torrents ride on /movie as extra.downloadLinks.

# Japanese actress, newest first (POST)
-d '{ "providers": ["javbus"], "filter": { "actress": "三上悠亜" }, "sort": "release", "num": 2 }'

# Japanese genre + runtime, over GET
curl -s 'https://api.javinfo.dev/query?providers=javbus&filter%5Bgenre%5D=%E5%B7%A8%E4%B9%B3&filter%5BruntimeMin%5D=120&num=2' \
  -H "x-javinfo-key: $KEY"

# Uncensored releases since 2026, newest first (POST)
-d '{ "providers": ["javbus"], "filter": { "censored": "uncensored", "releaseAfter": "2026-01-01" }, "sort": "release", "num": 2 }'

Pin javbus and ask for something it can't do → 422:

# No male-actor dimension → 422
-d '{ "providers": ["javbus"], "filter": { "actor": "Shimiken" } }'
# → { "defined": false, "code": "BAD_REQUEST", "status": 422, "message": "does not support filter \"actor\"" }

# No rating sort → 422
-d '{ "providers": ["javbus"], "q": "ABP", "sort": "rating" }'
# → { "defined": false, "code": "BAD_REQUEST", "status": 422, "message": "does not support sort \"rating\"" }

The result shape is the standard /query body from §6. For the /movie record and torrents, see the javbus section.


8. Limits in v1

  • Cross-provider value normalization. No shared genre or actress vocabulary; speak each provider's dialect (English vs Japanese, exact strings).
  • sort: views is reserved; no provider implements it.
  • Multi-value per dimension. One value per field (no genre: ["a","b"]).
  • Ranges on javdb. They work everywhere else.
  • availability anywhere but javdb.
  • Combining arbitrary filters on javdb. No per-field filters at all.
  • actor on javbus. No male-actor dimension.
  • sort: update, rating or views on javbus. relevance and release only.
  • Pagination or sort on missav.
  • Paging past 1,000 results on fanza/dmm (page × num ≤ 1000).
  • Filtering /movie or /random.

When a combination isn't possible: pinned → 422 with a reason; unpinned → skip and try the next.

Next

  • API reference: every /query filter param, with a live playground.
  • Errors: the 400 and 422 cases.

On this page