npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

indo-scraper

v1.0.0

Published

Scraper Indonesia — berita, BMKG, saham, emas, kurs, BBM, cek nomor, cek resi

Readme

indo-scraper

Scraper Indonesia untuk Node.js. Mengambil data dari berbagai sumber publik tanpa API key.

npm npm downloads license

Install

npm install indo-scraper

Usage

const Scraper = require('indo-scraper')
const s = new Scraper()

const result = await s.kompas({ channel: 'news', limit: 5 })

Semua method mengembalikan format yang sama:

// sukses
{ creator: 'Angga Putra', status: true, data: { ... } }

// gagal
{ creator: 'Angga Putra', status: false, msg: 'error message' }

API Reference

News

kompas(options)

await s.kompas({ channel: 'news', page: 1, limit: 20, date: '15/05/2026' })

| Option | Default | Values | |--------|---------|--------| | channel | 'news' | news regional megapolitan money sport tekno sains travel food health | | page | 1 | number | | limit | 20 | number | | date | null | dd/mm/yyyy |

// response
{
  creator: 'Angga Putra',
  status: true,
  data: [
    {
      title: 'Pemerintah Umumkan Kebijakan Baru Energi Terbarukan',
      url: 'https://nasional.kompas.com/read/2026/05/15/...',
      image: 'https://asset.kompas.com/crops/...',
      category: 'News',
      date: '2026-05-15T08:30:00+07:00',
      source: 'kompas'
    },
    // ...
  ]
}
await s.kompasArticle(url)
// response
{
  creator: 'Angga Putra',
  status: true,
  data: {
    title: 'Pemerintah Umumkan Kebijakan Baru Energi Terbarukan',
    author: 'Ardito Ramadhan',
    date: '2026-05-15T08:30:00+07:00',
    category: 'Nasional',
    description: 'Pemerintah resmi mengumumkan...',
    thumbnail: 'https://asset.kompas.com/crops/...',
    content: 'Paragraf 1...\n\nParagraf 2...',
    paragraphs: ['Paragraf 1...', 'Paragraf 2...']
  }
}

detik(options)

await s.detik({ channel: 'news', page: 1, limit: 20 })

| Option | Default | Values | |--------|---------|--------| | channel | 'news' | news finance hot sport inet oto health travel food |

await s.detikSearch(query, limit)   // search articles
await s.detikArticle(url)           // full article content

cnn(options)

await s.cnn({ category: 'nasional', limit: 20 })

| Option | Default | Values | |--------|---------|--------| | category | 'nasional' | nasional internasional ekonomi olahraga teknologi hiburan gaya_hidup |

await s.cnnArticle(url)

tribun(options)

await s.tribun({ channel: 'nasional', page: 1, limit: 20 })

| Option | Default | Values | |--------|---------|--------| | channel | 'nasional' | nasional regional internasional sport bisnis seleb lifestyle techno otomotif |

await s.tribunArticle(url)

liputan6(options)

await s.liputan6({ channel: 'news', page: 1, limit: 20 })

| Option | Default | Values | |--------|---------|--------| | channel | 'news' | news bisnis bola tekno showbiz otomotif health lifestyle global |

await s.liputan6Article(url)

okezone(options)

await s.okezone({ channel: 'nasional', page: 1, limit: 20 })

| Option | Default | Values | |--------|---------|--------| | channel | 'nasional' | nasional economy sports techno celebrity lifestyle otomotif health |

await s.okenewsArticle(url)

antara(options)

await s.antara({ channel: 'nasional', page: 1, limit: 20 })

| Option | Default | Values | |--------|---------|--------| | channel | 'nasional' | nasional hukum ekonomi olahraga hiburan internasional tekno otomotif |

await s.antaraArticle(url)

republika(options)

await s.republika({ channel: 'nasional', page: 1, limit: 20 })

| Option | Default | Values | |--------|---------|--------| | channel | 'nasional' | nasional internasional ekonomi olahraga hiburan tekno gaya_hidup |

await s.republikaArticle(url)

Semua scraper news (detik, cnn, tribun, liputan6, okezone, antara, republika) mengembalikan struktur yang sama dengan kompas — array of articles dan Article() mengembalikan object artikel lengkap dengan title, author, date, content, paragraphs, dll.


BMKG

bmkgGempa() / bmkgGempaTerkini() / bmkgGempaDirasakan()

await s.bmkgGempa()           // gempa terbaru (1 data)
await s.bmkgGempaTerkini()    // 15 gempa terkini — returns array
await s.bmkgGempaDirasakan()  // gempa yang dirasakan masyarakat — returns array
// response bmkgGempa()
{
  creator: 'Angga Putra',
  status: true,
  data: {
    tanggal: '15 Mei 2026',
    jam: '09:47:30 WIB',
    datetime: '2026-05-15T02:47:30+00:00',
    koordinat: '-2.34,128.12',
    lintang: '2.34 LS',
    bujur: '128.12 BT',
    magnitude: '4.5',
    kedalaman: '10 km',
    wilayah: 'Pusat gempa berada di darat 23 km BaratLaut Ternate',
    potensi: 'Gempa ini dirasakan untuk diwaspadai',
    dirasakan: 'II-III MMI',
    shakemap: 'https://data.bmkg.go.id/DataMKG/TEWS/20260515094730.mmi.jpg'
  }
}

