Jandapress was named JCE (Janda Cheerio Express) and definitely depends on them.
The motivation behind this project is to provide developers with accessible and actionable data from various doujinshi sources, with a focus on aggregation and ease of integration for applications and services.
Many developers consume doujin websites as a source of data when building web applications. However, most of these sites — such as pururin, simply-hentai, and others — do not provide official APIs or public resources that can be easily integrated into applications.
As a result, developers often need to implement their own scraping logic, build multiple abstractions, and manually maintain integrations for each site.
Jandapress aims to simplify this process by providing a unified interface for accessing data across multiple doujin sites. Instead of maintaining separate implementations, developers can rely on Jandapress to reduce complexity and development overhead.
The current state of the service is free to use, meaning anonymous usage is allowed. No authentication is required, and CORS is enabled to support browser-based applications.
Some tests may fail in CI environments because certain doujin websites restrict or block automated requests originating from CI infrastructure and shared IP ranges.
| Site | Status | Get | Search | Random |
|---|---|---|---|---|
nhentai |
✅ | ✅ | ✅ | |
pururin |
✅ | ✅ | ✅ | |
hentaifox |
✅ | ✅ | ✅ | |
hentai2read |
✅ | ✅ | ❌ | |
simply-hentai |
✅ | ❌ | ❌ | |
asmhentai |
✅ | ✅ | ✅ | |
3hentai |
✅ | ✅ | ✅ |
- Aggregates data from multiple doujin sites.
- Provides a consistent and structured response format across all sources.
- Extracted objects are normalized and reassembled to support extensibility.
- Unified interface supporting get, search, and random methods.
- Planned support for optional JWT authentication in future releases.
- Primarily based on pure scraping techniques (with limited exceptions where required).
| NOTE: NodeJS 20.x or higher / or simply just use docker |
To handle several requests from each web, You will also need Redis for persistent caching, free tier is available on Redis Labs, You can also choose another provider as we using keyv Key-value storage with support for multiple backends. All data must be stored in <Buffer> here.
Rename .env.schema to .env and fill the value with your own
# railway, fly.dev, heroku, vercel or any free service, NHENTAI_IP_ORIGIN should be true
RAILWAY = sinkaroid
# default port
PORT = 3000
# backend storage, default is redis, if not set it will consume memory storage
REDIS_URL = redis://default:somenicepassword@redis-666.c10.us-east-6-6.ec666.cloud.redislabs.com:1337
# ttl expire cache (in X hour)
EXPIRE_CACHE = 1
# nhentai strategy
# default is true which is assign to request on IP instead of nhentai.net with cloudflare
# if you have instance like vps you need chromium or firefox installed and set it to false
NHENTAI_IP_ORIGIN = true
# you must set COOKIE if NHENTAI_IP_ORIGIN is false, read the jandapress docs
COOKIE = "cf_clearance=l7RsUjiZ3LHAZZKcM7BcCylwD2agwPDU7l9zkg8MzPo-1676044652-0-250"
# you must set USER_AGENT if NHENTAI_IP_ORIGIN is false, read the jandapress docs
USER_AGENT = "jandapress/7.0.1-alpha Node.js/22.22.0"docker pull ghcr.io/sinkaroid/jandapress:latest
docker run -p 3000:3000 -d ghcr.io/sinkaroid/jandapress:latest
docker run -d \
--name=jandapress \
-p 3025:3000 \
-e REDIS_URL='redis://default:somenicepassword@redis-666.c10.us-east-6-6.ec666.cloud.redislabs.com:1337' \
-e EXPIRE_CACHE='1' \
-e NHENTAI_IP_ORIGIN='false' \
-e COOKIE='cf_clearance=AbcDefGhijY7RYSKv3YeJUjrI5xQ2Uc-666-0-250' \
-e USER_AGENT='jandapress/7.0.1-alpha Node.js/22.22.0' \
ghcr.io/sinkaroid/jandapress:latestgit clone https://github.com/sinkaroid/jandapress.git
- Install dependencies
npm install / yarn install
- Jandapress production
npm run start:prod
- Jandapress testing and hot reload
npm run start:dev
https://nhentai.net is protected by Cloudflare. By default, Jandapress uses a real IP address to bypass the protection. However, in some cases the /api endpoint may still return an error even when the request originates from a valid IP address. This typically indicates that the site administrators have restricted requests from certain IP ranges.
You will need an instance such as a VPS with a browser installed (Chrome, Chromium, or Firefox). Set NHENTAI_IP_ORIGIN to false, then configure COOKIE and USER_AGENT. Requests will be simulated using tough-cookie and http-cookie-agent.
- set
NHENTAI_IP_ORIGINtofalsein.env - open a browser and go to https://nhentai.net
- complete the human verification if prompted
- open DevTools and set a custom user agent
- reload the page and wait for the Cloudflare verification again
- open DevTools and navigate to the Network tab
- obtain the
cf_clearancevalue and set it asCOOKIEin.env - set the same user agent as
USER_AGENTin.env - verify that the cookie works by running
npm run test:cf- it should return a 200 status code, otherwise review the steps above
The documentation states:
This cookie expires after 30 minutes of continuous inactivity by the end user. The cookie contains information related to the calculation of Cloudflare’s proprietary bot score and, when Anomaly Detection is enabled on Bot Management, a session identifier.
└── https://developers.cloudflare.com/fundamentals
You must ensure that the cookie remains valid. If the cookie expires, it must be refreshed manually. This process can also be automated using a scheduled task such as a cron job or an interval-based refresh.
Run the following commands to execute tests for each supported source:
# Check whether all supported sites are available for scraping
npm run test:scrape
# Check whether nhentai is currently under Cloudflare protection
npm run test:cf
# Run tests for individual sources
npm run test:nhentai
npm run test:pururin
npm run test:hentaifox
npm run test:asmhentai
npm run test:hentai2read
npm run test:simply-hentai
npm run test:3hentainpm run start:prod
npm run start:dev
npm run build:apidoc
To running other tests, you can see object scripts in file
package.json
https://sinkaroid.github.io/jandapress
March 11, 2026: We have discontinued providing public APIs and playground services due to ongoing abuse and excessive usage. To continue using Jandapress, please deploy and run your own self-hosted instance.
-
These
parameter?: means is optional -
/: index page
The missing piece of nhentai.net - https://sinkaroid.github.io/jandapress/#api-nhentai
/nhentai: nhentai api- get, takes parameters :
book - search, takes parameters :
key,?page,?sort - related, takes parameters :
book - random
- sort parameters on search
- "popular-today", "popular-week", "popular"
- Example
- get, takes parameters :
The missing piece of pururin.to - https://sinkaroid.github.io/jandapress/#api-pururin
/pururin: pururin api- get, takes parameters :
book - search, takes parameters :
key,?page - random
- Example
- get, takes parameters :
The missing piece of hentaifox.com - https://sinkaroid.github.io/jandapress/#api-hentaifox
/hentaifox: hentaifox api- get, takes parameters :
book - search, takes parameters :
key,?page,?sort - random
- sort parameters on search
- "latest", "popular"
- Example
- get, takes parameters :
The missing piece of asmhentai.com - https://sinkaroid.github.io/jandapress/#api-asmhentai
/asmhentai: asmhentai api- get, takes parameters :
book - search, takes parameters :
key,?page - random
- sort parameters on search
- None
- Example
- get, takes parameters :
The missing piece of hentai2read.com - https://sinkaroid.github.io/jandapress/#api-hentai2read
/hentai2read: hentai2read api- get, takes parameters :
book - search, takes parameters :
key - sort parameters on search
- TBA
- Example
- get, takes parameters :
The missing piece of simply-hentai.com - https://sinkaroid.github.io/jandapress/#api-simply-hentai
/simply-hentai: simply-hentai api- get, takes parameters :
book - sort parameters on search
- TBA
- Example
- get, takes parameters :
The missing piece of 3hentai.net - https://sinkaroid.github.io/jandapress/#api-3hentai
/3hentai: 3hentai api- get, takes parameters :
book - search, takes parameters :
key,?page,?sort - random
- sort parameters on search
- "recent", "popular-24h", "popular-7d", "popular"
- Example
- get, takes parameters :
"success": true, or "success": false,
HTTP/1.1 200 OK
HTTP/1.1 400 Bad Request
HTTP/1.1 500 Fail to get data
Q: The website response is slow
That's unfortunate, this repository was opensource already, You can host and deploy Jandapress with your own instance. Any fixes and improvements will updating to this repo.
March 11, 2026: We have discontinued providing public APIs and playground services due to ongoing abuse and excessive usage. To continue using Jandapress, please deploy and run your own self-hosted instance.
id_ID • /jan·da/ — Dewasa dan mengikat; (?) /press/ shorthand for expressjs; (?)
Seamlessly integrate with the languages you love, simplified the usage, and intelisense definitions on your IDEs
- janda Python wrapper by sinkaroid
- Or create your own
This tool can be freely copied, modified, altered, distributed without any attribution whatsoever. However, if you feel like this tool deserves an attribution, mention it. It won't hurt anybody.
Licence: WTF.



