Filtering
Filter, sort and paginate /query results. Per-provider support at a glance.
Filtering applies to
/queryonly. The single-hit/movieand/randomendpoints 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.
| Field | Type | Meaning |
|---|---|---|
genre | string | Category / genre |
actress | string | Actress (performer) |
maker | string | Maker / studio |
series | string | Series |
director | string | Director |
label | string | Label |
actor | string | Male actor |
censored | "censored" | "uncensored" | Mosaic status |
runtimeMin | number (minutes) | Minimum runtime |
runtimeMax | number (minutes) | Maximum runtime |
releaseAfter | string YYYY-MM-DD | Released on/after |
releaseBefore | string YYYY-MM-DD | Released 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 × nummust stay ≤ 1000 — withnum: 50, page 20 is the last. Beyond that:404(no results), not an error. Narrow with afilterinstead 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.
| Capability | fanza / dmm | missav | javdb | javdatabase | sextb | javlibrary | javbus |
|---|---|---|---|---|---|---|---|
genre | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
actress | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
maker | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
series | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
director | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
label | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
actor | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ❌ |
censored: censored | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
censored: uncensored | ❌ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ |
runtimeMin / runtimeMax | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
releaseAfter / releaseBefore | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
availability | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Combine multiple filters | any combo | any combo | ❌ none | any combo | any combo | any combo | any 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
uncensoredfilter excludes them. - javdb has no per-field filters. Only the censored tab,
availabilityand rich sort; any named dimension excludes it. - javlibrary is censored-only. An
uncensoredfilter excludes it. - javbus has no
actordimension. A pinnedfilter.actorreturns422. Sorts byrelevanceorreleaseonly;sort: ratingis rejected. - javbus takes Japanese or English names. Actress, maker and genre read both
fields, so
三上悠亜andYua Mikamimatch. 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
pageandsort. 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 → javdbThe 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.
- fanza/dmm, javdatabase and sextb use English names (
-
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.) -
censoreddiffers per source. missav has no literal flag; the API mapscensoredto mainstream mosaic titles anduncensoredto everything else (Caribbeancom, 10musume, Tokyo-Hot, 1pondo, FC2, uncensored leaks, …). -
javdatabase is English-only. Pass English or romaji; a Japanese
qor 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/runtimeMaxin minutes.sort: release. Paginated.- Censored only. No
uncensored, noavailability.
# 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
qlike"Yua Mikami"still reaches recent releases. Add"sort": "release"for newest first: underrelevance, 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,
censoredboth ways. - No
sort, no pagination (page 1 only), noavailability.
# 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: viewsis reserved; no provider implements it.- Multi-value per dimension. One value per field (no
genre: ["a","b"]). - Ranges on javdb. They work everywhere else.
availabilityanywhere but javdb.- Combining arbitrary filters on javdb. No per-field filters at all.
actoron javbus. No male-actor dimension.sort: update,ratingorviewson javbus.relevanceandreleaseonly.- Pagination or sort on missav.
- Paging past 1,000 results on fanza/dmm (
page × num≤ 1000). - Filtering
/movieor/random.
When a combination isn't possible: pinned → 422 with a reason; unpinned → skip
and try the next.
Next
- API reference: every
/queryfilter param, with a live playground. - Errors: the
400and422cases.