bmkgCuaca(kota)

await s.bmkgCuaca('jakarta')

Available: jakarta bandung surabaya medan semarang makassar yogyakarta palembang denpasar balikpapan

// response
{
  creator: 'Angga Putra',
  status: true,
  data: {
    lokasi: {
      kecamatan: 'Gambir',
      kotkab: 'Kota Jakarta Pusat',
      provinsi: 'DKI Jakarta'
    },
    prakiraan: [
      {
        datetime: '2026-05-15 06:00:00',
        cuaca: 'Berawan',
        suhu: 28,
        suhu_min: 25,
        suhu_max: 32,
        kelembaban: 80,
        angin: 10,
        arah_angin: 'S',
        icon: 'https://api.bmkg.go.id/asset/cuaca/3.svg'
      },
      // per 3 jam, total ~16 item
    ]
  }
}

Finance

saham(kode)

await s.saham('ihsg')   // IHSG
await s.saham('bbca')   // saham BCA
await s.saham('GOTO')   // kode IDX langsung

Kode bawaan: ihsg bbca bbri bmri tlkm asii goto unvr hmsp antm indf klbf

// response saham('bbca')
{
  creator: 'Angga Putra',
  status: true,
  data: {
    kode: 'BBCA',
    nama: 'Bank Central Asia Tbk',
    close: 9850,
    open: 9800,
    high: 9900,
    low: 9750,
    volume: 12540000,
    perubahan_pct: 0.51,
    perubahan_abs: 50,
    performa: {
      '1W': 1.23,
      '1M': -2.45,
      '3M': 5.67,
      '6M': 8.12,
      '1Y': 12.34,
      'YTD': 3.21
    },
    sumber: 'TradingView'
  }
}
// response saham('ihsg')
{
  creator: 'Angga Putra',
  status: true,
  data: {
    kode: 'IHSG',
    symbol: 'IDX:COMPOSITE',
    open: 7102.34,
    high: 7145.67,
    low: 7089.12,
    close: 7130.45,
    volume: 18750000000,
    update: '2026-05-15T09:00:00.000Z',
    sumber: 'TradingView'
  }
}
await s.sahamList(50)   // daftar saham by market cap, default 50, max 906
// response sahamList()
{
  creator: 'Angga Putra',
  status: true,
  data: {
    total: 906,
    tampil: 50,
    data: [
      {
        kode: 'BBCA',
        nama: 'Bank Central Asia Tbk',
        close: 9850,
        perubahan_pct: 0.51,
        perubahan_abs: 50,
        volume: 12540000,
        market_cap: 241350000000000,
        performa: { '1W': 1.23, '1M': -2.45, '1Y': 12.34, 'YTD': 3.21 }
      },
      // ...
    ]
  }
}

kurs(kode) / kursAll()

await s.kurs('usd')
await s.kursAll()

Mendukung semua kode ISO 4217. Sumber: fiskal.kemenkeu.go.id.

// response kurs('usd')
{
  creator: 'Angga Putra',
  status: true,
  data: {
    mata_uang: 'Dolar Amerika Serikat',
    kode: 'USD',
    nilai: '16.285',
    perubahan: '+25',
    sumber: 'Kemenkeu'
  }
}

// response kursAll()
{
  creator: 'Angga Putra',
  status: true,
  data: {
    sumber: 'Kemenkeu',
    data: [
      { mata_uang: 'Dolar Amerika Serikat', kode: 'USD', nilai: '16.285', perubahan: '+25' },
      { mata_uang: 'Euro',                  kode: 'EUR', nilai: '17.842', perubahan: '-10' },
      // ...
    ]
  }
}

emasAntam() / emasHarga()

await s.emasAntam()   // harga emas Antam per gram (logammulia.com)
await s.emasHarga()   // harga emas dunia dalam IDR, Ounce & Gram
// response emasAntam()
{
  creator: 'Angga Putra',
  status: true,
  data: {
    tanggal: 'Harga Emas 15 Mei 2026',
    data: [
      { berat: '0.5 gr',  harga_dasar: 'Rp 875.000',    harga_termasuk_pajak: 'Rp 913.000' },
      { berat: '1 gr',    harga_dasar: 'Rp 1.650.000',  harga_termasuk_pajak: 'Rp 1.722.000' },
      { berat: '2 gr',    harga_dasar: 'Rp 3.280.000',  harga_termasuk_pajak: 'Rp 3.424.000' },
      { berat: '5 gr',    harga_dasar: 'Rp 8.150.000',  harga_termasuk_pajak: 'Rp 8.517.000' },
      // ...
    ]
  }
}

