Membuat News API Sederhana dari RSS Feed dengan Node.js
Admin
Penulis Artikel
Membuat News API Sederhana dari RSS Feed dengan Node.js
Panduan lengkap membangun REST API berita tanpa database menggunakan sumber RSS publik — dan deploy ke GitHub + Vercel.
Daftar Isi
1. Apa Itu API?
API adalah singkatan dari Application Programming Interface. Secara sederhana, API adalah sebuah antarmuka yang memungkinkan dua aplikasi atau sistem berkomunikasi satu sama lain.
Bayangkan API seperti seorang pelayan di restoran. Kamu (aplikasi klien) memesan makanan kepada pelayan. Pelayan membawa pesanan ke dapur (server/sumber data), kemudian mengembalikan makanan yang sudah jadi kepadamu. Kamu tidak perlu tahu bagaimana cara dapur memasak — cukup tahu cara memesan dan apa yang akan kamu terima.
Dalam konteks web, API yang paling umum adalah REST API — komunikasi dilakukan melalui protokol HTTP menggunakan method seperti GET, POST, PUT, DELETE. Artikel ini hanya menggunakan method GET, artinya kita hanya membaca data, tidak mengubah atau menghapus apa pun.
Analogi lain: API cuaca yang kamu pakai di aplikasi ponsel mengambil data dari server cuaca dan menampilkannya. Aplikasi ponselmu tidak menyimpan data cuaca sendiri — ia hanya meminta ke API, lalu API mengembalikan data terkini.
2. Apa Itu RSS?
RSS adalah singkatan dari Really Simple Syndication. RSS adalah sebuah format berbasis XML yang digunakan oleh website — terutama portal berita dan blog — untuk mempublikasikan konten terbaru mereka secara terstruktur dan otomatis.
Hampir semua portal berita besar di Indonesia maupun dunia menyediakan RSS feed secara gratis dan terbuka. Format datanya seperti ini:
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>CNN Indonesia - Nasional</title>
<link>https://www.cnnindonesia.com/nasional</link>
<description>Berita nasional terkini</description>
<item>
<title>Judul Berita 1</title>
<link>https://www.cnnindonesia.com/...</link>
<description>Ringkasan berita...</description>
<pubDate>Sun, 20 Sep 2026 08:00:00 +0700</pubDate>
<enclosure url="https://..." type="image/jpeg"/>
</item>
<item>...</item>
</channel>
</rss>Setiap <item> dalam RSS mewakili satu artikel berita. Kita akan mengambil XML ini, menguraikan (parse) isinya, dan mengubahnya menjadi JSON yang lebih mudah dikonsumsi oleh aplikasi modern.
Keuntungan menggunakan RSS:
Gratis dan terbuka — tidak perlu akun atau API key dari portal berita
Data selalu ter-update otomatis mengikuti berita terbaru
Format standar, mudah di-parse
Tersedia dari ratusan sumber berita sekaligus
3. Kenapa Tanpa Database?
Kita tidak membutuhkan database karena data sudah ada di server RSS masing-masing portal berita. API kita cukup bertindak sebagai proxy atau aggregator — meneruskan permintaan pengguna ke RSS feed yang sesuai, mengubah formatnya ke JSON, lalu mengirimkannya kembali.
Keuntungannya antara lain:
Lebih ringan — tidak perlu setup PostgreSQL, MySQL, MongoDB, dsb.
Lebih murah — tanpa biaya server database
Deploy mudah — bisa langsung ke Vercel (serverless) tanpa konfigurasi tambahan
Data selalu segar — setiap request mengambil data terbaru langsung dari sumbernya
Kelemahannya adalah API kita bergantung pada ketersediaan server RSS pihak ketiga. Jika CNN Indonesia down, endpoint CNN di API kita juga tidak bisa mengambil data. Namun untuk keperluan belajar dan proyek skala kecil, ini sudah lebih dari cukup.
4. API Ini Bisa Dipakai untuk Apa?
Dengan API berita berbasis RSS ini, kamu bisa membangun berbagai macam aplikasi, misalnya:
Aplikasi berita mobile (React Native / Flutter) yang menampilkan berita dari berbagai sumber sekaligus
Dashboard monitoring berita untuk memantau topik tertentu (teknologi, ekonomi, olahraga)
Bot Telegram / Discord yang secara otomatis mengirim ringkasan berita terbaru setiap jam
Website agregator berita pribadi atau untuk komunitas
Feed widget yang ditanam di website portfolio atau blog
Proyek machine learning — mengumpulkan data berita untuk analisis sentimen atau klasifikasi topik
Reminder berita harian via email otomatis menggunakan cron job
Sumber data untuk chatbot yang bisa menjawab pertanyaan tentang berita terkini
Intinya, selama ada kebutuhan untuk mengonsumsi berita secara programatik, API ini bisa jadi fondasinya.
5. Persiapan & Prasyarat
Sebelum mulai, pastikan kamu sudah menginstal:
Node.js versi 18 ke atas — nodejs.org
npm (sudah termasuk saat install Node.js)
Git — git-scm.com
Akun GitHub — github.com
Akun Vercel — vercel.com (bisa login dengan GitHub)
Editor kode favorit (VS Code direkomendasikan)
Cek versi Node.js dan npm kamu:
node -v
npm -v6. Struktur Proyek
Buat folder proyek baru dan buat struktur seperti berikut:
news-api/
├── api/
│ └── news.js ← Endpoint API (dikenali Vercel sebagai serverless function)
├── feeds.js ← Daftar semua RSS feed
├── parser.js ← Fungsi untuk fetch dan parse RSS
├── server.js ← Server Express untuk development lokal
├── package.json
├── vercel.json ← Konfigurasi routing Vercel
└── .gitignoreBuat folder dan masuk ke dalamnya:
mkdir news-api
cd news-api
npm init -yInstall dependensi yang dibutuhkan:
npm install express rss-parser cors
Penjelasan package:express— framework HTTP server untuk Node.jsrss-parser— library untuk mem-parse RSS/Atom feed menjadi objek JavaScriptcors— middleware agar API bisa diakses dari browser (lintas domain)
7. File feeds.js — Daftar Sumber RSS
Buat file feeds.js di root proyek. File ini adalah "peta" yang menyimpan semua URL RSS dari berbagai portal berita yang kita dukung:
// feeds.js
const feeds = {
cnn: {
terbaru: "https://www.cnnindonesia.com/nasional/rss",
internasional: "https://www.cnnindonesia.com/internasional/rss",
ekonomi: "https://www.cnnindonesia.com/ekonomi/rss",
olahraga: "https://www.cnnindonesia.com/olahraga/rss",
teknologi: "https://www.cnnindonesia.com/teknologi/rss",
gaya_hidup: "https://www.cnnindonesia.com/gaya-hidup/rss",
},
bbc: {
newest: "http://feeds.bbci.co.uk/news/rss.xml",
world: "http://feeds.bbci.co.uk/news/world/rss.xml",
business: "http://feeds.bbci.co.uk/news/business/rss.xml",
politics: "http://feeds.bbci.co.uk/news/politics/rss.xml",
technology: "http://feeds.bbci.co.uk/news/technology/rss.xml",
science: "http://feeds.bbci.co.uk/news/science_and_environment/rss.xml",
entertainment: "http://feeds.bbci.co.uk/news/entertainment_and_arts/rss.xml",
},
antaranews: {
terbaru: "https://www.antaranews.com/rss/top-news.xml",
politik: "https://www.antaranews.com/rss/politik.xml",
ekonomi: "https://www.antaranews.com/rss/ekonomi.xml",
tekno: "https://www.antaranews.com/rss/tekno.xml",
gayaHidup: "https://www.antaranews.com/rss/gaya-hidup.xml",
otomotif: "https://www.antaranews.com/rss/otomotif.xml",
olahraga: "https://www.antaranews.com/rss/olahraga.xml",
},
cnbcindonesia: {
terbaru: "https://www.cnbcindonesia.com/news/rss",
market: "https://www.cnbcindonesia.com/market/rss",
tech: "https://www.cnbcindonesia.com/tech/rss",
lifestyle: "https://www.cnbcindonesia.com/lifestyle/rss",
entrepreneur: "https://www.cnbcindonesia.com/entrepreneur/rss",
},
tempo: {
terbaru: "https://rss.tempo.co/nasional",
bisnis: "https://rss.tempo.co/bisnis",
dunia: "https://rss.tempo.co/dunia",
metro: "https://rss.tempo.co/metro",
seleb: "https://rss.tempo.co/seleb",
otomotif: "https://rss.tempo.co/otomotif",
},
republika: {
terkini: "http://www.republika.co.id/rss",
news: "http://www.republika.co.id/rss/news",
ihram: "http://www.republika.co.id/rss/ihram",
bola: "http://www.republika.co.id/rss/bola",
},
games: {
gamebrott: "https://www.gamebrott.com/feed",
},
};
module.exports = feeds;Struktur objek ini adalah { sumber: { kategori: "url_rss" } }. Kamu bisa dengan mudah menambahkan sumber baru di masa mendatang hanya dengan menambahkan properti baru di sini.
8. Parsing RSS ke JSON
Buat file parser.js. File ini bertugas mengambil URL RSS, mem-parse-nya, dan mengubahnya menjadi array objek JSON yang rapi:
// parser.js
const Parser = require("rss-parser");
const parser = new Parser({
customFields: {
item: [
["media:content", "media"],
["enclosure", "enclosure"],
],
},
});
/**
* Mengambil dan mem-parse RSS feed dari URL tertentu.
* @param {string} url - URL RSS feed
* @param {number} limit - Jumlah maksimal berita yang dikembalikan (default: 10)
* @returns {Promise<Array>} - Array of news items
*/
async function fetchRSS(url, limit = 10) {
const feed = await parser.parseURL(url);
const items = feed.items.slice(0, limit).map((item) => ({
title: item.title || null,
link: item.link || null,
description: item.contentSnippet || item.summary || null,
pubDate: item.pubDate || item.isoDate || null,
author: item.creator || item.author || null,
thumbnail:
item.enclosure?.url ||
item.media?.["$"]?.url ||
null,
source: feed.title || null,
sourceLink: feed.link || null,
}));
return items;
}
module.exports = { fetchRSS };Fungsi fetchRSS ini:
Menerima URL RSS dan batas jumlah berita
Mengambil dan mem-parse XML dari URL tersebut
Memformat setiap item menjadi objek JSON yang bersih dan konsisten
Mengembalikan array artikel siap pakai
9. Membuat Endpoint API
Desain endpoint kita akan sesederhana mungkin. Pengguna cukup mengirim request GET dengan menentukan sumber berita dan kategori:
GET /api/news?source=cnn&category=teknologi
GET /api/news?source=bbc&category=world
GET /api/news?source=antaranews&category=olahraga&limit=5Parameter query yang tersedia:
source(wajib) — nama portal berita:cnn,bbc,antaranews,cnbcindonesia,tempo,republika,gamescategory(wajib) — kategori berita sesuai yang tersedia difeeds.jslimit(opsional) — jumlah berita, default 10, maksimal 50
Kamu juga bisa tambahkan endpoint GET /api/sources untuk menampilkan semua sumber dan kategori yang tersedia — berguna agar pengguna API tahu apa saja yang bisa diminta.
10. File server.js Lengkap
Buat file server.js untuk development lokal:
// server.js
const express = require("express");
const cors = require("cors");
const feeds = require("./feeds");
const { fetchRSS } = require("./parser");
const app = express();
const PORT = process.env.PORT || 3000;
// Aktifkan CORS agar bisa diakses dari browser/aplikasi lain
app.use(cors());
// ─── Root ────────────────────────────────────────────────
app.get("/", (req, res) => {
res.json({
message: "News API - RSS Aggregator",
version: "1.0.0",
endpoints: {
news: "/api/news?source=cnn&category=teknologi&limit=10",
sources: "/api/sources",
},
});
});
// ─── Daftar semua sumber dan kategori ────────────────────
app.get("/api/sources", (req, res) => {
const sources = {};
for (const [source, categories] of Object.entries(feeds)) {
sources[source] = Object.keys(categories);
}
res.json({
success: true,
data: sources,
});
});
// ─── Endpoint utama: ambil berita ────────────────────────
app.get("/api/news", async (req, res) => {
const { source, category, limit } = req.query;
// Validasi parameter
if (!source || !category) {
return res.status(400).json({
success: false,
message: "Parameter 'source' dan 'category' wajib diisi.",
example: "/api/news?source=cnn&category=teknologi",
});
}
// Cek apakah source tersedia
if (!feeds[source]) {
return res.status(404).json({
success: false,
message: `Source '${source}' tidak ditemukan.`,
availableSources: Object.keys(feeds),
});
}
// Cek apakah kategori tersedia untuk source tersebut
const feedUrl = feeds[source][category];
if (!feedUrl) {
return res.status(404).json({
success: false,
message: `Kategori '${category}' tidak tersedia untuk source '${source}'.`,
availableCategories: Object.keys(feeds[source]),
});
}
// Batasi nilai limit
const itemLimit = Math.min(parseInt(limit) || 10, 50);
try {
const articles = await fetchRSS(feedUrl, itemLimit);
return res.json({
success: true,
source,
category,
total: articles.length,
data: articles,
});
} catch (error) {
console.error("Error fetching RSS:", error.message);
return res.status(500).json({
success: false,
message: "Gagal mengambil berita. Coba lagi nanti.",
error: error.message,
});
}
});
// ─── 404 Handler ─────────────────────────────────────────
app.use((req, res) => {
res.status(404).json({
success: false,
message: "Endpoint tidak ditemukan.",
});
});
app.listen(PORT, () => {
console.log(`✅ News API berjalan di http://localhost:${PORT}`);
});Sekarang buat juga file api/news.js — ini adalah Vercel Serverless Function yang akan menangani semua request saat di-deploy ke Vercel. Vercel mengenali file di dalam folder api/ sebagai serverless function secara otomatis:
// api/news.js
const feeds = require("../feeds");
const { fetchRSS } = require("../parser");
module.exports = async (req, res) => {
// Izinkan CORS
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Methods", "GET");
const { source, category, limit } = req.query;
// Endpoint /api/sources
if (source === "list" || (!source && !category)) {
const sources = {};
for (const [s, cats] of Object.entries(feeds)) {
sources[s] = Object.keys(cats);
}
return res.json({ success: true, data: sources });
}
if (!source || !category) {
return res.status(400).json({
success: false,
message: "Parameter 'source' dan 'category' wajib diisi.",
});
}
if (!feeds[source]) {
return res.status(404).json({
success: false,
message: `Source '${source}' tidak ditemukan.`,
availableSources: Object.keys(feeds),
});
}
const feedUrl = feeds[source][category];
if (!feedUrl) {
return res.status(404).json({
success: false,
message: `Kategori '${category}' tidak tersedia untuk source '${source}'.`,
availableCategories: Object.keys(feeds[source]),
});
}
const itemLimit = Math.min(parseInt(limit) || 10, 50);
try {
const articles = await fetchRSS(feedUrl, itemLimit);
return res.json({
success: true,
source,
category,
total: articles.length,
data: articles,
});
} catch (error) {
return res.status(500).json({
success: false,
message: "Gagal mengambil berita.",
error: error.message,
});
}
};11. Mencoba di Lokal
Tambahkan script ke package.json:
{
"name": "news-api",
"version": "1.0.0",
"scripts": {
"start": "node server.js",
"dev": "node server.js"
},
"dependencies": {
"cors": "^2.8.5",
"express": "^4.18.2",
"rss-parser": "^3.13.0"
}
}Jalankan server:
npm startCoba di browser atau Postman / Insomnia / Thunder Client:
# Lihat semua sumber yang tersedia
http://localhost:3000/api/sources
# Berita teknologi dari CNN Indonesia
http://localhost:3000/api/news?source=cnn&category=teknologi
# 5 berita bisnis dari BBC
http://localhost:3000/api/news?source=bbc&category=business&limit=5
# Berita terbaru dari Antara
http://localhost:3000/api/news?source=antaranews&category=terbaru12. Upload ke GitHub
Pertama, buat file .gitignore:
node_modules/
.env
.DS_StoreKemudian inisialisasi Git dan push ke GitHub:
# Inisialisasi Git
git init
# Tambahkan semua file
git add .
# Commit pertama
git commit -m "feat: initial news api from rss feeds"
# Buat repository baru di GitHub, lalu hubungkan:
git remote add origin https://github.com/USERNAME/news-api.git
# Push
git branch -M main
git push -u origin mainGanti USERNAME dengan username GitHub kamu. Pastikan kamu sudah membuat repository baru di github.com/new terlebih dahulu (pilih Public, tanpa README agar tidak konflik).
13. Deploy ke Vercel
Kita perlu satu file konfigurasi lagi, yaitu vercel.json, untuk memberitahu Vercel bagaimana me-routing semua request ke handler kita:
{
"version": 2,
"routes": [
{
"src": "/api/sources",
"dest": "/api/news.js"
},
{
"src": "/api/news",
"dest": "/api/news.js"
},
{
"src": "/",
"dest": "/api/news.js"
}
]
}Commit dan push perubahan ini:
git add vercel.json
git commit -m "chore: add vercel config"
git pushSekarang langkah deploy ke Vercel:
Buka vercel.com dan login menggunakan akun GitHub kamu
Klik tombol "Add New Project"
Pilih repository
news-apiyang sudah kamu upload tadiBiarkan semua setting default — Vercel akan otomatis mendeteksi ini sebagai Node.js project
Klik "Deploy"
Tunggu beberapa detik hingga proses selesai
Setelah deploy berhasil, Vercel akan memberikanmu URL seperti:
https://news-api-username.vercel.appAPI kamu sudah live! Coba akses:
https://news-api-username.vercel.app/api/news?source=tempo&category=bisnisSetiap kali kamu git push ke branch main, Vercel akan otomatis melakukan re-deploy. Kamu tidak perlu melakukan apa pun secara manual lagi.
14. Contoh Response
Berikut contoh response JSON yang akan dikembalikan API saat request berhasil:
{
"success": true,
"source": "cnn",
"category": "teknologi",
"total": 10,
"data": [
{
"title": "Google Luncurkan Fitur AI Terbaru di Search",
"link": "https://www.cnnindonesia.com/teknologi/20260920...",
"description": "Google memperkenalkan pembaruan besar pada mesin pencarinya dengan mengintegrasikan model AI generatif terbaru...",
"pubDate": "Sun, 20 Sep 2026 07:30:00 +0700",
"author": "Redaksi CNN Indonesia",
"thumbnail": "https://akcdn.detik.net.id/visual/2026/09/20/...",
"source": "CNN Indonesia - Teknologi",
"sourceLink": "https://www.cnnindonesia.com/teknologi"
},
{
"title": "Startup Unicorn Baru Indonesia di Bidang Fintech",
"link": "https://www.cnnindonesia.com/teknologi/20260919...",
"description": "Startup fintech asal Indonesia berhasil meraih status unicorn setelah mendapatkan pendanaan Seri C sebesar 150 juta dolar...",
"pubDate": "Sat, 19 Sep 2026 14:00:00 +0700",
"author": null,
"thumbnail": "https://akcdn.detik.net.id/visual/2026/09/19/...",
"source": "CNN Indonesia - Teknologi",
"sourceLink": "https://www.cnnindonesia.com/teknologi"
}
]
}Dan saat terjadi error (misalnya kategori tidak ditemukan):
{
"success": false,
"message": "Kategori 'sport' tidak tersedia untuk source 'cnn'.",
"availableCategories": [
"terbaru",
"internasional",
"ekonomi",
"olahraga",
"teknologi",
"gaya_hidup"
]
}15. Penutup & Pengembangan Lanjut
Selamat! Kamu sudah berhasil membangun dan men-deploy News API sederhana yang mengaggregasi berita dari 7 portal berita berbeda dengan 35+ kategori, tanpa database, dan bisa diakses publik melalui Vercel.
Beberapa ide pengembangan lebih lanjut yang bisa kamu eksplorasi:
Caching — Tambahkan in-memory cache (misalnya pakai
node-cacheataulru-cache) agar RSS tidak di-fetch ulang setiap request. Ini mengurangi latensi dan beban ke server RSS pihak ketiga. Misalnya, cache selama 5–15 menit.Endpoint agregasi — Buat endpoint yang menggabungkan berita dari semua sumber sekaligus, misalnya
/api/news/all?category=teknologiPencarian — Tambahkan parameter
quntuk memfilter berita berdasarkan kata kunci dari judul atau deskripsiRate limiting — Gunakan library seperti
express-rate-limituntuk mencegah penyalahgunaan APIDokumentasi API — Buat halaman dokumentasi interaktif menggunakan Swagger UI
Tambah sumber RSS — Cukup tambahkan URL baru di
feeds.js— tidak perlu mengubah kode lain sama sekaliNotifikasi real-time — Kombinasikan API ini dengan WebSocket atau Server-Sent Events untuk push notifikasi berita terbaru
Kode lengkap proyek ini bisa kamu jadikan portofolio atau dikembangkan lebih lanjut menjadi produk nyata. Semoga artikel ini membantu — selamat ngoding!
Ditulis untuk pengembang yang ingin belajar membangun API Node.js dari sumber data publik. Seluruh RSS feed yang digunakan dalam artikel ini bersifat publik dan dapat diakses tanpa autentikasi.
Artikel Terkait
Cara Membuat Animasi Scrollspy dengan Library Scrollspy-js
Pelajari cara mudah membuat animasi scrollspy menggunakan library Scrollspy-js untuk halaman web yang lebih interaktif.
Cara Membuat Efek Parallax dengan HTML dan CSS
Pelajari cara mudah membuat efek parallax yang menakjubkan dengan HTML dan CSS dalam tutorial ini. Cocok untuk pemula!
Cara Restrukturisasi CRUD Node.js: Dari Function ke Folder Controller-Service-Model
cara merestrukturisasi kode CRUD dari kumpulan function menjadi struktur folder yang rapi menggunakan pola Controller-Service-Model.
