Membuat News API Sederhana dari RSS Feed dengan Node.js

Tutorial
Sep 20, 2026
12 mnt baca
3 tayangan
Membuat News API Sederhana dari RSS Feed dengan Node.js
A

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?

  2. Apa Itu RSS?

  3. Kenapa Tanpa Database?

  4. API Ini Bisa Dipakai untuk Apa?

  5. Persiapan & Prasyarat

  6. Struktur Proyek

  7. File feeds.js — Daftar Sumber RSS

  8. Parsing RSS ke JSON

  9. Membuat Endpoint API

  10. File server.js Lengkap

  11. Mencoba di Lokal

  12. Upload ke GitHub

  13. Deploy ke Vercel

  14. Contoh Response

  15. Penutup & Pengembangan Lanjut


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)

  • Gitgit-scm.com

  • Akun GitHubgithub.com

  • Akun Vercelvercel.com (bisa login dengan GitHub)

  • Editor kode favorit (VS Code direkomendasikan)

Cek versi Node.js dan npm kamu:

node -v
npm -v

6. 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
└── .gitignore

Buat folder dan masuk ke dalamnya:

mkdir news-api
cd news-api
npm init -y

Install dependensi yang dibutuhkan:

    npm install express rss-parser cors
    Penjelasan package:
  • express — framework HTTP server untuk Node.js

  • rss-parser — library untuk mem-parse RSS/Atom feed menjadi objek JavaScript

  • cors — 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:

  1. Menerima URL RSS dan batas jumlah berita

  2. Mengambil dan mem-parse XML dari URL tersebut

  3. Memformat setiap item menjadi objek JSON yang bersih dan konsisten

  4. 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=5

Parameter query yang tersedia:

  • source (wajib) — nama portal berita: cnn, bbc, antaranews, cnbcindonesia, tempo, republika, games

  • category (wajib) — kategori berita sesuai yang tersedia di feeds.js

  • limit (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 start

Coba 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=terbaru

12. Upload ke GitHub

Pertama, buat file .gitignore:

node_modules/
.env
.DS_Store

Kemudian 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 main

Ganti 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 push

Sekarang langkah deploy ke Vercel:

  1. Buka vercel.com dan login menggunakan akun GitHub kamu

  2. Klik tombol "Add New Project"

  3. Pilih repository news-api yang sudah kamu upload tadi

  4. Biarkan semua setting default — Vercel akan otomatis mendeteksi ini sebagai Node.js project

  5. Klik "Deploy"

  6. Tunggu beberapa detik hingga proses selesai

Setelah deploy berhasil, Vercel akan memberikanmu URL seperti:

https://news-api-username.vercel.app

API kamu sudah live! Coba akses:

https://news-api-username.vercel.app/api/news?source=tempo&category=bisnis

Setiap 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-cache atau lru-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=teknologi

  • Pencarian — Tambahkan parameter q untuk memfilter berita berdasarkan kata kunci dari judul atau deskripsi

  • Rate limiting — Gunakan library seperti express-rate-limit untuk mencegah penyalahgunaan API

  • Dokumentasi API — Buat halaman dokumentasi interaktif menggunakan Swagger UI

  • Tambah sumber RSS — Cukup tambahkan URL baru di feeds.js — tidak perlu mengubah kode lain sama sekali

  • Notifikasi 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.

Baca Artikel
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!

Baca Artikel
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.

Baca Artikel