bbm()

await s.bbm()
// response
{
  creator: 'Angga Putra',
  status: true,
  data: {
    update: 'Last Updated: 15 Mei 2026',
    harga: [
      { jenis: 'Pertalite',  harga: 'Rp 10.000/Liter' },
      { jenis: 'Pertamax',   harga: 'Rp 12.500/Liter' },
      { jenis: 'Dexlite',    harga: 'Rp 13.950/Liter' },
      { jenis: 'Pertamina Dex', harga: 'Rp 14.550/Liter' }
    ],
    provinsi: [
      { Provinsi: 'DKI Jakarta', Pertalite: 'Rp 10.000', Pertamax: 'Rp 12.500' },
      // ...
    ]
  }
}

Info

cekNomor(nomor)

Cek provider nomor HP Indonesia. Bekerja offline, tanpa network request.

await s.cekNomor('08123456789')
await s.cekNomor('+628123456789')
await s.cekNomor('628123456789')
// response (semua format input menghasilkan output yang sama)
{
  creator: 'Angga Putra',
  status: true,
  data: {
    nomor_asli: '08123456789',
    nomor: '08123456789',
    prefix: '0812',
    provider: 'Telkomsel',
    panjang: 11
  }
}

Provider yang dikenali: Telkomsel, Indosat, XL, AXIS, Smartfren, Three.


cekResi(kurir, noResi)

await s.cekResi('jne', 'JNEX12345678')

Kurir: jne jnt j&t sicepat pos anteraja wahana tiki ninja lion

// response
{
  creator: 'Angga Putra',
  status: true,
  data: {
    kurir: 'jne',
    noResi: 'JNEX12345678',
    status: 'DELIVERED',
    history: [
      { tanggal: '15/05/2026 10:30', keterangan: 'DELIVERED',    lokasi: 'Jakarta Selatan' },
      { tanggal: '15/05/2026 07:00', keterangan: 'WITH COURIER', lokasi: 'Jakarta' },
      { tanggal: '14/05/2026 20:00', keterangan: 'RECEIVED AT ORIGIN GATEWAY', lokasi: 'Surabaya' }
    ]
  }
}

Downloader

instagram(url)

await s.instagram('https://www.instagram.com/p/...')
// response (foto / video / reels)
{
  creator: 'Angga Putra',
  status: true,
  data: {
    url: 'https://www.instagram.com/p/...',
    medias: [
      {
        type: 'video',
        url: 'https://cdn.rapidcdn.app/...',
        thumbnail: 'https://...'
      }
    ]
  }
}

// carousel — medias berisi lebih dari 1 item
{
  creator: 'Angga Putra',
  status: true,
  data: {
    url: 'https://www.instagram.com/p/...',
    medias: [
      { type: 'image', url: 'https://...', thumbnail: 'https://...' },
      { type: 'image', url: 'https://...', thumbnail: 'https://...' },
      { type: 'video', url: 'https://...', thumbnail: 'https://...' }
    ]
  }
}
await s.tiktok(url)      // video TikTok tanpa watermark
await s.spotify(url)     // track atau playlist Spotify
await s.facebook(url)    // video Facebook
await s.mediafire(url)   // direct link Mediafire
await s.gdrive(url)      // direct link Google Drive

Tools

ssweb(url, device)

Screenshot website via Microlink API.

await s.ssweb('https://example.com')
await s.ssweb('https://example.com', 'mobile')

Device: desktop (default) mobile tablet hd 4k


simsimi(text)

await s.simsimi('halo, apa kabar?')

Extending

Untuk menambah scraper baru:

1. Buat file di folder yang sesuai, contoh src/news/bisnis.js:

const { fetchHTML, cheerio, ok, fail } = require('../utils')

const bisnis = async (options = {}) => {
  return new Promise(async (resolve) => {
    try {
      const html = await fetchHTML('https://bisnis.com/...')
      const $ = cheerio.load(html)
      // parse data ...
      resolve(ok(data))
    } catch (e) {
      resolve(fail(e))
    }
  })
}

module.exports = { bisnis }

2. Daftarkan di index.js:

require('./src/news/bisnis'),

Utils yang tersedia: fetchHTML fetchJSON cheerio parseLdJson parseThumbnail parseParagraphs ok fail


Notes

  • Scraper berbasis HTML parsing. Jika status: false dan pesan "Data tidak ditemukan", kemungkinan selector CSS perlu diperbarui karena situs mengubah struktur HTML-nya.
  • BMKG Gempa menggunakan mirror Google Storage agar tidak terkena rate limit endpoint utama BMKG.
  • Data saham dan IHSG dari TradingView Scanner — tanpa API key, tanpa rate limit.
  • Kurs dari Kemenkeu (fiskal.kemenkeu.go.id) — data resmi pemerintah.

License

MIT © Angga Putra