Cara Cepat Mendapatkan Kurs USD dari Website Bank Indonesia dengan PHP

- Mei 27, 2026

cara cepat mendapatkan kurs usd dari bank indonesia
Cara Cepat Mendapatkan Kurs USD dari Website Bank Indonesia dengan PHP

Kemarin ada kebutuhan di project, tepatnya di satu fitur yang harus nampilin nilai kurs USD. Awalnya mikir, pakai API apa ya? Ternyata setelah cari-cari, Bank Indonesia sudah menyediakan halaman kurs transaksi yang bisa diakses publik.

Jadi daripada pakai API pihak ketiga yang kadang tidak stabil atau malah berbayar, langsung saja scraping dari website BI. Toh datanya resmi dan selalu update.


Struktur Halaman Kurs BI

Halaman yang jadi target ada di

https://www.bi.go.id/id/statistik/informasi-kurs/transaksi-bi/default.aspx
Kalau dibuka, isinya berupa tabel HTML biasa dengan class table-striped. Jadi tinggal baca DOM-nya, cari baris yang tepat, ambil nilainya.

Yang perlu diperhatikan, kurs USD itu berada pada baris ke-25 di tabel tersebut. Jadi kuncinya memang di situ, tahu posisi row-nya berapa.

cara cepat mendapatkan kurs usd dari bank indonesia-1

Kode PHP untuk Scraping Kurs

Saya pakai curl untuk fetch halaman, lalu DOMDocument dan DOMXPath untuk parsing HTML-nya. Berikut fungsi lengkapnya:

private function getKursUSD()
{
    $headers = [
        "Referer: https://www.google.com/",
        "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
        "Accept-Language: en-US,en;q=0.5",
        "Connection: keep-alive",
        "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36",
    ];
    $url = 'https://www.bi.go.id/id/statistik/informasi-kurs/transaksi-bi/default.aspx';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_ENCODING, "gzip");

    if (!$html = curl_exec($ch)) {
        return response()->json(['status'  => false, 'message' => 'Failed to fetch!'], 500);
    }

    $dom = new DOMDocument;
    libxml_use_internal_errors(true);
    $dom->loadHTML($html);
    libxml_use_internal_errors(false);

    $xpath = new DOMXPath($dom);
    $rows = $xpath->query("//table[contains(@class, 'table-striped')]/tbody/tr[25]");

    $result = [];

    if ($rows->length >= 1) {
        $row = $rows->item(1);
        $cols = $row->getElementsByTagName('td');

        if ($cols->length >= 1) {
            $jual   = $this->toFloat(trim($cols->item(2)->nodeValue));
            $beli   = $this->toFloat(trim($cols->item(3)->nodeValue));
            $tengah = ($jual + $beli) / 2;

            $result = [
                'jual'   => $jual,
                'beli'   => $beli,
                'tengah' => $tengah,
            ];
        }
    }

    return $result;
}

Penjelasan Singkat

Beberapa hal yang perlu diperhatikan dari kode di atas:

Headers dan User-Agent — Tanpa header yang lengkap, kadang request diblokir atau dapat response yang berbeda. Jadi saya tambahkan User-Agent supaya terlihat seperti request dari browser biasa.

SSL Verify — Saya matikan CURLOPT_SSL_VERIFYHOST dan CURLOPT_SSL_VERIFYPEER. Ini bukan praktik terbaik sih sebenarnya, tapi di kasus ini supaya tidak ribet dengan masalah sertifikat. Kalau mau lebih proper, bisa diaktifkan lagi dan pastikan CA certificate-nya benar.

XPath Query — Bagian paling penting. Query //table[contains(@class, 'table-striped')]/tbody/tr[25] ini yang menentukan kita ambil baris ke-25 dari tabel. Di situlah data kurs USD berada.

Kurs Tengah — Nilai kurs tengah saya hitung manual dari rata-rata jual dan beli: ($jual + $beli) / 2.


Kapan Perlu Update Posisi Row?

Perlu diingat, posisi baris ke-25 ini bisa berubah kalau BI mengubah struktur halaman mereka. Jadi kalau suatu saat datanya kosong atau aneh, cek dulu apakah posisi row-nya masih sama. Cara gampangnya, buka halaman-nya di browser, inspect element, hitung manual row yang berisi USD.

Kalau mau lebih robust, bisa juga cari berdasarkan teks "USD" di kolom pertama, tapi untuk kebutuhan saya saat ini cara manual ini sudah cukup.

cara cepat mendapatkan kurs usd dari bank indonesia-2

Penyimpanan ke Database

Karena ini bagian dari project Laravel, hasil dari fungsi ini nantinya akan disimpan ke tabel database. Jadi ada record kurs yang bisa dipakai untuk keperluan perhitungan di fitur lain. Tapi untuk kode penyimpanan ke database-nya, mungkin akan saya bahas di postingan berikutnya.

Intinya, kalau kalian butuh kurs resmi dari BI untuk keperluan project, cara scraping seperti ini cukup praktis. Tidak perlu daftar API key, tidak perlu bayar, tinggal parsing HTML-nya saja.


Kesimpulan

Scraping kurs dari website BI itu ternyata tidak susah. Yang penting tahu struktur HTML-nya dan posisi data yang mau diambil. Dengan kombinasi cURL dan DOMDocument, data kurs USD bisa didapat dalam hitungan detik.

Tentu saja pendekatan ini punya kelemahan — kalau BI mengubah tampilan websitenya, kode ini perlu disesuaikan. Tapi untuk sementara, ini solusi yang paling cepat dan praktis.




EmoticonEmoticon

 

Start typing and press Enter to search