# javinfo Search API > A JAV release lookup API with three endpoints: `POST /movie` returns one normalized best match; `POST /query` returns a list of matches; `/idols` searches a catalog of over 100,000 performers. Send a DVD ID such as `SSIS-001` and get metadata back — title, cast, cover art, runtime, download links, and HLS streams. Every response includes full metadata — there are no tier restrictions. Results are cached server-side. The API is served at `https://api.javinfo.dev`; it is also available on RapidAPI. Key facts: - Site: https://javinfo.dev - API host: `https://api.javinfo.dev` - Get a key, docs, and billing: https://app.javinfo.dev - Also available on RapidAPI: https://rapidapi.com/javinfo/api/javinfo - Auth: send your app key in the `x-javinfo-key` request header. (On RapidAPI, use RapidAPI's `X-RapidAPI-Key` + `X-RapidAPI-Host` headers instead.) - Three endpoints: `POST /movie` (single best match), `POST /query` (list of matches), and `/idols` (performer search). Query by DVD ID / code; optionally pin providers. - On a miss, or if every upstream times out, you get a `404`. Usually the code is not indexed. - Response metadata (cache status, latency, remaining balance) is returned in HTTP response headers, not in the body. - Pricing is usage-based: `/movie` costs $0.0008 per successful result, `/query` costs $0.0004, `/idols` costs $0.0005, `/random` costs $0.0002. Failed lookups are not charged. Top up in any crypto — BTC, ETH, USDT, and 300+ coins — credited 1:1 to a USD balance; $5 minimum. Top-ups from $15 roll a bonus of up to +2%, and $50 or more rolls up to +10%; under $15 there is no bonus. New signups get a free limited trial to start, no credit card. ## Quick start ```bash curl -X POST "https://api.javinfo.dev/movie" \ -H "x-javinfo-key: YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "q": "SSIS-001" }' ``` JavaScript (fetch): ```js const res = await fetch("https://api.javinfo.dev/movie", { method: "POST", headers: { "Content-Type": "application/json", "x-javinfo-key": "YOUR_KEY", }, body: JSON.stringify({ q: "CAWD-001", providers: "javdb" }), }); const data = await res.json(); ``` Python (requests): ```python import requests res = requests.post( "https://api.javinfo.dev/movie", headers={"x-javinfo-key": "YOUR_KEY"}, json={"q": "CAWD-001", "providers": "javdb"}, ) data = res.json() ``` ## Request `POST /movie` accepts a JSON body: - `q` (`string`, required): the code / DVD ID to look up, for example `SSIS-001`. Min length 1. - `providers` (`string | string[]`, optional): restrict which providers to try. Use a comma-separated string such as `"fanza,javdb"` or a JSON array. Default waterfall: `fanza → dmm → javdatabase → sextb → javdb → missav → magneto → javlibrary`. (`/query` uses a different order — see below.) If `providers` is omitted, the API tries every provider and returns the first match. All providers return full data — there is no content gating. Providers: - `fanza` / `dmm`: bilingual metadata: title, cast, maker, label, series, covers, trailer, gallery. (`r18` is still accepted as an input alias that expands to both.) - `javdb`: metadata plus magnet / PikPak download links and community score. - `missav`: metadata plus HLS stream URLs (`.m3u8`). - `javdatabase`: metadata plus description, sample images, and a trailer URL. - `sextb`: metadata plus page URL and, when derivable, an HLS stream URL (`.m3u8`). - `magneto`: torrent search — magnet URIs with size, seed/leech counts, and upload date, merged onto FANZA/DMM catalog metadata. `/movie` only; it is not registered on `/query`. - `javlibrary`: deep-catalog fallback (browser-scraped). `/movie` returns title, cast, genres, runtime, release date, studio, cover, sample images, and page URL. `/query` is keyword-only over codes/labels: honors `num` and `page`, no filters; any filter or non-relevance sort excludes it. Last in both waterfalls. `fanza`/`dmm` support free-text search (actress name, title words) and the richest `/query` filters. `javdb`, `missav`, `javdatabase`, `sextb`, and `javlibrary` are primarily code/keyword lookups with more limited filter surfaces (see docs). `magneto` is code-only and `/movie`-only. ## Response The response body is a bare JSON object — no wrapper envelope. The shape depends on which provider answered, discriminated by the `source` field. - `q` (`string`): the query code you sent. - `source` (`string`): which provider answered: `"fanza"`, `"dmm"`, `"javdb"`, `"missav"`, `"javdatabase"`, `"sextb"`, `"magneto"`, or `"javlibrary"`. (`r18` is an input alias only — it never comes back as a `source`.) - `result` (`object | null`): the video metadata. `null` only when a provider matched the code but found no detail page. Metadata is communicated via HTTP response headers: `X-Cache` (`HIT`/`MISS`), `X-Response-Time-Ms`, and `X-Balance-Remaining`. Every provider maps its data onto the same base shape, so most fields read the same across sources. `fanza`/`dmm` add richer actress data and media fields. Providers like `javdb` and `missav` attach a per-source `extra` object. Base `result` fields: `contentId`, `dvdId`, `titleEn`/`titleJa`, `commentEn`/`commentJa`, `runtimeMins`, `releaseDate`, `makers` (`string[]`), `label`, `series`, `categories` (`string[]`), `actresses` (`string[]`), `actors` (`string[]`), `directors` (`string[]`), `authors` (`string[]`), `jacketFullUrl`/`jacketThumbUrl`, `site`, `serviceCode`. ### source `fanza` / `dmm` (base + media) Both read the same DMM catalog — `fanza` is the FANZA storefront, `dmm` is DMM.com — so they share one shape. They fill the whole base shape (including `contentId`, `titleJa`, `site`, `serviceCode`) and add these under `result.extra`: - `actressesRich` (`{ name: string, image: string | null }[]`): richer actress objects, where `image` is a full DMM profile URL (about 61% are `null`). Top-level `actresses` stays a `string[]` of the same names. - `sampleUrl` (`string | null`): preview video / trailer URL, rewritten to `cdn.javinfo.dev` (the DMM original is JP-geo-blocked). - `galleryFull` (`string[]`): full-size preview image URLs. - `galleryThumb` (`string[]`): thumbnail preview image URLs. ```json { "q": "SSIS-001", "source": "fanza", "result": { "contentId": "ssis00001", "dvdId": "SSIS-001", "titleEn": "Newcomer NO.1 STYLE ...", "runtimeMins": 120, "releaseDate": "2020-07-07", "makers": ["S1 NO.1 STYLE"], "actresses": ["Example Actress"], "jacketFullUrl": "https://pics.dmm.co.jp/digital/video/ssis00001/ssis00001pl.jpg", "site": "FANZA", "extra": { "actressesRich": [ { "name": "Example Actress", "image": "https://pics.dmm.co.jp/mono/actjpgs/example_actress.jpg" } ], "sampleUrl": "https://cdn.javinfo.dev/v/cc3001.dmm.co.jp/litevideo/freepv/s/ssi/ssis00001/ssis00001_dmb_w.mp4", "galleryFull": ["https://pics.dmm.co.jp/digital/video/ssis00001/ssis00001jp-1.jpg"], "galleryThumb": ["https://pics.dmm.co.jp/digital/video/ssis00001/ssis00001-1.jpg"] } } } ``` ### source `javdb` (base + `extra`) `javdb` maps onto the base shape. Fields that only `fanza`/`dmm` populate, such as `contentId`, `site`, `serviceCode`, and `titleJa`, come back `null`. Provider-only data lives under `result.extra`: `downloadLinks` (with `name`, `hash`, `magnet`, `url`, `size`, `hd`) plus `score` / `voteCount`. ```json { "q": "CAWD-001", "source": "javdb", "result": { "dvdId": "CAWD-001", "runtimeMins": 120, "series": "Series Name", "extra": { "downloadLinks": [ { "name": "CAWD-001 1080p", "hash": "0123456789abcdef0123456789abcdef01234567", "magnet": "magnet:?xt=urn:btih:0123456789abcdef...", "size": 5905580032, "hd": true, "url": "https://mypikpak.com/s/VOabc12" } ], "score": 4.3, "voteCount": 512 } } } ``` ### source `missav` (base + `extra`) `missav` maps onto the base shape. Fields that only `fanza`/`dmm` populate come back `null`, and `actresses` is a plain `string[]`. Provider-only data lives under `result.extra`: `downloadLinks` (torrent/hoster links, each with `name`, `hash`, `magnet`, `url`, `size`; `magnet` is `null` for direct-hoster entries), `pageUrl`, and `streams` (HLS master playlist plus per-resolution variants). ```json { "q": "EBOD-391", "source": "missav", "result": { "dvdId": "EBOD-391", "runtimeMins": 119, "makers": ["E-BODY"], "extra": { "downloadLinks": [ { "name": "EBOD-391.mp4", "hash": "fece7f38bf81afed2e22eef4f75f4e8f34f6ae5c", "magnet": "magnet:?xt=urn:btih:fece7f38...", "url": "https://keepshare.org//magnet:?xt=urn:btih:...", "size": 1951292429 } ], "pageUrl": "https://missav.ws/en/ebod-391", "streams": { "master": "https://surrit.com//playlist.m3u8", "variants": [ "https://surrit.com//1280x720/video.m3u8", "https://surrit.com//842x480/video.m3u8" ] } } } } ``` ### source `javdatabase` (base + `extra`) `javdatabase` maps onto the base shape. Provider-only data lives under `result.extra`: `description`, `sampleImages` (`string[]`), and `trailerUrl`. ### source `sextb` (base + `extra`) `sextb` maps onto the base shape and adds `pageUrl` under `result.extra`. Where the HLS master can be derived, `result.extra.streams` carries it in missav's shape (`{ master, variants: [] }`). `sampleUrl` is always `null` — sextb's iframe URL is an embed page, not a playable video file; use `streams.master` for playback. ```json { "q": "AARM-001", "source": "sextb", "result": { "dvdId": "AARM-001", "sampleUrl": null, "extra": { "pageUrl": "https://sextb.cc/…", "streams": { "master": "https://cdn3.turboviplay.com/data/…/….m3u8", "variants": [] } } } } ``` ### source `magneto` (base + `extra`) `magneto` finds torrents for the code, then fills the base shape from the same FANZA/DMM catalog `fanza`/`dmm` read — so it carries their media fields too, plus `torrents` under `result.extra`. Each torrent has `magnetUri`, `size` (a display string such as `"5.5 GB"`, not a byte count), `seeds`, `leeches`, `date` (upload date, slash-separated, or `null`), and `downloadId`. Base fields come back `null` when the code isn't in the catalog; `result` is `null` when the code isn't on the torrent index at all. `/movie` only. ```json { "q": "SSIS-001", "source": "magneto", "result": { "dvdId": "SSIS-001", "runtimeMins": 120, "makers": ["S1 NO.1 STYLE"], "extra": { "torrents": [ { "magnetUri": "magnet:?xt=urn:btih:0123456789abcdef...", "size": "5.5 GB", "seeds": 42, "leeches": 3, "date": "07/07/2020", "downloadId": "12345" } ] } } } ``` ## List search (`POST /query`) `POST /query` returns multiple matches. Use it for broad searches — actress names, partial titles, or to find the code you should send to `/movie`. It costs $0.0004 per call. - `q` (`string`, required): DVD ID, performer name, title, studio, or keywords. Min length 1. - `providers` (`string`, optional): comma-separated provider ids. Default waterfall: `fanza → dmm → javdatabase → sextb → missav → javdb → javlibrary` — a different order from `/movie`, and without `magneto`. Response: `{ q, source, query, count, results }`, where each item in `results` has `id`, `dvdId`, `title`, `cover`, `releaseDate`, and provider-specific `extra`. ```json { "q": "SSIS-001", "source": "javdatabase", "query": "SSIS-001", "count": 2, "results": [ { "id": "ssis00001", "dvdId": "SSIS-001", "title": "After Abstaining From Sex For A Month ...", "cover": "https://www.javdatabase.com/images/covers/ssis-001.webp", "releaseDate": "2021-02-19", "extra": { "studio": "S1 NO.1 STYLE", "url": "https://www.javdatabase.com/movies/ssis-001/" } } ] } ``` ## Idol search (`/idols`) `/idols` searches a catalog of over 100,000 performers — one in-house index, rebuilt weekly — and returns a list of matches. `GET /idols/{id}` returns a single performer by slug or id. It costs $0.0005 per call of up to 10 results; a list that matches nothing is a `200` with `count: 0` and is not charged, and a cache HIT is free. - `q` (`string`, optional): name (romaji), Japanese name, kana, alias / former stage name, or birthplace. A kana or kanji query finds the same idol as the romaji one. - `filter` (`object`, optional): `source` (`javdatabase` | `dmm`), `tag`, `cup`, `blood`, `sign`, `birthplace`, `hairColor`, `hairLength`, `ageMin`/`ageMax`, `heightMin`/`heightMax`. - `sort` (`string`, optional): `relevance` (default), `name`, `age`, `debut`, `height`. - `page` (1-based) and `num` (default 10, max 50). A query or at least one filter is required — browse-by-filter (for example, every G-cup idol) is valid with an empty `q`. Response: `{ q, source: "idols", count, total?, results }`; `/idols/{id}` mirrors `/movie` with `{ q, source: "idols", result }`. `total` saturates at 1000 on a very broad filter, so it is not an exact count for huge result sets. Each result carries `id`, `slug`, `name`, `nameJa`, `image`, `age`, `dob`, `debut`, `debutAge`, `birthplace`, `sign`, `blood`, `measurements`, `cup`, `heightCm`, `shoeSize`, `hairLengths[]`, `hairColors[]`, `tags[]`, `pageUrl`, `aliases[]`, `images[]`, `sources[]`, and `ids{javdatabase,dmm}`. Every scalar is nullable — DMM-only rows carry name, image, and ids and little else. ```json { "q": "Ema Kisaki", "source": "idols", "count": 1, "total": 1, "results": [ { "id": "ema-kisaki", "slug": "ema-kisaki", "name": "Ema Kisaki", "nameJa": "きさきえま", "cup": "E", "blood": "A", "heightCm": 160, "tags": ["Slim", "Big Tits"], "aliases": [], "sources": ["javdatabase", "dmm"], "ids": { "javdatabase": "ema-kisaki", "dmm": 12345 } } ] } ``` Looking for an idol's movies? There is no "movies by this idol" route — use `/query` with `filter.actress=`, which already matches romaji, kanji, and aliases. ## Errors - `401`: missing or invalid API key. - `402`: insufficient balance. - `404`: no provider returned a valid result. This can mean no match or that all upstreams timed out. Try a different code or provider. - `429`: rate limit exceeded — 10 req/min per account, lifting to 60 req/min once the account settles its first top-up. The cap is shared across all of an account's keys. Respect the `Retry-After` header. ## Tips - The same `q` + `providers` combination is cached, so repeated lookups usually return quickly. Check the `X-Cache` response header. - Pin a provider with `providers` when you only want one source, for example `"providers": "javdb"` for magnet-first lookups. - Code matching is fuzzy, so common formats such as `SSIS-001` and `ssis001` generally resolve to the same release. - Use `/query` first when you only know an actress name, studio, or part of a title, then send the code you find to `/movie`. ## Roadmap - New search modes: by image (reverse lookup from a cover/screenshot) and by video (match a release from a clip). ## Site - [Home](https://javinfo.dev/): What javinfo is and how to get started. - [Blog](https://javinfo.dev/blog): Notes on the API and how it is built. - [Releases](https://javinfo.dev/releases): Version history and changelog. - [Privacy](https://javinfo.dev/privacy): Privacy policy. Blog and release pages also serve their raw Markdown source when requested with the `Accept: text/markdown` header. ## Blog - [MCP Server for javinfo](https://javinfo.dev/blog/mcp-server): Use the javinfo API directly from Claude, Cursor, or any MCP host. No HTTP boilerplate, no SDK. - [The javinfo developer dashboard](https://javinfo.dev/blog/web-dashboard): app.javinfo.dev is live. Manage keys, check usage, top up credits. No charge on failures, free limited trial. - [Javdatabase provider](https://javinfo.dev/blog/javdatabase-provider): Descriptions, sample images, and trailer URLs through the new javdatabase provider. Direct movie results from /movie. - [JavLibrary API](https://javinfo.dev/blog/javlibrary-api): Deep-catalog fallback provider — title, cast, cover, sample images without scraping javlibrary.com yourself. - [How to use the JavLibrary provider](https://javinfo.dev/blog/how-to-javlibrary-api): /movie code lookups and bare /query with num; filters exclude javlibrary. - [API redesign — /query and /movie](https://javinfo.dev/blog/api-redesign): The old /search endpoint is deprecated. Use /query for lists ($0.0004) and /movie for single results ($0.0008). - [Introducing the javinfo API](https://javinfo.dev/blog/hello-javinfo): A small API for consistent JAV metadata across providers. - [Built different](https://javinfo.dev/blog/built-different): No onboarding funnel. No metrics theater. No AI buzzword banners. - [API-first, provider-agnostic](https://javinfo.dev/blog/api-first): Consistent JAV metadata across providers. No vendor lock-in. - [Why javinfo exists](https://javinfo.dev/blog/why-javinfo): Adult content metadata should not require five brittle scrapers. - [JAV Metadata API: One Endpoint Instead of Five Scrapers](https://javinfo.dev/blog/jav-metadata-api): There is no public, stable JAV metadata API; every source is a scraper that rots. javinfo is one hosted API returning normalized metadata by code. - [The JavDB API that doesn't exist](https://javinfo.dev/blog/javdb-api): JavDB never shipped a public API. Every "javdb api" on GitHub is a fragile scraper; javinfo has a real `javdb` provider with download/magnet links. - [The DMM API problem](https://javinfo.dev/blog/dmm-api-problem): DMM/FANZA geo-blocks non-Japan IPs and has no usable public docs. javinfo covers ~99% of the dmm.co.jp library through one normalized API. ## Releases - [v0.1.0 — Initial beta](https://javinfo.dev/releases/v0-1-0): First public beta of the javinfo search API. - [v0.1.1 — missav provider](https://javinfo.dev/releases/v0-1-1): Adds the missav provider with HLS streams. - [v0.2.0 — Unified access](https://javinfo.dev/releases/v0-2-0): All providers available on every tier, restructured response schema, and updated rate limits. - [v0.3.0 — MCP server, web dashboard, javdatabase, API redesign](https://javinfo.dev/releases/v0-3-0): @javinfo/mcp on npm, app.javinfo.dev dashboard, javdatabase provider with descriptions/samples, /query+/movie endpoint split. - [v0.5.0 — javlibrary provider](https://javinfo.dev/releases/v0-5-0): Deep-catalog fallback on /movie and /query; keyword-only query with num; last in waterfall. - [v0.5.2 — Preview video CDN](https://javinfo.dev/releases/v0-5-2): sampleUrl proxies via cdn.javinfo.dev for worldwide playback, range seeking, edge caching. - [v0.6.0 — javinfo CLI and MCP open/serve](https://javinfo.dev/releases/v0-6-0): Native CLI for lookups and local LAN HLS play sessions; @javinfo/mcp gains javinfo-open/javinfo-serve. - [v0.6.2 — Faster javdatabase + sextb provider](https://javinfo.dev/releases/v0-6-2): javdatabase and sextb served from javinfo's own database for sub-second lookups; sextb adds pageUrl and HLS streams. - [v0.6.3 — Faster javlibrary](https://javinfo.dev/releases/v0-6-3): javlibrary now reads from its own catalog with per-result user ratings, runtime and release-date filters, and Japanese search. - [v0.6.4 — Idol search API](https://javinfo.dev/releases/v0-6-4): /idols searches over 100,000 performers by romaji, Japanese name, kana or former stage name, with filters and sorting.