Note
The Old Deployment URL https://aninewsapi.vercel.app Is No Longer Accessible. Use The Current URL: https://aninews.vercel.app
A serverless API aggregating anime news from 7 sources in real-time.
Smart caching, keyword search, RSS feeds, date filtering, cursor pagination, and source health monitoring.
Built for speed, reliability, and the anime community.
Table of Contents β’ Features β’ API Docs β’ Quick Start β’ Deployment β’ Contributing
- Overview
- Features
- News Sources
- Tech Stack
- Architecture
- Project Structure
- Quick Start
- Configuration
- API Endpoints
- API Response Schema
- Deployment
- Available Scripts
- Performance
- Changelog Highlights
- Troubleshooting
- FAQ
- Roadmap
- Contributing
- Acknowledgements
- License
- Author
- Star History
AniNewsAPI is a serverless anime news aggregation API that scrapes, deduplicates, and serves articles from 7 major anime news sources β all through a clean REST API with zero database setup.
π‘ No database, no auth for reads, no complex setup. Just deploy to Vercel and you have a production API.
- π° 7 Sources β ANN, MAL, Crunchyroll, Anime Corner, Otaku USA, Anime Herald, Comic Book
- β‘ Smart Caching β Two-tier cache (memory + disk) with 10-minute TTL, survives serverless cold starts
- π Full-Text Search β Relevance-scored search across titles, excerpts, sources, and tags
- ποΈ RSS Feeds β Standards-compliant RSS 2.0 for any feed reader
- π Full Article Extraction β Get readable article content by slug
- π·οΈ Tag Filtering β Browse articles by tag with count aggregation
- π Source Health β Real-time per-source health checks, latency, and article counts
- π CORS Enabled β Works from any frontend, no proxy needed
- π Zero-Config Deploy β One click to Vercel, or run standalone with Express
flowchart TD
A["π Client Request<br/>(Browser / App / curl)"] --> B["π‘οΈ Vercel Edge / Express Server<br/>CORS Β· Security Headers Β· Rate Limiting"]
B --> C{"πΎ Cache Check<br/>(node-cache + disk)"}
C -- HIT --> D["β‘ Return Cached Response<br/>~200ms"]
C -- MISS --> E["π° 7 Concurrent Fetchers"]
E --> E1["ANN"]
E --> E2["MAL"]
E --> E3["Crunchyroll"]
E --> E4["Anime Corner"]
E --> E5["Otaku USA"]
E --> E6["Anime Herald"]
E --> E7["Comic Book"]
E1 & E2 & E3 & E4 & E5 & E6 & E7 --> F["π RSS / Google News RSS / Web Scraping<br/>3 retries Β· 15s timeout Β· exponential backoff"]
F --> G["π§Ή Deduplicate Β· Enrich Β· Cache"]
G --> H["π€ Respond<br/>JSON Β· RSS 2.0 XML Β· SSE"]
style A fill:#1e1e2e,stroke:#a78bfa,color:#f1f5f9
style B fill:#1e1e2e,stroke:#6366f1,color:#f1f5f9
style C fill:#1e1e2e,stroke:#f43f8e,color:#f1f5f9
style D fill:#1e1e2e,stroke:#22c55e,color:#f1f5f9
style E fill:#1e1e2e,stroke:#a855f7,color:#f1f5f9
style F fill:#1e1e2e,stroke:#eab308,color:#f1f5f9
style G fill:#1e1e2e,stroke:#06b6d4,color:#f1f5f9
style H fill:#1e1e2e,stroke:#22c55e,color:#f1f5f9
|
|
|
|
| Feature | Description | Status |
|---|---|---|
| π° 7 News Sources | ANN, MAL, Crunchyroll, Anime Corner, Otaku USA, Anime Herald, Comic Book | β |
| β‘ Smart Caching | Two-tier (memory + disk) with 10-min TTL | β |
| π Full-Text Search | Relevance scoring β title (10pts) vs excerpt (3pts) | β |
| π Article Extraction | Full content parsing from original URLs | β |
| ποΈ RSS 2.0 Feed | Standards-compliant XML with media:thumbnail | β |
| π Date Filtering | ?from=YYYY-MM-DD&to=YYYY-MM-DD on news & search |
β |
| π Cursor Pagination | Opaque base64url cursors for stable paging | β |
| π·οΈ Tag System | Tag listing with counts, filter by tag | β |
| π Source Health | Real-time fetch status, latency, article counts | β |
| π Cache Auth | API key protection for cache clear endpoint | β |
| π‘ SSE Stream | Server-Sent Events for real-time push | β |
| π OpenAPI Spec | Machine-readable 3.0.3 specification | β |
| π One-Click Deploy | Vercel button deployment | β |
| ποΈ Express Mode | Standalone server with npm start |
β |
| Source | Key | Method | Articles | Website |
|---|---|---|---|---|
| Anime News Network | ann |
Google News RSS | ~15 | animenewsnetwork.com |
| Anime Corner | animecorner |
RSS Feed | ~12 | animecorner.me |
| MyAnimeList | myanimelist |
Direct Scraping | ~15 | myanimelist.net |
| Otaku USA Magazine | otakuusa |
Google News RSS | ~12 | otakuusamagazine.com |
| Crunchyroll | crunchyroll |
Google News RSS | ~15 | crunchyroll.com/news |
| Anime Herald | animeherald |
RSS Feed | ~10 | animeherald.com |
| Comic Book | comicbook |
Direct Scraping | ~10 | comicbook.com/anime |
Total: 60+ unique articles after cross-source deduplication
- Create
utils/fetchNewSource.jsβ export async function returning[{ title, slug, source, excerpt, date, image, link, tags }] - Register in
utils/sources.jsβSOURCESobject - Test with
npm test, submit a PR
| Technology | Purpose | Version | Documentation |
|---|---|---|---|
| π’ Node.js | JavaScript runtime | >= 20 | Docs |
| β‘ Express | HTTP server framework | 5.1 | Docs |
| β² Vercel Functions | Serverless deployment | β | Docs |
| π Cheerio | HTML parsing & scraping | 1.0 | Docs |
| π Axios | HTTP client | 1.7 | Docs |
| π‘ rss-parser | RSS/Atom feed parsing | 3.13 | Docs |
| πΎ node-cache | In-memory caching | 5.1 | Docs |
| π€ he | HTML entity decoding | 1.2 | Docs |
{
"express": "^5.1.0", // HTTP server
"axios": "^1.7.2", // HTTP client for scraping
"cheerio": "^1.0.0-rc.12", // HTML parsing
"rss-parser": "^3.13.0", // RSS feed parsing
"node-cache": "^5.1.2", // In-memory cache
"he": "^1.2.0" // HTML entity decoding
}| Stage | Component | Description |
|---|---|---|
| 1 | Client | Browser, app, or curl sends request |
| 2 | Vercel Edge / Express | Routes request, applies CORS + security headers + rate limit |
| 3 | Cache Check | node-cache with 10-min TTL β hit = instant response |
| 4 | Fetch Sources | 7 concurrent scrapers (3 retries each, 15s timeout) |
| 5 | Deduplicate | Cross-source dedup by normalized title |
| 6 | Enrich & Respond | Filter, paginate, sort, format β JSON/RSS/SSE |
flowchart TD
A["π₯ Request"] --> B{"π§ Memory Cache<br/>(node-cache)"}
B -- HIT --> C["β‘ Return Cached<br/>~200ms"]
B -- MISS --> D{"πΎ Disk Cache<br/>(JSON files)"}
D -- HIT --> E["π Promote to Memory<br/>Return"]
D -- MISS --> F["π° Fetch from 7 Sources<br/>(concurrent)"]
F --> G["πΎ Cache Result<br/>(memory + disk)"]
G --> H["π€ Return Fresh"]
style A fill:#1e1e2e,stroke:#a78bfa,color:#f1f5f9
style B fill:#1e1e2e,stroke:#f43f8e,color:#f1f5f9
style C fill:#1e1e2e,stroke:#22c55e,color:#f1f5f9
style D fill:#1e1e2e,stroke:#6366f1,color:#f1f5f9
style E fill:#1e1e2e,stroke:#06b6d4,color:#f1f5f9
style F fill:#1e1e2e,stroke:#eab308,color:#f1f5f9
style G fill:#1e1e2e,stroke:#a855f7,color:#f1f5f9
style H fill:#1e1e2e,stroke:#22c55e,color:#f1f5f9
π‘ Serverless functions have read-only filesystems except
/tmp. The disk cache writes to/tmpon Vercel, surviving across warm invocations.
| Source | Primary | Fallback | Notes |
|---|---|---|---|
| ANN | Google News RSS | Direct scraping | Cloudflare blocks direct access |
| Anime Corner | RSS Feed | Direct scraping | RSS has real descriptions |
| MyAnimeList | Direct scraping | Page 2 scraping | Custom date format parser |
| Otaku USA | Google News RSS | Direct scraping | 520 errors on direct access |
| Crunchyroll | Google News RSS | Direct scraping | Blocks direct scraping |
| Anime Herald | RSS Feed | Direct scraping | RSS has real descriptions |
| Comic Book | Direct scraping | RSS Feed | Uses subheadline selector |
AniNewsAPI/
βββ π api/ # π Vercel serverless functions
β βββ π cache/
β β βββ π clear.js # π Cache management (API key protected)
β βββ π health.js # π Health check endpoint
β βββ π news.js # π° Main news endpoint (pagination, filtering)
β βββ π news/
β β βββ π [slug].js # π Full article by slug
β β βββ π tags.js # π·οΈ Tag listing & filtering
β βββ π openapi.js # π OpenAPI 3.0.3 specification
β βββ π rss.js # ποΈ RSS 2.0 XML feed
β βββ π search.js # π Full-text search with scoring
β βββ π sources.js # π Per-source health & stats
β βββ π stats.js # π Cache hit/miss statistics
β βββ π stream.js # π‘ Server-Sent Events
β
βββ π public/
β βββ π index.html # π Landing page
β βββ π manifest.json # π± PWA manifest
β βββ π og-image.png # πΌοΈ Open Graph image
β βββ π og-image.svg # πΌοΈ Open Graph vector
β
βββ π utils/ # βοΈ Core logic
β βββ π cacheHandler.js # πΎ Two-tier cache (memory + disk)
β βββ π constants.js # π Shared config & defaults
β βββ π contentParser.js # π Full-article content extraction
β βββ π dateParser.js # π
Multi-format date parsing
β βββ π fetchANN.js # π° Anime News Network fetcher
β βββ π fetchAnimeCorner.js # π° Anime Corner fetcher
β βββ π fetchAnimeHerald.js # π° Anime Herald fetcher
β βββ π fetchComicBook.js # π° Comic Book fetcher
β βββ π fetchCrunchyroll.js # π° Crunchyroll fetcher
β βββ π fetchMyAnimeList.js # π° MyAnimeList fetcher
β βββ π fetchOtakuNews.js # π° Otaku USA fetcher
β βββ π generateSlug.js # π URL-safe slug generator
β βββ π sources.js # π Centralized source registry
β
βββ π data/ # πΎ Disk cache files (auto-generated)
β
βββ π server.js # π Express server entry point
βββ π index.js # β² Vercel serverless entry point
βββ π test.js # π§ͺ Integration test suite
βββ π vercel.json # β² Vercel routing & headers config
βββ π package.json # π¦ Dependencies & scripts
βββ π CHANGELOG.md # π Version history
βββ π CONTRIBUTING.md # π€ Contribution guidelines
βββ π LICENSE # π MIT License
βββ π README.md # π This file
| Requirement | Minimum | Recommended |
|---|---|---|
| π¦ Node.js | 20.x | 20.x LTS |
| π¦ npm | 9.0+ | 10.x |
| π» OS | Windows, macOS, Linux | Any |
# 1οΈβ£ Clone the repository
git clone https://github.com/Shineii86/AniNewsAPI.git
cd AniNewsAPI
# 2οΈβ£ Install dependencies
npm install
# 3οΈβ£ Start development server
npm run devπ Open http://localhost:3000 in your browser.
# Start production server
npm start
# Run tests
npm test# Using yarn
yarn install
yarn dev
# Using pnpm
pnpm install
pnpm dev
# Using bun
bun install
bun dev| Variable | Default | Description |
|---|---|---|
CACHE_TTL |
600 |
Cache duration in seconds (10 minutes) |
PORT |
3000 |
Server port (Express mode only) |
CACHE_CLEAR_KEY |
β | API key for POST /api/cache/clear (optional) |
API_URL |
http://localhost:3000 |
Base URL for test suite |
The vercel.json file handles:
- Rewrites β Maps clean URLs to serverless functions
- Headers β CORS, caching, and rate limit headers
- Environment β Sets
CACHE_TTLfor production
Latest anime news from all or specific sources.
| Param | Type | Default | Description |
|---|---|---|---|
limit |
1-100 |
20 |
Max articles per page |
offset |
>=0 |
0 |
Pagination offset |
cursor |
string |
β | Pagination cursor (from meta.nextCursor) |
sort |
latest|oldest |
latest |
Sort order |
source |
string |
all |
Filter by source key |
from |
YYYY-MM-DD |
β | Start date filter |
to |
YYYY-MM-DD |
β | End date filter |
refresh |
boolean |
false |
Bypass cache |
# Basic usage
curl "https://aninews.vercel.app/api/news?limit=10"
# Filter by source with pagination
curl "https://aninews.vercel.app/api/news?source=crunchyroll&limit=10&offset=10"
# Date range filtering
curl "https://aninews.vercel.app/api/news?from=2026-05-20&to=2026-05-27"
# Cursor-based pagination (use nextCursor from previous response)
curl "https://aninews.vercel.app/api/news?limit=20&cursor=eyJvZmZzZXQiOjIwfQ"π Example Response
{
"success": true,
"data": [
{
"title": "Demon Slayer Season 4 Announced",
"slug": "ann-demon-slayer-season-4-announced",
"source": "Anime News Network",
"excerpt": "The official website confirmed...",
"date": "2026-05-27T10:30:00.000Z",
"image": "https://example.com/image.jpg",
"link": "https://www.animenewsnetwork.com/news/...",
"tags": ["news", "anime"]
}
],
"meta": {
"total": 62,
"returned": 10,
"offset": 0,
"limit": 10,
"hasMore": true,
"nextCursor": "eyJvZmZzZXQiOjEwfQ",
"source": "all",
"sort": "latest",
"from": "2026-05-20",
"to": "2026-05-27",
"responseTime": "234ms",
"timestamp": "2026-05-27T12:00:00.000Z"
}
}Full-text search with relevance scoring. Title matches rank higher than excerpt matches.
| Param | Required | Description |
|---|---|---|
q |
Yes | Search query (min 2 chars) |
source |
No | Filter by source key |
limit |
No | Max results (1-100) |
offset |
No | Pagination offset |
from |
No | Start date (YYYY-MM-DD) |
to |
No | End date (YYYY-MM-DD) |
Scoring Algorithm:
- Title match: +10 points per search term
- Excerpt match: +3 points per search term
- Tiebreaker: newest date first
curl "https://aninews.vercel.app/api/search?q=demon+slayer"
curl "https://aninews.vercel.app/api/search?q=manga&source=ann&limit=5"
curl "https://aninews.vercel.app/api/search?q=crunchyroll&from=2026-05-20&to=2026-05-27"List available tags with article counts, or filter articles by tag.
# List all tags with counts
curl "https://aninews.vercel.app/api/news/tags"
# Filter articles by tag
curl "https://aninews.vercel.app/api/news/tags?tag=official"
# Filter by tag and source
curl "https://aninews.vercel.app/api/news/tags?tag=news&source=ann"π Example Response (tag listing)
{
"success": true,
"data": {
"tags": [
{ "name": "anime", "count": 45 },
{ "name": "news", "count": 38 },
{ "name": "official", "count": 22 }
],
"totalTags": 15,
"totalArticles": 62
},
"meta": { "timestamp": "2026-05-27T12:00:00.000Z" }
}Full article content extraction from the original URL.
curl "https://aninews.vercel.app/api/news/ann-demon-slayer-season-4-announced"π Example Response
{
"success": true,
"data": {
"title": "Demon Slayer Season 4 Announced",
"slug": "ann-demon-slayer-season-4-announced",
"source": "Anime News Network",
"excerpt": "The official website confirmed...",
"date": "2026-05-27T10:30:00.000Z",
"link": "https://www.animenewsnetwork.com/news/...",
"content": "<p>Full article HTML content...</p>",
"author": "John Doe",
"publishDate": "2026-05-27"
},
"meta": { "cached": false, "timestamp": "2026-05-27T12:00:00.000Z" }
}Standards-compliant RSS 2.0 XML feed. Works with any feed reader.
| Param | Default | Description |
|---|---|---|
source |
all |
Filter by source |
limit |
20 |
Max items |
curl "https://aninews.vercel.app/api/rss"
curl "https://aninews.vercel.app/api/rss?source=crunchyroll&limit=10"Per-source health monitoring. Returns fetch status, article counts, and latency.
curl "https://aninews.vercel.app/api/sources"π Example Response
{
"success": true,
"data": [
{
"key": "ann",
"name": "Anime News Network",
"status": "healthy",
"articleCount": 15,
"latency": "1234ms",
"lastFetch": "2026-05-27T12:00:00.000Z",
"lastError": null
},
{
"key": "crunchyroll",
"name": "Crunchyroll",
"status": "degraded",
"articleCount": 0,
"latency": "15001ms",
"lastFetch": "2026-05-27T11:55:00.000Z",
"lastError": { "message": "Timeout", "time": "2026-05-27T11:55:00.000Z" }
}
],
"meta": {
"total": 7,
"healthy": 6,
"degraded": 1,
"responseTime": "2345ms"
}
}Health check and cache statistics.
curl "https://aninews.vercel.app/api/health"
curl "https://aninews.vercel.app/api/stats"Manual cache flush. Requires API key when CACHE_CLEAR_KEY is set.
# Clear all caches
curl -X POST "https://aninews.vercel.app/api/cache/clear" \
-H "X-Api-Key: your-secret-key"
# Clear specific cache key
curl -X POST "https://aninews.vercel.app/api/cache/clear" \
-H "Content-Type: application/json" \
-H "X-Api-Key: your-secret-key" \
-d '{"key": "news_all"}'Server-Sent Events stream. Sends an initial burst of status data then closes.
curl -N "https://aninews.vercel.app/api/stream"
β οΈ Vercel Hobby functions timeout at 10s. This endpoint sends a single burst and closes. For real-time updates, poll/api/news?refresh=true.
OpenAPI 3.0.3 specification in JSON format. Use with Swagger UI, Postman, or any OpenAPI-compatible tool.
curl "https://aninews.vercel.app/api/openapi"| Field | Type | Description | Example |
|---|---|---|---|
title |
string |
Article headline | "Demon Slayer Season 4" |
slug |
string |
URL-safe identifier | "ann-demon-slayer-season-4" |
source |
string |
Display name of source | "Anime News Network" |
excerpt |
string |
Article description/summary | "The official website..." |
date |
string |
ISO 8601 publish date | "2026-05-27T10:30:00.000Z" |
image |
string |
Thumbnail URL | "https://..." |
link |
string |
Original article URL | "https://..." |
tags |
string[] |
Category tags | ["news", "anime"] |
| Field | Type | Description |
|---|---|---|
total |
number |
Total matching articles |
returned |
number |
Articles in this response |
offset |
number |
Current offset |
limit |
number |
Page size |
hasMore |
boolean |
Whether more pages exist |
nextCursor |
string|null |
Opaque cursor for next page |
source |
string |
Source filter applied |
sort |
string |
Sort order applied |
responseTime |
string |
Server processing time |
- Click the button above (or import manually on vercel.com)
- Vercel auto-detects the project β no config needed
- Your API is live! π
# Or use Vercel CLI
npx vercel --prod# Clone and install
git clone https://github.com/Shineii86/AniNewsAPI.git
cd AniNewsAPI && npm install
# Start production server
npm start
# β http://localhost:3000FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]| Command | Description | Details |
|---|---|---|
npm run dev |
π₯ Start development server | Runs on localhost:3000 |
npm start |
π Start production server | NODE_ENV=production node server.js |
npm test |
π§ͺ Run integration tests | Tests all 12 endpoints |
npm run build |
π¦ Build (no-op for serverless) | Vercel handles this |
| Metric | Value |
|---|---|
| β‘ Cached response | ~200ms |
| π Fresh fetch (all 7 sources) | ~3-6s |
| πΎ Cache TTL | 10 minutes |
| π Retry attempts | 3 per source |
| β±οΈ Timeout per source | 15 seconds |
| π° Total articles (avg) | 60+ after dedup |
| π¦ Total codebase | ~50KB |
- πΎ Two-tier cache β Memory-first with disk fallback
- β‘ Concurrent fetching β All 7 sources hit simultaneously
- π Exponential backoff β 1s, 2s, 3s delays on retry
- π§Ή Auto-cleanup β Stale rate limit buckets purged every 5 min
- π Disk persistence β Source metrics survive serverless cold starts
- ποΈ Minimal deps β Only 6 production dependencies
| Version | Date | Key Changes |
|---|---|---|
| 4.2.0 | 2026-05-28 | Code style overhaul β AlisaReactionBot-style documentation across all 26 files |
| 4.1.6 | 2026-05-27 | Full excerpts, no truncation β removed 200-char limit from all 7 fetchers |
| 4.1.5 | 2026-05-27 | Real excerpts for Comic Book, Anime Corner, Anime Herald |
| 4.1.4 | 2026-05-27 | Sources endpoint now does live health checks |
| 4.1.3 | 2026-05-27 | Persist source metrics to disk for serverless survival |
| 4.1.0 | 2026-05-26 | Date range filtering, cursor pagination, search scoring |
π See CHANGELOG.md for the full version history.
| Problem | Cause | Solution |
|---|---|---|
β npm install fails |
Node.js version too old | Upgrade to Node.js 20+ (node -v) |
| β No articles returned | All sources down | Check /api/sources for health status |
| β Cache always empty | Serverless cold start | Normal β first request after idle is slow |
| β Rate limited (429) | Exceeded 100 req/min | Wait for X-RateLimit-Reset seconds |
| β CORS errors | Frontend domain blocked | CORS is * β check browser extension |
| β RSS feed empty | No cached articles | Hit /api/news first to populate cache |
| β Article content empty | Source blocked parsing | Falls back to "View original article" link |
| β 404 on API routes | Wrong URL format | Use /api/news not /news |
| β Deploy fails on Vercel | Build error | Check npm run build locally first |
| β Tests failing | Server not running | Start server first with npm run dev |
# Run with verbose logging
NODE_ENV=development npm run dev
# Run tests against local server
API_URL=http://localhost:3000 npm test
# Check cache state
curl http://localhost:3000/api/stats
curl http://localhost:3000/api/healthπ° How do I add a new news source?
1. Create
utils/fetchNewSource.js exporting an async function that returns an array of article objects: [{ title, slug, source, excerpt, date, image, link, tags }]2. Register it in
utils/sources.js β add an import and entry to the SOURCES object3. Run
npm test to verify, then submit a PR
π How often does the data refresh?
The cache TTL is 10 minutes by default. After that, the next request triggers a fresh fetch from all 7 sources. You can force a refresh with
?refresh=true or change the TTL with the CACHE_TTL environment variable.
π‘ Can I use this in my frontend app?
Yes! CORS is enabled for all origins (
*). Just make fetch requests to the API endpoints. No API key needed for read operations. Example: fetch('https://aninews.vercel.app/api/news?limit=10')
ποΈ How do I subscribe to the RSS feed?
Add
https://aninews.vercel.app/api/rss to any feed reader (Feedly, Inoreader, NetNewsWire, etc.). You can filter by source: /api/rss?source=crunchyroll
π How does deduplication work?
Articles are deduplicated by normalized title β punctuation is stripped, whitespace is collapsed, and compared case-insensitively. The first occurrence (from the source that responded fastest) wins.
π Is the cache clear endpoint secure?
When
CACHE_CLEAR_KEY is set, the endpoint requires an X-Api-Key header. Without the env var, the endpoint is open β so set it in production. Read endpoints (/api/news, etc.) are always open.
β±οΈ Why is the first request slow?
On serverless (Vercel), the first request after idle triggers a "cold start" β the function initializes and fetches from all 7 sources (~3-6s). Subsequent requests hit the cache (~200ms). Warm functions stay alive for ~5 minutes.
π Can I self-host this?
Yes! Use
npm start to run the Express server on any VPS, Docker container, or PaaS. The Vercel serverless functions are optional β server.js handles everything.
- π API key authentication β Per-user rate limits and usage tracking
- π Admin dashboard β Web UI for cache management and source monitoring
- π Dark/light mode β Theme toggle for the landing page
- π± PWA support β Install as app on mobile devices
- π Webhook notifications β Push new articles to Discord/Slack
- π Analytics β Track popular endpoints and search queries
- ποΈ Database option β Optional Supabase/Postgres for persistence
- π Multi-language β Support for Japanese, Korean news sources
- π€ AI summaries β Auto-generate article summaries
- π¦ NPM package β Client SDK for easy integration
- π° 7 news sources with concurrent fetching
- πΎ Two-tier caching (memory + disk)
- π Full-text search with relevance scoring
- π Date range filtering
- π Cursor-based pagination
- ποΈ RSS 2.0 feed
- π Full article extraction
- π·οΈ Tag filtering with counts
- π Source health monitoring
- π OpenAPI 3.0.3 specification
- π‘ SSE stream
- π Cache clear authentication
- π One-click Vercel deployment
- π Comprehensive documentation
Contributions are welcome and appreciated! Here's how you can help:
|
Found something broken? |
Have an idea for the notebook? |
Ready to contribute code? |
# 1οΈβ£ Fork the repository
# Click the "Fork" button on GitHub
# 2οΈβ£ Clone your fork
git clone https://github.com/YOUR_USERNAME/AniNewsAPI.git
cd AniNewsAPI
# 3οΈβ£ Create a feature branch
git checkout -b feature/amazing-feature
# 4οΈβ£ Make your changes
# Edit files, add features, fix bugs...
# 5οΈβ£ Test your changes
npm test
# 6οΈβ£ Commit your changes
git commit -m 'feat: add amazing feature'
# 7οΈβ£ Push to your fork
git push origin feature/amazing-feature
# 8οΈβ£ Open a Pull Request
# Go to GitHub and create a PR- β Follow the existing code style and documentation conventions
- β Write meaningful commit messages (use conventional commits)
- β
Run
npm testbefore submitting - β Update CHANGELOG.md with your changes
- β Keep PRs focused β one feature or fix per PR
- β Add JSDoc comments for new functions
- β Don't commit
node_modulesor cache files - β Don't add unrelated changes to a single PR
- Check existing issues first
- Create a new issue with:
- Clear title and description
- Steps to reproduce
- Expected vs actual behavior
- API endpoint and parameters used
- Check the Roadmap for planned features
- Open a feature request with:
- Clear description of the feature
- Use case / motivation
- Example API usage if applicable
| Source | About |
|---|---|
| Anime News Network | Industry-leading anime journalism |
| Anime Corner | Community-driven anime news & polls |
| MyAnimeList | The largest anime/manga database |
| Otaku USA Magazine | English-language anime culture magazine |
| Crunchyroll | Official streaming platform news |
| Anime Herald | Anime news, reviews & editorials |
| Comic Book | Anime & manga coverage at ComicBook |
- Express β Fast, unopinionated web framework
- Cheerio β Fast, flexible HTML parsing
- Axios β Promise-based HTTP client
- rss-parser β RSS/Atom feed parser
- node-cache β In-memory caching
- Vercel β Serverless deployment platform
- Shields.io β Badges for README
- Star History β GitHub star history charts
This project is licensed under the MIT License.
Free to use, modify, and distribute β see the LICENSE file for details.
Shinei Nouzen
Full-Stack Developer & Anime Enthusiast
β If you found this project useful, please consider giving it a star!
Made With β€οΈ For The Anime Community
Β© 2026 Shineii86. All Rights Reserved.