{"id":50980013,"url":"https://github.com/shineii86/shineiapi","last_synced_at":"2026-06-19T13:02:07.201Z","repository":{"id":356971175,"uuid":"1227954740","full_name":"Shineii86/ShineiAPI","owner":"Shineii86","description":"Free Manga, Manhwa \u0026 Webtoon REST API — no auth required. Built on Toraka with smart caching, rate limiting, and data normalization. Powered by Next.js 14 on Vercel.","archived":false,"fork":false,"pushed_at":"2026-05-10T19:13:17.000Z","size":2997,"stargazers_count":2,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-10T19:13:32.754Z","etag":null,"topics":["javascript","manga","manhwa","nextjs","rest-api","tailwindcss","vercel","webtoon"],"latest_commit_sha":null,"homepage":"https://shineiapi.vercel.app","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Shineii86.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["Shineii86"]}},"created_at":"2026-05-03T11:52:54.000Z","updated_at":"2026-05-10T17:17:33.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Shineii86/ShineiAPI","commit_stats":null,"previous_names":["shineii86/shineiapi"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/Shineii86/ShineiAPI","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Shineii86%2FShineiAPI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Shineii86%2FShineiAPI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Shineii86%2FShineiAPI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Shineii86%2FShineiAPI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Shineii86","download_url":"https://codeload.github.com/Shineii86/ShineiAPI/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Shineii86%2FShineiAPI/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34532260,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-19T02:00:06.005Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["javascript","manga","manhwa","nextjs","rest-api","tailwindcss","vercel","webtoon"],"created_at":"2026-06-19T13:02:02.864Z","updated_at":"2026-06-19T13:02:07.194Z","avatar_url":"https://github.com/Shineii86.png","language":"JavaScript","funding_links":["https://github.com/sponsors/Shineii86"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"public/cover.jpg\" alt=\"ShineiAPI — Free Manga \u0026 Manhwa REST API\" width=\"100%\" /\u003e\n\n\u003cbr /\u003e\n\n# 水 ShineiAPI\n\n### The Fastest Free Manga API Built on Toraka\n\n**A free, open-source REST API for manga, manhwa, and webtoon data — no authentication required.**\n\nBuilt as a middleware layer on top of the [Toraka](https://toraka.com) API with caching, rate limiting, error handling, and data normalization.\n\n\u003cbr /\u003e\n\n\u003ca href=\"https://shineiapi.vercel.app/docs\"\u003e\u003cimg src=\"https://img.shields.io/badge/Documentation-Live-1a1a1a?style=for-the-badge\u0026logo=readthedocs\u0026logoColor=white\" alt=\"Documentation\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://shineiapi.vercel.app/api/v1/health\"\u003e\u003cimg src=\"https://img.shields.io/badge/💚_Health_Check-Live-22c55e?style=for-the-badge\u0026logo=cloud\u0026logoColor=white\" alt=\"Health\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://shineiapi.vercel.app/openapi.yaml\"\u003e\u003cimg src=\"https://img.shields.io/badge/OpenAPI_Spec-v2.0.3-ea580c?style=for-the-badge\u0026logo=openapiinitiative\u0026logoColor=white\" alt=\"OpenAPI\" /\u003e\u003c/a\u003e\n\n\u003cbr /\u003e\n\n\u003ca href=\"https://github.com/Shineii86/ShineiAPI/blob/main/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/Shineii86/ShineiAPI?style=flat-square\u0026color=0ea5e9\" alt=\"License\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/Shineii86/ShineiAPI/stargazers\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/Shineii86/ShineiAPI?style=flat-square\u0026color=fbbf24\" alt=\"Stars\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/Shineii86/ShineiAPI/network/members\"\u003e\u003cimg src=\"https://img.shields.io/github/forks/Shineii86/ShineiAPI?style=flat-square\u0026color=0ea5e9\" alt=\"Forks\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/Shineii86/ShineiAPI/issues\"\u003e\u003cimg src=\"https://img.shields.io/github/issues/Shineii86/ShineiAPI?style=flat-square\u0026color=ef4444\" alt=\"Issues\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/Shineii86/ShineiAPI/pulls\"\u003e\u003cimg src=\"https://img.shields.io/github/issues-pr/Shineii86/ShineiAPI?style=flat-square\u0026color=22c55e\" alt=\"Pull Requests\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/Shineii86/ShineiAPI/actions/workflows/ci.yml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/Shineii86/ShineiAPI/ci.yml?style=flat-square\u0026label=CI\" alt=\"CI\" /\u003e\u003c/a\u003e\n\n\u003cbr /\u003e\n\n\u003ca href=\"https://nextjs.org\"\u003e\u003cimg src=\"https://img.shields.io/badge/Next.js-14-black?style=flat-square\u0026logo=next.js\" alt=\"Next.js\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://vercel.com\"\u003e\u003cimg src=\"https://img.shields.io/badge/Deployed_on-Vercel-black?style=flat-square\u0026logo=vercel\" alt=\"Vercel\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://nodejs.org\"\u003e\u003cimg src=\"https://img.shields.io/badge/Node.js-18%2B-339933?style=flat-square\u0026logo=node.js\u0026logoColor=white\" alt=\"Node.js\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://tailwindcss.com\"\u003e\u003cimg src=\"https://img.shields.io/badge/Tailwind_CSS-3-06B6D4?style=flat-square\u0026logo=tailwindcss\u0026logoColor=white\" alt=\"Tailwind CSS\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://www.openapis.org/\"\u003e\u003cimg src=\"https://img.shields.io/badge/OpenAPI-3.1-ea580c?style=flat-square\u0026logo=openapiinitiative\u0026logoColor=white\" alt=\"OpenAPI\" /\u003e\u003c/a\u003e\n\n\u003cbr /\u003e\u003cbr /\u003e\n\n\u003ca href=\"https://shineiapi.vercel.app/docs\"\u003e\u003cstrong\u003e📖 Documentation\u003c/strong\u003e\u003c/a\u003e ·\n\u003ca href=\"https://shineiapi.vercel.app/docs#try-it\"\u003e\u003cstrong\u003e🎮 API Playground\u003c/strong\u003e\u003c/a\u003e ·\n\u003ca href=\"https://shineiapi.vercel.app/api/v1/health\"\u003e\u003cstrong\u003e💚 Health Status\u003c/strong\u003e\u003c/a\u003e ·\n\u003ca href=\"https://editor.swagger.io/?url=https://shineiapi.vercel.app/openapi.yaml\"\u003e\u003cstrong\u003e🔧 API Explorer\u003c/strong\u003e\u003c/a\u003e ·\n\u003ca href=\"https://github.com/Shineii86/ShineiAPI/issues/new?assignees=\u0026labels=bug\u0026template=bug_report.md\"\u003e\u003cstrong\u003e🐛 Report Bug\u003c/strong\u003e\u003c/a\u003e ·\n\u003ca href=\"https://github.com/Shineii86/ShineiAPI/issues/new?assignees=\u0026labels=enhancement\u0026template=feature_request.md\"\u003e\u003cstrong\u003e✨ Request Feature\u003c/strong\u003e\u003c/a\u003e\n\n\u003c/div\u003e\n\n---\n\n## 📑 Table of Contents\n\n- [About](#-about)\n- [Why ShineiAPI?](#-why-shineiapi)\n- [Key Features](#-key-features)\n- [Quick Start](#-quick-start)\n- [Base URL](#-base-url)\n- [API Endpoints](#-api-endpoints)\n  - [Browse Series](#browse-series)\n  - [Series Detail](#series-detail)\n  - [Chapter List](#chapter-list)\n  - [Search](#search)\n  - [Popular \u0026 Trending](#popular--trending)\n  - [Random Series](#random-series)\n  - [Top Rated](#top-rated)\n  - [Release Schedule](#release-schedule)\n  - [Genres](#genres)\n  - [Health Check](#health-check)\n  - [Stats](#stats)\n- [Response Format](#-response-format)\n- [Rate Limiting](#-rate-limiting)\n- [Caching](#-caching)\n- [Error Handling](#-error-handling)\n- [Request Headers](#-request-headers)\n- [OpenAPI Specification](#-openapi-specification)\n- [Code Examples](#-code-examples)\n- [Tech Stack](#-tech-stack)\n- [Project Structure](#-project-structure)\n- [Local Development](#-local-development)\n- [Deployment](#-deployment)\n- [Contributing](#-contributing)\n- [FAQ](#-faq)\n- [Legal](#-legal)\n- [Changelog](#-changelog)\n- [License](#-license)\n- [Acknowledgments](#-acknowledgments)\n\n---\n\n## 📖 About\n\n**ShineiAPI** is a free, public REST API that provides comprehensive manga, manhwa, and webtoon data. It acts as a middleware layer on top of the [Toraka](https://toraka.com) API, adding:\n\n- **In-memory caching** with configurable TTL for fast responses\n- **Rate limiting** with sliding window algorithm (60 req/min per IP)\n- **Data normalization** for consistent, predictable JSON responses\n- **Error handling** with descriptive messages and proper HTTP status codes\n- **CORS support** for direct browser access from any origin\n\nWhether you're building a manga reader app, a recommendation engine, a tracking tool, or a content aggregator — ShineiAPI gives you the data you need with a clean, consistent interface.\n\n\u003e **Why \"Shinei\"?** — From Japanese 「新鋭」(shin'ei), meaning **\"new talent\"** or **\"rising star\"** — reflecting the fresh, rising content this API helps discover.\n\n---\n\n## 🌟 Why ShineiAPI?\n\n| | ShineiAPI | Other APIs |\n|---|---|---|\n| **Authentication** | ✅ None required | ❌ API keys, OAuth |\n| **Rate Limit** | ✅ 60 req/min | ⚠️ Often lower or paid |\n| **Response Format** | ✅ Consistent envelope | ❌ Varies by endpoint |\n| **Caching** | ✅ Built-in (5–15 min) | ❌ Manual |\n| **CORS** | ✅ All origins | ⚠️ Restricted |\n| **Cost** | ✅ Free forever | ❌ Freemium/paid |\n| **Focus** | ✅ Manga \u0026 manhwa | ⚠️ Often anime-first |\n\n---\n\n## ✨ Key Features\n\n| Feature | Description |\n|---------|-------------|\n| 📚 **Comprehensive Data** | Titles, synopses, ratings, chapters, genres, authors, artists, cover images, alt titles, popularity ranks |\n| ⚡ **Sub-Second Responses** | In-memory caching with configurable TTL (5 min series, 10 min search, 15 min rankings) |\n| 🔍 **Full-Text Search** | Search across thousands of series by title with optional genre, source, type, and status filters |\n| 📖 **Chapter Tracking** | Detailed chapter info including release dates, sources, lock status, and publication order |\n| 🎲 **Discovery Tools** | Random series, popular/trending lists, top-rated rankings, release schedules |\n| 🔓 **Zero Authentication** | No API keys, no sign-ups, no OAuth dances. Just make a request and get JSON. |\n| 🌐 **CORS Ready** | Call directly from any frontend — browser, mobile, desktop, browser extension |\n| 🛡️ **Rate Limiting** | 60 req/min per IP with informative headers (`X-RateLimit-*`, `Retry-After`) |\n| 📄 **Consistent Envelope** | Every response follows `{ success, data, pagination? }` — no surprises |\n| 🏥 **Health Monitoring** | `/api/v1/health` endpoint with upstream probe, cache stats, and uptime |\n| 📋 **OpenAPI Spec** | Full OpenAPI 3.1 specification for code generation, testing, and documentation |\n| 🔍 **Request Tracing** | `X-Request-ID` header on every response for debugging and logging |\n| 📊 **Public Stats** | `/api/v1/stats` endpoint with uptime, cache metrics, and endpoint count |\n| 🎮 **Live API Playground** | Interactive endpoint testing with parameter inputs, live JSON response preview, and syntax highlighting |\n| 📜 **Terms \u0026 Privacy** | Full Terms of Service and Privacy Policy pages included |\n| 🎨 **Neo-Brutalist × Apple UI** | Bold personality with Apple polish — frosted glass nav, soft layered shadows, spring animations, pill badges, warm cream palette |\n| 🔍 **Docs Search** | ⌘K searchable modal with keyboard navigation across all endpoints and features |\n| 🏎️ **Performance Optimized** | Dynamic imports for heavy components, self-hosted fonts via `next/font`, shared component library, zero redundant code |\n| 📜 **Infinite Marquee** | Seamless looping keyword banner on landing page — pauses on hover, responsive on mobile |\n| 🖼️ **Dynamic OG Images** | Series pages generate rich social preview cards via `/api/og` — title, rating, status, chapters, genres in branded layout |\n| 🔮 **Search Autocomplete** | Typeahead suggestions in browse search with cover art, ratings, and instant series preview |\n| 📊 **API Analytics** | Endpoint usage, top queries, error rates, and response times tracked in-memory — view via `/api/v1/stats` |\n| 📄 **Smart Pagination** | Numbered page navigation with ellipsis, active states, and page info |\n\n---\n\n## 🚀 Quick Start\n\n**No API key needed.** Just make a request:\n\n```bash\n# Get a series\ncurl https://shineiapi.vercel.app/api/v1/series/solo-leveling\n\n# Search for a series\ncurl \"https://shineiapi.vercel.app/api/v1/search?q=nano+machine\"\n\n# Get a random series\ncurl https://shineiapi.vercel.app/api/v1/random\n\n# Check API health\ncurl https://shineiapi.vercel.app/api/v1/health\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e🎮 Try it in JavaScript\u003c/strong\u003e\u003c/summary\u003e\n\n```javascript\nconst res = await fetch('https://shineiapi.vercel.app/api/v1/series/solo-leveling');\nconst { success, data } = await res.json();\n\nif (success) {\n  console.log(data.title);     // \"Solo Leveling\"\n  console.log(data.rating);    // 9.8\n  console.log(data.chapters);  // 201\n}\n```\n\n\u003c/details\u003e\n\n---\n\n## 🌐 Base URL\n\n```\nhttps://shineiapi.vercel.app/api/v1\n```\n\n| Property | Value |\n|----------|-------|\n| **Protocol** | HTTPS only (HTTP auto-redirects) |\n| **Method** | GET only (all endpoints) |\n| **Auth** | None required |\n| **CORS** | All origins allowed |\n| **Content-Type** | `application/json` |\n| **Rate Limit** | 60 requests/min per IP |\n\n---\n\n## 📡 API Endpoints\n\n### Browse Series\n\n```\nGET /api/v1/series\n```\n\nBrowse all series with filtering, sorting, and pagination.\n\n| Parameter | Type | Required | Default | Description |\n|-----------|------|----------|---------|-------------|\n| `page` | integer | No | `1` | Page number |\n| `sort` | string | No | `popularity_rank` | Sort field: `popularity_rank`, `trending_rank`, `rating`, `updated_at`, `created_at` |\n| `genre` | string | No | — | Genre slug filter (e.g., `action`, `fantasy`, `romance`) |\n| `q` | string | No | — | Search string to filter results |\n\n```bash\n# Browse all series (default: popularity)\ncurl https://shineiapi.vercel.app/api/v1/series\n\n# Sort by rating, filter by genre\ncurl \"https://shineiapi.vercel.app/api/v1/series?sort=rating\u0026genre=action\u0026page=2\"\n\n# Search within browse\ncurl \"https://shineiapi.vercel.app/api/v1/series?q=tower\u0026sort=popularity_rank\"\n```\n\n---\n\n### Series Detail\n\n```\nGET /api/v1/series/{slug}\n```\n\nGet complete information for a single series including metadata, ratings, cover images, authors, artists, and official sources.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `slug` | string | **Yes** | URL-friendly series identifier (e.g., `solo-leveling`, `nano-machine`). Spaces and special characters are auto-normalized. |\n| `include` | string | No | Pass `include=chapters` to embed the full chapter list in the response |\n\n\u003e **💡 Slug Normalization:** The API automatically normalizes slugs — spaces, underscores, and special characters are converted to hyphens. Both `/series/nano machine` and `/series/nano%20machine` resolve to `/series/nano-machine`.\n\n```bash\n# Standard response (chapters stripped)\ncurl https://shineiapi.vercel.app/api/v1/series/solo-leveling\n\n# Spaces in slug are auto-normalized\ncurl https://shineiapi.vercel.app/api/v1/series/nano%20machine\n\n# With full chapter list included\ncurl \"https://shineiapi.vercel.app/api/v1/series/solo-leveling?include=chapters\"\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e📋 Full Response Example\u003c/strong\u003e\u003c/summary\u003e\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"id\": \"abc-123\",\n    \"title\": \"Solo Leveling\",\n    \"slug\": \"solo-leveling\",\n    \"synopsis\": \"In a world where hunters must battle deadly monsters...\",\n    \"rating\": 9.8,\n    \"status\": \"Completed\",\n    \"type\": \"Manhwa\",\n    \"genres\": [\n      { \"id\": \"...\", \"name\": \"Action\", \"slug\": \"action\" },\n      { \"id\": \"...\", \"name\": \"Adventure\", \"slug\": \"adventure\" },\n      { \"id\": \"...\", \"name\": \"Fantasy\", \"slug\": \"fantasy\" }\n    ],\n    \"authors\": [{ \"id\": \"...\", \"name\": \"Chugong\", \"slug\": \"chugong\" }],\n    \"artists\": [{ \"id\": \"...\", \"name\": \"Jang Sung-Rak\", \"slug\": \"jang-sung-rak\" }],\n    \"alt_titles\": [\"나 혼자만 레벨업\", \"Solo Leveling\", \"I Level Up Alone\"],\n    \"cover\": {\n      \"small\": \"https://media.toraka.com/.../small.webp\",\n      \"large\": \"https://media.toraka.com/.../large.webp\"\n    },\n    \"official_sources\": [\n      { \"name\": \"KakaoPage\", \"url\": \"https://page.kakao.com/...\", \"language\": \"ko\", \"type\": \"original\" }\n    ],\n    \"popularity_rank\": 1,\n    \"score_ranking\": 12,\n    \"rating_count\": 5420,\n    \"bookmarks_count\": 12840,\n    \"chapters_count\": 201,\n    \"chapters\": [\n      {\n        \"id\": \"ch-201\",\n        \"order\": 201,\n        \"title\": \"Chapter 201\",\n        \"source\": \"KakaoPage\",\n        \"published_at\": \"2023-05-10T00:00:00.000Z\"\n      }\n    ]\n  },\n  \"timestamp\": \"2026-05-03T12:00:00.000Z\"\n}\n```\n\n\u003c/details\u003e\n\n---\n\n### Chapter List\n\n```\nGET /api/v1/series/{slug}/chapters\n```\n\nGet all chapters for a series with metadata including release dates, sources, and lock status.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `slug` | string | **Yes** | Series slug identifier |\n\n```bash\ncurl https://shineiapi.vercel.app/api/v1/series/solo-leveling/chapters\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e📋 Response Example\u003c/strong\u003e\u003c/summary\u003e\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    {\n      \"id\": \"ch-001\",\n      \"number\": \"Chapter 1\",\n      \"identifier\": \"ch-1\",\n      \"title\": \"Chapter 1\",\n      \"subtitle\": null,\n      \"released\": \"2018-03-04T00:00:00Z\",\n      \"is_locked\": false,\n      \"sources\": [\n        { \"id\": \"...\", \"name\": \"KakaoPage\", \"slug\": \"kakao-page\", \"url\": \"https://...\" }\n      ]\n    }\n  ],\n  \"timestamp\": \"2026-05-03T12:00:00.000Z\"\n}\n```\n\n\u003c/details\u003e\n\n---\n\n### Search\n\n```\nGET /api/v1/search?q={query}\n```\n\nFull-text search with optional filters. **Fully backward compatible** — only `q` is required.\n\n| Parameter | Type | Required | Default | Description |\n|-----------|------|----------|---------|-------------|\n| `q` | string | **Yes** | — | Search query (minimum 2 characters) |\n| `page` | integer | No | `1` | Page number |\n| `genre` | string | No | — | Genre slug filter (e.g., `action`, `fantasy`) |\n| `source` | string | No | — | Source name filter (e.g., `kakao-page`) |\n| `type` | string | No | — | Content type (e.g., `manhwa`, `manga`, `webtoon`) |\n| `status` | string | No | — | Release status (e.g., `releasing`, `completed`) |\n\n```bash\n# Basic search (backward compatible)\ncurl \"https://shineiapi.vercel.app/api/v1/search?q=tower+of+god\"\n\n# Search with filters\ncurl \"https://shineiapi.vercel.app/api/v1/search?q=solo\u0026genre=action\u0026type=manhwa\u0026status=completed\"\n\n# Paginated search\ncurl \"https://shineiapi.vercel.app/api/v1/search?q=nano\u0026page=2\"\n```\n\n---\n\n### Popular \u0026 Trending\n\n```\nGET /api/v1/popular\n```\n\nGet popular or trending series.\n\n| Parameter | Type | Required | Default | Description |\n|-----------|------|----------|---------|-------------|\n| `page` | integer | No | `1` | Page number |\n| `type` | string | No | `popular` | `popular` or `trending` |\n\n```bash\n# Popular series\ncurl https://shineiapi.vercel.app/api/v1/popular\n\n# Trending series, page 2\ncurl \"https://shineiapi.vercel.app/api/v1/popular?type=trending\u0026page=2\"\n```\n\n---\n\n### Random Series\n\n```\nGET /api/v1/random\n```\n\nReturns a random series from a curated list of popular titles. Great for discovery features.\n\n```bash\ncurl https://shineiapi.vercel.app/api/v1/random\n```\n\n---\n\n### Top Rated\n\n```\nGET /api/v1/top\n```\n\nReturns the highest-rated series sorted by rating in descending order.\n\n| Parameter | Type | Required | Default | Description |\n|-----------|------|----------|---------|-------------|\n| `limit` | integer | No | `10` | Number of results (max 20) |\n\n```bash\n# Top 10 (default)\ncurl https://shineiapi.vercel.app/api/v1/top\n\n# Top 5\ncurl \"https://shineiapi.vercel.app/api/v1/top?limit=5\"\n```\n\n---\n\n### Release Schedule\n\n```\nGET /api/v1/schedule\n```\n\nReturns release schedule organized by day of the week.\n\n| Parameter | Type | Required | Description |\n|-----------|------|----------|-------------|\n| `day` | string | No | Day of the week (e.g., `monday`, `tuesday`) |\n\n```bash\n# Full weekly schedule\ncurl https://shineiapi.vercel.app/api/v1/schedule\n\n# Monday releases only\ncurl \"https://shineiapi.vercel.app/api/v1/schedule?day=monday\"\n```\n\n---\n\n### Genres\n\n```\nGET /api/v1/genres\n```\n\nReturns all supported genres with names, slugs, and descriptions.\n\n```bash\ncurl https://shineiapi.vercel.app/api/v1/genres\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e📋 Response Example\u003c/strong\u003e\u003c/summary\u003e\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    { \"slug\": \"action\", \"name\": \"Action\", \"description\": \"High-energy stories featuring physical feats, combat, and adrenaline-pumping sequences.\" },\n    { \"slug\": \"fantasy\", \"name\": \"Fantasy\", \"description\": \"Stories set in worlds with magic, mythical creatures, and supernatural elements.\" },\n    { \"slug\": \"romance\", \"name\": \"Romance\", \"description\": \"Stories centered on love, relationships, and emotional connections.\" }\n  ],\n  \"timestamp\": \"2026-05-03T12:00:00.000Z\"\n}\n```\n\n\u003c/details\u003e\n\n---\n\n### Health Check\n\n```\nGET /api/v1/health\n```\n\nReturns API health status, upstream Toraka connectivity, cache statistics, and uptime. Returns `503` when upstream is degraded.\n\n```bash\ncurl https://shineiapi.vercel.app/api/v1/health\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e📋 Response Example\u003c/strong\u003e\u003c/summary\u003e\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"status\": \"healthy\",\n    \"version\": \"2.0.3\",\n    \"uptime\": { \"ms\": 86400000, \"human\": \"1d 0h 0m\" },\n    \"checks\": {\n      \"api\": \"healthy\",\n      \"upstream\": \"healthy\",\n      \"cache\": \"healthy\",\n      \"cacheStats\": {\n        \"entries\": 42,\n        \"maxEntries\": 1000,\n        \"hitRate\": \"78.5%\",\n        \"hits\": 1520,\n        \"misses\": 418\n      }\n    },\n    \"timestamp\": \"2026-05-03T12:00:00.000Z\"\n  }\n}\n```\n\n\u003c/details\u003e\n\n---\n\n### Stats\n\n```\nGET /api/v1/stats\n```\n\nReturns public API statistics including uptime, cache hit rate, and endpoint count.\n\n```bash\ncurl https://shineiapi.vercel.app/api/v1/stats\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e📋 Response Example\u003c/strong\u003e\u003c/summary\u003e\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"name\": \"ShineiAPI\",\n    \"version\": \"2.0.3\",\n    \"uptime\": { \"ms\": 86400000, \"human\": \"1d 0h 0m\" },\n    \"cache\": {\n      \"entries\": 42,\n      \"hitRate\": \"78.5%\",\n      \"hits\": 1520,\n      \"misses\": 418\n    },\n    \"endpoints\": 10,\n    \"rate_limit\": { \"max_requests\": 60, \"window\": \"60s\" },\n    \"analytics\": {\n      \"total_requests\": 12450,\n      \"top_endpoints\": [\n        { \"path\": \"/api/v1/search\", \"count\": 4200 },\n        { \"path\": \"/api/v1/series/{slug}\", \"count\": 3100 }\n      ],\n      \"top_queries\": [\n        { \"query\": \"solo leveling\", \"count\": 890 }\n      ],\n      \"errors\": { \"404\": 45, \"429\": 12 },\n      \"response_times\": { \"avg_ms\": 85, \"max_ms\": 1200 }\n    }\n  }\n}\n```\n\n\u003c/details\u003e\n\n---\n\n## 📋 Response Format\n\nEvery API response follows a consistent envelope format:\n\n### Success\n\n```json\n{\n  \"success\": true,\n  \"data\": { ... },\n  \"timestamp\": \"2026-05-03T12:00:00.000Z\"\n}\n```\n\n### Success with Pagination\n\n```json\n{\n  \"success\": true,\n  \"data\": [...],\n  \"pagination\": {\n    \"last_visible_page\": 10,\n    \"has_next_page\": true,\n    \"current_page\": 1,\n    \"items\": {\n      \"count\": 25,\n      \"total\": 250,\n      \"per_page\": 25\n    }\n  },\n  \"timestamp\": \"2026-05-03T12:00:00.000Z\"\n}\n```\n\n### Error\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"SERIES_NOT_FOUND\",\n    \"message\": \"Series 'invalid-slug' not found. Check the slug and try again.\",\n    \"status\": 404\n  },\n  \"timestamp\": \"2026-05-03T12:00:00.000Z\"\n}\n```\n\n---\n\n## 🛡️ Rate Limiting\n\n| Setting | Value |\n|---------|-------|\n| **Limit** | 60 requests per minute |\n| **Window** | Rolling 60-second window |\n| **Scope** | Per IP address |\n\n### Response Headers\n\nEvery API response includes rate limit information:\n\n| Header | Description |\n|--------|-------------|\n| `X-RateLimit-Limit` | Maximum requests allowed (60) |\n| `X-RateLimit-Remaining` | Requests remaining in current window |\n| `X-Request-ID` | Unique request ID for tracing |\n| `Retry-After` | Seconds to wait (only on 429 responses) |\n\n### Handling Rate Limits\n\n```javascript\nconst response = await fetch('https://shineiapi.vercel.app/api/v1/series/solo-leveling');\n\nif (response.status === 429) {\n  const retryAfter = response.headers.get('Retry-After');\n  console.log(`Rate limited. Retry after ${retryAfter} seconds.`);\n  await new Promise(r =\u003e setTimeout(r, retryAfter * 1000));\n  // Retry the request...\n}\n\n// Track request ID for debugging\nconst requestId = response.headers.get('X-Request-ID');\nconsole.log(`Request ID: ${requestId}`);\n```\n\n---\n\n## ⚡ Caching\n\n| Resource | Cache TTL | Description |\n|----------|-----------|-------------|\n| Series detail | 5 minutes | Individual series data |\n| Browse series | 5 minutes | Series listing with filters |\n| Chapter lists | 5 minutes | Chapter listings per series |\n| Search results | 10 minutes | Search query results |\n| Popular/Trending | 5 minutes | Popular and trending lists |\n| Top/Schedule | 15 minutes | Rankings and schedules |\n| Random series | 2 minutes | Random endpoint (shorter for variety) |\n| Genres | ∞ (static) | Genre list rarely changes |\n\nResponses include Vercel's CDN cache headers (`Cache-Control: s-maxage=300`), so edge caching further reduces latency for repeated requests.\n\n---\n\n## ❌ Error Handling\n\n### HTTP Status Codes\n\n| Code | Status | Description |\n|------|--------|-------------|\n| `200` | OK | Request successful |\n| `400` | Bad Request | Invalid parameters or missing required fields |\n| `404` | Not Found | The requested resource does not exist |\n| `429` | Too Many Requests | Rate limit exceeded (60 req/min) |\n| `502` | Bad Gateway | Upstream API returned an error |\n| `503` | Service Unavailable | API is degraded (check `/health`) |\n| `504` | Gateway Timeout | Upstream API request timed out |\n\n### Error Codes\n\n| Code | Description |\n|------|-------------|\n| `MISSING_QUERY` | Search query `q` is required |\n| `QUERY_TOO_SHORT` | Search query must be at least 2 characters |\n| `MISSING_SLUG` | Series slug is required |\n| `SERIES_NOT_FOUND` | No series found with the given slug |\n| `INVALID_SORT` | Invalid sort parameter |\n| `INVALID_PAGE` | Page must be a positive integer |\n| `INVALID_TYPE` | Invalid popular/trending type |\n| `INVALID_DAY` | Invalid day of the week |\n| `RATE_LIMIT_EXCEEDED` | Too many requests (60/min) |\n| `UPSTREAM_TIMEOUT` | Toraka API request timed out |\n| `UPSTREAM_ERROR` | Toraka API returned an error |\n| `UPSTREAM_RATE_LIMIT` | Toraka API rate limit hit |\n| `INTERNAL_ERROR` | Unexpected server error |\n\n---\n\n## 📨 Request Headers\n\n### Sent by ShineiAPI\n\n| Header | Value | Description |\n|--------|-------|-------------|\n| `Content-Type` | `application/json` | Response format |\n| `X-Powered-By` | `ShineiAPI v2.0.3` | API identifier |\n| `X-RateLimit-Limit` | `60` | Max requests per window |\n| `X-RateLimit-Remaining` | `59` | Remaining requests |\n| `X-Request-ID` | `uuid` | Unique request ID |\n| `X-API-Version | `2.0.3` | API version | API version |\n| `Access-Control-Allow-Origin` | `*` | CORS allowed origin |\n| `Cache-Control` | `public, s-maxage=300` | CDN cache directive |\n\n### Accepted by ShineiAPI\n\n| Header | Description |\n|--------|-------------|\n| `Accept` | `application/json` (default) |\n| `Origin` | Used for CORS |\n| `X-Forwarded-For` | Client IP detection |\n| `X-Real-IP` | Client IP detection |\n\n---\n\n## 📋 OpenAPI Specification\n\nShineiAPI provides a full **OpenAPI 3.1** specification for machine-readable API documentation.\n\n| Resource | URL |\n|----------|-----|\n| **Spec File** | [`/openapi.yaml`](https://shineiapi.vercel.app/openapi.yaml) |\n| **Swagger UI** | [Open in Editor](https://editor.swagger.io/?url=https://shineiapi.vercel.app/openapi.yaml) |\n| **Postman** | Import the spec directly into Postman |\n| **Code Generators** | Use `openapi-generator` to generate SDKs in any language |\n\n```bash\n# Download the spec\ncurl https://shineiapi.vercel.app/openapi.yaml\n\n# Generate a Python SDK\nnpx @openapitools/openapi-generator-cli generate \\\n  -i https://shineiapi.vercel.app/openapi.yaml \\\n  -g python \\\n  -o ./shineiapi-python\n```\n\n---\n\n## 💻 Code Examples\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eJavaScript (fetch)\u003c/strong\u003e\u003c/summary\u003e\n\n```javascript\n// Get series details\nconst res = await fetch('https://shineiapi.vercel.app/api/v1/series/solo-leveling');\nconst { success, data } = await res.json();\n\nif (success) {\n  console.log(`Title: ${data.title}`);\n  console.log(`Rating: ${data.rating}`);\n  console.log(`Chapters: ${data.chapters_count}`);\n  console.log(`Status: ${data.status}`);\n}\n\n// Search with filters\nconst search = await fetch(\n  'https://shineiapi.vercel.app/api/v1/search?q=nano+machine\u0026genre=action'\n);\nconst { data: results } = await search.json();\nresults.forEach(series =\u003e {\n  console.log(`${series.title} — ${series.rating} ⭐`);\n});\n\n// Random discovery\nconst random = await fetch('https://shineiapi.vercel.app/api/v1/random');\nconst { data: randomSeries } = await random.json();\nconsole.log(`Try this: ${randomSeries.title}`);\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eJavaScript (axios)\u003c/strong\u003e\u003c/summary\u003e\n\n```javascript\nimport axios from 'axios';\n\nconst api = axios.create({\n  baseURL: 'https://shineiapi.vercel.app/api/v1',\n});\n\n// Browse with filters\nconst { data } = await api.get('/series', {\n  params: { sort: 'rating', genre: 'fantasy', page: 1 }\n});\n\ndata.data.forEach((series, i) =\u003e {\n  console.log(`#${i + 1} ${series.title} — Rating: ${series.rating}`);\n});\n\n// Popular trending\nconst trending = await api.get('/popular', { params: { type: 'trending' } });\nconsole.log(`Trending: ${trending.data.data.length} series`);\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003ePython\u003c/strong\u003e\u003c/summary\u003e\n\n```python\nimport requests\n\nBASE_URL = \"https://shineiapi.vercel.app/api/v1\"\n\n# Get a random series\nresponse = requests.get(f\"{BASE_URL}/random\")\ndata = response.json()\n\nif data[\"success\"]:\n    series = data[\"data\"]\n    print(f\"Title: {series['title']}\")\n    print(f\"Rating: {series['rating']}\")\n    print(f\"Type: {series['type']}\")\n    print(f\"Genres: {', '.join(g['name'] for g in series['genres'])}\")\n\n# Search with filters\nresponse = requests.get(f\"{BASE_URL}/search\", params={\n    \"q\": \"tower of god\",\n    \"genre\": \"fantasy\",\n    \"type\": \"manhwa\"\n})\nresults = response.json()[\"data\"]\nfor series in results:\n    print(f\"{series['title']}: {series['chapters_count']} chapters\")\n\n# Browse sorted by rating\nresponse = requests.get(f\"{BASE_URL}/series\", params={\n    \"sort\": \"rating\",\n    \"genre\": \"action\",\n    \"page\": 1\n})\ntop_series = response.json()[\"data\"]\nfor s in top_series[:5]:\n    print(f\"{s['title']} — {s['rating']} ⭐\")\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003ecURL + jq\u003c/strong\u003e\u003c/summary\u003e\n\n```bash\n# Get series details\ncurl -s https://shineiapi.vercel.app/api/v1/series/solo-leveling | jq '.data.title'\n\n# Search and extract names\ncurl -s \"https://shineiapi.vercel.app/api/v1/search?q=eleceed\" | jq '.data[].title'\n\n# Browse top-rated fantasy\ncurl -s \"https://shineiapi.vercel.app/api/v1/series?sort=rating\u0026genre=fantasy\" | jq '.data[0:5]'\n\n# Get chapters count\ncurl -s https://shineiapi.vercel.app/api/v1/series/nano-machine/chapters | jq '.data | length'\n\n# Health check\ncurl -s https://shineiapi.vercel.app/api/v1/health | jq '.data.status'\n\n# Pretty print random series\ncurl -s https://shineiapi.vercel.app/api/v1/random | jq .\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eGo\u003c/strong\u003e\u003c/summary\u003e\n\n```go\npackage main\n\nimport (\n    \"encoding/json\"\n    \"fmt\"\n    \"net/http\"\n)\n\ntype Response struct {\n    Success bool        `json:\"success\"`\n    Data    interface{} `json:\"data\"`\n}\n\nfunc main() {\n    // Get series\n    resp, _ := http.Get(\"https://shineiapi.vercel.app/api/v1/series/solo-leveling\")\n    defer resp.Body.Close()\n\n    var result Response\n    json.NewDecoder(resp.Body).Decode(\u0026result)\n    fmt.Printf(\"Success: %v\\n\", result.Success)\n\n    // Check health\n    health, _ := http.Get(\"https://shineiapi.vercel.app/api/v1/health\")\n    defer health.Body.Close()\n    fmt.Printf(\"Health Status: %d\\n\", health.StatusCode)\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003ePHP\u003c/strong\u003e\u003c/summary\u003e\n\n```php\n\u003c?php\n// Get series details\n$response = file_get_contents('https://shineiapi.vercel.app/api/v1/series/solo-leveling');\n$data = json_decode($response, true);\n\nif ($data['success']) {\n    echo \"Title: \" . $data['data']['title'] . \"\\n\";\n    echo \"Rating: \" . $data['data']['rating'] . \"\\n\";\n}\n\n// Search with filters\n$search = file_get_contents(\n    'https://shineiapi.vercel.app/api/v1/search?q=naruto\u0026genre=action'\n);\n$results = json_decode($search, true);\nforeach ($results['data'] as $series) {\n    echo $series['title'] . \"\\n\";\n}\n?\u003e\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eRuby\u003c/strong\u003e\u003c/summary\u003e\n\n```ruby\nrequire 'net/http'\nrequire 'json'\n\n# Get series\nuri = URI('https://shineiapi.vercel.app/api/v1/series/solo-leveling')\nresponse = JSON.parse(Net::HTTP.get(uri))\n\nputs \"Title: #{response['data']['title']}\"\nputs \"Rating: #{response['data']['rating']}\"\n\n# Search\nuri = URI('https://shineiapi.vercel.app/api/v1/search?q=tower+of+god\u0026genre=fantasy')\nsearch = JSON.parse(Net::HTTP.get(uri))\nsearch['data'].each { |s| puts \"#{s['title']} — #{s['rating']}⭐\" }\n```\n\n\u003c/details\u003e\n\n---\n\n## 🛠️ Tech Stack\n\n| Component | Technology | Purpose |\n|-----------|------------|---------|\n| **Runtime** | Node.js 18+ | Server-side JavaScript |\n| **Framework** | Next.js 14 (App Router) | API routes, SSR, middleware |\n| **Data Source** | Toraka API | Upstream manga/manhwa data |\n| **Caching** | In-memory (Map) | Response caching with configurable TTL |\n| **Rate Limiting** | Custom middleware | Sliding window algorithm per IP |\n| **Styling** | Tailwind CSS 3 | Neo-brutalist × Apple hybrid — frosted glass, soft shadows, spring animations |\n| **Deployment** | Vercel | Serverless edge functions |\n| **CI/CD** | GitHub Actions | Automated lint + build |\n| **Documentation** | OpenAPI 3.1 | Machine-readable API spec |\n| **API Playground** | Client-side Fetch | Live endpoint testing with JSON preview |\n| **Version Control** | Git / GitHub | Source code management |\n\n---\n\n## 📁 Project Structure\n\n```\nShineiAPI/\n├── .github/\n│   └── workflows/\n│       └── ci.yml                        # GitHub Actions CI pipeline\n├── public/\n│   ├── banner.svg/png                    # Neo-brutalist README banner\n│   ├── favicon.svg                       # Site favicon\n│   ├── logo.png / logo.svg               # Logo (raster + vector)\n│   ├── og-image.png                      # Open Graph social image\n│   ├── openapi.yaml                      # OpenAPI 3.1 specification\n│   ├── robots.txt                        # Search engine crawl rules\n│   ├── sitemap.xml                       # XML sitemap for SEO\n│   └── screenshots/                      # Documentation screenshots\n├── src/\n│   ├── app/\n│   │   ├── api/\n│   │   │   ├── og/route.js               # Dynamic OG image generation (@vercel/og)\n│   │   │   └── v1/\n│   │   │   ├── genres/route.js           # GET /api/v1/genres\n│   │   │   ├── health/route.js           # GET /api/v1/health\n│   │   │   ├── popular/route.js          # GET /api/v1/popular\n│   │   │   ├── random/route.js           # GET /api/v1/random\n│   │   │   ├── schedule/route.js         # GET /api/v1/schedule\n│   │   │   ├── search/route.js           # GET /api/v1/search\n│   │   │   ├── series/\n│   │   │   │   ├── route.js              # GET /api/v1/series (browse)\n│   │   │   │   └── [slug]/\n│   │   │   │       ├── route.js          # GET /api/v1/series/:slug\n│   │   │   │       └── chapters/\n│   │   │   │           └── route.js      # GET /api/v1/series/:slug/chapters\n│   │   │   ├── stats/route.js            # GET /api/v1/stats\n│   │   │   └── top/route.js              # GET /api/v1/top\n│   │   ├── browse/\n│   │   │   ├── BrowseContent.js          # Live browse page with search, trending, popular\n│   │   │   ├── page.js                   # Browse route\n│   │   │   ├── genres/\n│   │   │   │   ├── GenresContent.js      # Genre grid with color-coded cards\n│   │   │   │   └── page.js               # Genres route\n│   │   │   └── series/[slug]/\n│   │   │       ├── SeriesContent.js      # Deep-linkable series detail page\n│   │   │       └── page.js               # Series route with dynamic OG metadata\n│   │   ├── docs/\n│   │   │   ├── layout.js                 # Docs layout with sidebar\n│   │   │   └── page.js                   # Full API documentation\n│   │   ├── terms/page.js                 # Terms of Service\n│   │   ├── privacy/page.js               # Privacy Policy\n│   │   ├── support/page.js               # Support \u0026 FAQ page\n│   │   ├── not-found.js                  # Custom 404 page\n│   │   ├── error.js                      # Root error boundary\n│   │   ├── loading.js                    # Root loading state\n│   │   ├── globals.css                   # Design system (tokens, animations)\n│   │   ├── layout.js                     # Root layout with SEO metadata\n│   │   └── page.js                       # Landing page\n│   ├── components/\n│   │   ├── icons.js                      # SVG icon library (35+ icons)\n│   │   ├── ApiPlayground.js              # Live API testing playground\n│   │   ├── BackToTop.js                  # Back-to-top floating button\n│   │   ├── DocsSearch.js                 # ⌘K searchable docs modal\n│   │   ├── Footer.js                     # Shared footer component\n│   │   ├── LandingNav.js                 # Landing page frosted nav\n│   │   ├── LegalLayout.js               # Shared layout for ToS/Privacy/Support\n│   │   ├── Pagination.js                # Numbered page navigation\n│   │   └── ScrollProgress.js             # Scroll progress bar\n│   ├── lib/\n│   │   ├── analytics.js                  # API usage analytics (endpoints, queries, errors)\n│   │   ├── cache.js                      # In-memory cache with TTL\n│   │   ├── constants.js                  # Config, genres, types, statuses\n│   │   ├── response.js                   # Standardized response builders\n│   │   └── toraka.js                     # Toraka API client with caching\n│   └── middleware.js                     # Rate limiting, CORS, X-Request-ID\n├── .env.example                          # Environment variable template\n├── .gitignore\n├── CHANGELOG.md                          # Version history\n├── CONTRIBUTING.md                       # Contribution guidelines\n├── LICENSE                               # MIT License\n├── README.md                             # This file\n├── jsconfig.json                         # JavaScript path aliases\n├── next.config.mjs                       # Next.js configuration\n├── package.json                          # Dependencies and scripts\n├── postcss.config.js                     # PostCSS configuration\n├── sitemap.config.js                     # Sitemap generation config\n├── tailwind.config.js                    # Tailwind CSS configuration\n└── vercel.json                           # Vercel deployment config\n```\n\n---\n\n## 🧑‍💻 Local Development\n\n### Prerequisites\n\n- [Node.js](https://nodejs.org/) 18 or later\n- [npm](https://npmjs.com/) 9 or later\n- [Git](https://git-scm.com/)\n\n### Setup\n\n```bash\n# 1. Clone the repository\ngit clone https://github.com/Shineii86/ShineiAPI.git\ncd ShineiAPI\n\n# 2. Install dependencies\nnpm install\n\n# 3. Copy environment file\ncp .env.example .env.local\n\n# 4. Start development server\nnpm run dev\n```\n\nThe API will be available at [http://localhost:3000](http://localhost:3000).\n\n### Available Scripts\n\n| Script | Command | Description |\n|--------|---------|-------------|\n| `npm run dev` | `next dev` | Start development server with hot reload |\n| `npm run build` | `next build` | Build for production |\n| `npm start` | `next start` | Start production server |\n| `npm run lint` | `next lint` | Run ESLint |\n\n### Testing Locally\n\n```bash\n# Health check\ncurl http://localhost:3000/api/v1/health\n\n# Browse series\ncurl \"http://localhost:3000/api/v1/series?sort=rating\u0026genre=action\"\n\n# Search with filters\ncurl \"http://localhost:3000/api/v1/search?q=solo\u0026status=completed\"\n\n# Random series\ncurl http://localhost:3000/api/v1/random\n\n# Top rated\ncurl http://localhost:3000/api/v1/top\n```\n\n### Environment Variables\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `TORAKA_BASE_URL` | `https://core.toraka.com/api/v1` | Upstream Toraka API URL |\n| `CACHE_TTL` | `300` | Cache TTL in seconds (5 min) |\n| `RATE_LIMIT_MAX` | `60` | Max requests per minute per IP |\n| `NODE_ENV` | `production` | Environment mode |\n| `NEXT_PUBLIC_SITE_URL` | `https://shineiapi.vercel.app` | Public site URL |\n\n---\n\n## 🚀 Deployment\n\n### Vercel (Recommended)\n\nThe easiest way to deploy ShineiAPI:\n\n1. **Fork** this repository\n2. Go to [vercel.com/new](https://vercel.com/new)\n3. **Import** your forked repository\n4. Click **Deploy** — no environment variables needed!\n\n[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/Shineii86/ShineiAPI)\n\n### Other Platforms\n\nShineiAPI is a standard Next.js application. Deploy anywhere that supports Node.js:\n\n| Platform | Command | Notes |\n|----------|---------|-------|\n| **Vercel** | `vercel` | Zero config, recommended |\n| **Railway** | `railway up` | Easy setup |\n| **Render** | Connect repo | Auto-deploy on push |\n| **Fly.io** | `fly deploy` | Edge deployment |\n| **Netlify** | Connect repo | With Next.js adapter |\n| **Self-hosted** | `npm run build \u0026\u0026 npm start` | Full control |\n\n---\n\n## 🤝 Contributing\n\nContributions are welcome and appreciated! Here's how to help:\n\n### Ways to Contribute\n\n- 🐛 **Report bugs** — [Open an issue](https://github.com/Shineii86/ShineiAPI/issues/new?assignees=\u0026labels=bug\u0026template=bug_report.md)\n- ✨ **Request features** — [Open an issue](https://github.com/Shineii86/ShineiAPI/issues/new?assignees=\u0026labels=enhancement\u0026template=feature_request.md)\n- 📖 **Improve docs** — Fix typos, add examples, clarify explanations\n- 🌍 **Add translations** — Help translate documentation\n- 🔧 **Submit code** — Fix bugs or implement new features\n\n### Development Workflow\n\n```bash\n# 1. Fork the repository\n# 2. Clone your fork\ngit clone https://github.com/YOUR_USERNAME/ShineiAPI.git\ncd ShineiAPI\n\n# 3. Create a feature branch\ngit checkout -b feature/amazing-feature\n\n# 4. Make your changes\n# 5. Test thoroughly\nnpm run build\n\n# 6. Commit with conventional commits\ngit commit -m 'feat: add amazing feature'\n\n# 7. Push and create a Pull Request\ngit push origin feature/amazing-feature\n```\n\n### Commit Convention\n\n```\ntype(scope): description\n\nfeat(search): add pagination support\nfix(series): handle missing cover images\ndocs(readme): update quick start guide\nrefactor(cache): improve TTL handling\nchore(deps): update dependencies\n```\n\nTypes: `feat`, `fix`, `docs`, `refactor`, `test`, `chore`\n\nPlease read [CONTRIBUTING.md](CONTRIBUTING.md) for detailed guidelines.\n\n---\n\n## ❓ FAQ\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eIs ShineiAPI really free?\u003c/strong\u003e\u003c/summary\u003e\n\nYes! ShineiAPI is completely free and always will be. No API keys, no sign-ups, no hidden costs. Funded by the community and maintained by volunteers.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eDo I need an API key?\u003c/strong\u003e\u003c/summary\u003e\n\nNo! Just make a request and get your data. Zero authentication required.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWhat are the rate limits?\u003c/strong\u003e\u003c/summary\u003e\n\n60 requests per minute per IP address. Rate limit headers are included in every response. If you hit the limit, check the `Retry-After` header.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eCan I use this in my frontend?\u003c/strong\u003e\u003c/summary\u003e\n\nYes! CORS is enabled for all origins. You can call the API directly from any browser, mobile app, or desktop application.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eWhere does the data come from?\u003c/strong\u003e\u003c/summary\u003e\n\nShineiAPI wraps the Toraka API (toraka.com), normalizing and caching the data for easier consumption. ShineiAPI is not affiliated with or endorsed by Toraka.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eHow often is the data updated?\u003c/strong\u003e\u003c/summary\u003e\n\nData is fetched from Toraka in real-time and cached for 2–15 minutes depending on the endpoint. This balances freshness with performance.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eCan I use this commercially?\u003c/strong\u003e\u003c/summary\u003e\n\nYes! ShineiAPI is released under the MIT License, which allows commercial use. Please be mindful of the rate limits.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eCan I self-host this?\u003c/strong\u003e\u003c/summary\u003e\n\nYes! Clone the repo, run `npm install`, and deploy to Vercel, Railway, Render, Fly.io, or any Node.js host. See [Deployment](#-deployment).\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eHow do I report a bug?\u003c/strong\u003e\u003c/summary\u003e\n\nOpen an issue on our [GitHub Issues](https://github.com/Shineii86/ShineiAPI/issues) page with steps to reproduce.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eIs there an OpenAPI/Swagger spec?\u003c/strong\u003e\u003c/summary\u003e\n\nYes! The full OpenAPI 3.1 spec is available at [`/openapi.yaml`](https://shineiapi.vercel.app/openapi.yaml). You can import it into Postman, Swagger UI, or use it to generate client SDKs.\n\u003c/details\u003e\n\n---\n\n## ⚠️ Legal Disclaimer\n\nThis project is **unofficial** and **not affiliated with or endorsed by Toraka**.\n\n- This API acts as a middleware/proxy to the official Toraka backend\n- No content is hosted or redistributed\n- Rate limiting is enforced to avoid overloading upstream\n- Use responsibly and respect the original site's terms of service\n\n---\n\n## 📜 Legal\n\n- **[Terms of Service](https://shineiapi.vercel.app/terms)** — Rules governing API usage\n- **[Privacy Policy](https://shineiapi.vercel.app/privacy)** — Data collection and privacy practices\n- **[MIT License](https://github.com/Shineii86/ShineiAPI/blob/main/LICENSE)** — Open source license\n\n---\n\n## 📝 Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for a detailed version history.\n\n### Latest: v2.0.3 (2026-05-11)\n\n- **Infinite scroll marquee** — Seamless looping keyword banner on landing page (pauses on hover, responsive)\n- **Dynamic imports** — `ApiPlayground` lazy-loaded with `next/dynamic` on landing + docs pages\n- **Removed redundant fonts** — Eliminated 4 unused Google Fonts; kept only self-hosted `next/font` trio\n- **Deduplicated SVG icons** — Removed 5 local icon redefinitions, all import from shared `icons.js`\n- **Shared Footer component** — Extracted `Footer.js` to eliminate copy-pasted footers across all pages\n- **Bug fixes** — Duplicate `style` attribute on EndpointRow, duplicate chapter date rendering, invalid client-side fetch option\n\n### Previous: v2.0.2 (2026-05-10)\n\n- **`next/font` optimization** — Space Grotesk, Inter, JetBrains Mono loaded via next/font (zero layout shift, auto subsetting)\n- **Server Component split** — page.js is now a proper server component with metadata export for SEO\n- **Integrated unused components** — BackToTop, ScrollProgress now live in production\n- **Fixed observer leak** — Extracted useInView calls into dedicated sub-components (Reveal, StatItem, FeatureCard, EndpointRow)\n- **Relative API URLs** — ApiPlayground works in local dev, staging, and production\n- **Version sync** — All source files synced to v2.0.2\n- **iOS/macOS polish** — Frosted glass nav, soft layered shadows, spring-physics animations, Apple system font stack\n\n---\n\n## 📄 License\n\nThis project is licensed under the **MIT License** — see the [LICENSE](LICENSE) file for details.\n\n---\n\n## 🙏 Acknowledgments\n\n| Project | Description |\n|---------|-------------|\n| [Toraka](https://toraka.com) | The underlying manga/manhwa data provider |\n| [Jikan API](https://jikan.moe) | Inspiration — the unofficial MyAnimeList API |\n| [Next.js](https://nextjs.org) | The React framework for production |\n| [Vercel](https://vercel.com) | Deployment and hosting platform |\n| [Tailwind CSS](https://tailwindcss.com) | Utility-first CSS framework |\n| [OpenAPI](https://www.openapis.org/) | API specification standard |\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**Built with ❤️ by [Shinei Nouzen](https://github.com/Shineii86)**\n\n\u003cbr /\u003e\n\n\u003ca href=\"https://github.com/Shineii86/ShineiAPI/stargazers\"\u003e⭐ Star this repo\u003c/a\u003e ·\n\u003ca href=\"https://github.com/Shineii86/ShineiAPI/fork\"\u003e🍴 Fork it\u003c/a\u003e ·\n\u003ca href=\"https://github.com/Shineii86/ShineiAPI/issues/new\"\u003e🐛 Report issue\u003c/a\u003e\n\n\u003cbr /\u003e\n\n\u003cimg src=\"https://api.star-history.com/svg?repos=Shineii86/ShineiAPI\u0026type=Date\" alt=\"Star History Chart\" width=\"600\" /\u003e\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshineii86%2Fshineiapi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshineii86%2Fshineiapi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshineii86%2Fshineiapi/lists"}