A RESTful API built with Next.js 14 for scraping manga and comic metadata from multiple sources. Search across various manga websites, retrieve chapter lists, and monitor source health - all through a unified API interface.
Looking for the userscript? Check out the Comick Source Linker on GreasyFork
| Source | ID | Base URL | Status |
|---|---|---|---|
| MangaPark | mangapark |
https://mangapark.io | Active |
| AsuraScan | asurascan |
https://asuracomic.net | Active |
| AtsuMoe | atsumoe |
https://atsumoe.com | Active |
| WeebCentral | weebcentral |
https://weebcentral.com | Active |
| LikeManga | likemanga |
https://likemanga.io | Active |
| ManhuaUS | manhuaus |
https://manhuaus.com | Active |
| MangaRead | mangaread |
https://mangaread.org | Active |
| Mgeko | mgeko |
https://mgeko.cc | Active |
| NovelCool | novelcool |
https://www.novelcool.com | Active |
| FlameComics | flamecomics |
https://flamecomics.xyz | Active |
| Bato | bato |
https://bato.to | Active |
| Mangaloom | mangaloom |
https://mangaloom.com | Active |
| MangaYY | mangayy |
https://mangayy.org | Active |
- Node.js 18+ and npm/pnpm/yarn
- Internet connection for scraping sources
# Clone the repository
git clone https://github.com/GooglyBlox/comick-source-api.git
cd comick-source-api
# Install dependencies
npm install
# Run development server
npm run devThe API will be available at http://localhost:3000 (or live at https://comick-source-api.notaspider.dev)
npm run build
npm startAll endpoints return JSON responses. The API is self-documenting with an interactive UI at the root path.
GET /api/sourcesReturns a list of all supported manga sources.
Response:
{
"sources": [
{
"id": "mangapark",
"name": "MangaPark",
"baseUrl": "https://mangapark.io",
"description": "MangaPark - https://mangapark.io"
}
]
}POST /api/search
Content-Type: application/jsonSearch for manga across one or all sources.
Request Body:
{
"query": "solo leveling",
"source": "mangapark" // or "all" for all sources
}Response (single source):
{
"results": [
{
"id": "343921",
"title": "Solo Leveling",
"url": "https://mangapark.io/title/75577-en-solo-leveling",
"coverImage": "https://...",
"latestChapter": 179,
"lastUpdated": "2 days ago",
"rating": 4.8,
"followers": "1.2M"
}
],
"source": "MangaPark"
}Response (all sources):
{
"sources": [
{
"source": "MangaPark",
"results": [
/* search results */
]
},
{
"source": "AsuraScan",
"results": [
/* search results */
]
}
]
}POST /api/chapters
Content-Type: application/jsonRetrieve all chapters for a specific manga.
Request Body:
{
"url": "https://mangapark.io/title/75577-en-solo-leveling",
"source": "mangapark" // optional, auto-detected from URL
}Response:
{
"chapters": [
{
"id": "1",
"number": 1,
"title": "Chapter 1",
"url": "https://mangapark.io/title/75577-en-solo-leveling/2633607-vol-1-ch-1"
},
{
"id": "2",
"number": 2,
"title": "Chapter 2",
"url": "https://mangapark.io/title/75577-en-solo-leveling/1703522-ch-2"
}
],
"source": "MangaPark",
"totalChapters": 179
}GET /api/healthCheck the operational status of all sources. Results are cached for 5 minutes.
Response:
{
"sources": {
"mangapark": {
"status": "healthy",
"message": "Source is operational",
"responseTime": 1234,
"lastChecked": "2025-01-08T12:34:56.789Z"
},
"asurascan": {
"status": "cloudflare",
"message": "Cloudflare protection detected",
"responseTime": 2456,
"lastChecked": "2025-01-08T12:34:56.789Z"
}
}
}Status Types:
healthy- Source is operationalcloudflare- Cloudflare protection detectedtimeout- Response time exceeded thresholderror- Source returned an error
# Search all sources
curl -X POST https://comick-source-api.notaspider.dev/api/search \
-H "Content-Type: application/json" \
-d '{"query": "one piece", "source": "all"}'
# Get chapters from specific manga
curl -X POST https://comick-source-api.notaspider.dev/api/chapters \
-H "Content-Type: application/json" \
-d '{"url": "https://mangapark.io/title/75577-en-solo-leveling"}'
# Check source health
curl https://comick-source-api.notaspider.dev/api/health// Search for manga
const searchResponse = await fetch("https://comick-source-api.notaspider.dev/api/search", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
query: "chainsaw man",
source: "mangapark",
}),
});
const searchData = await searchResponse.json();
// Get chapters
const chaptersResponse = await fetch("https://comick-source-api.notaspider.dev/api/chapters", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
url: "https://mangapark.io/title/75577-en-solo-leveling",
source: "mangapark",
}),
});
const chaptersData = await chaptersResponse.json();import requests
# Search manga
response = requests.post('https://comick-source-api.notaspider.dev/api/search', json={
'query': 'jujutsu kaisen',
'source': 'all'
})
results = response.json()
# Get chapters
response = requests.post('https://comick-source-api.notaspider.dev/api/chapters', json={
'url': 'https://mangapark.io/title/75577-en-solo-leveling'
})
chapters = response.json()Want to add a new manga source or contribute? See CONTRIBUTING.md for detailed guidelines.
Quick Commands:
npm run dev # Start dev server
npm run build # Build for production
npm test # Run tests
npm run test:sources # Test scrapers
npm run lint # Run ESLint- Metadata only - No images or copyrighted content scraped
- Cloudflare-protected sources return
cloudflarestatus - Health checks cached for 5 minutes
- Educational and personal use only
Vercel:
Docker:
docker build -t comick-source-api .
docker run -p 3000:3000 comick-source-apiNo environment variables required.
See CONTRIBUTING.md for guidelines. PRs must include tests.
Educational purposes only. Respect source website terms of service.