TutorialKode

Cara mengambil harga emas live di Node.js

Akses API goldprice.dev dari Node.js dengan fetch bawaan, decimal.js, percobaan ulang saat 429, dan cache dengan TTL 60 detik.

5 Jul 2026 · 3 menit baca

Untuk mengambil harga emas live di Node.js, kirim GET ke api.goldprice.dev/v1/spot/XAU-USD-SPOT dengan kunci API Anda di header X-API-Key menggunakan fetch bawaan. Tidak perlu pustaka HTTP. Simpan respons dalam Map selama 60 detik dan gunakan decimal.js untuk perhitungan harga. Paket Free mencakup 5.000 panggilan/bulan, tanpa kartu kredit. Diuji pada Juli 2026 dengan Node 22 LTS.

Dapatkan kunci API goldprice.dev Anda

Daftar akun gratis di goldprice.dev/onboarding. Setelah konfirmasi email, dasbor Anda menampilkan kunci berawalan ga_live_. Simpan sebagai variabel lingkungan:

Shell
export GOLDPRICE_API_KEY=ga_live_replace_with_your_key_here

Paket Free mencakup 5.000 panggilan/bulan dan harga spot emas dalam 31 mata uang. Tidak perlu kartu kredit.

Instal decimal.js

Node 18+ menyediakan fetch bawaan, jadi tidak perlu klien HTTP. Satu-satunya dependensi adalah decimal.js agar perhitungan harga tetap presisi, tanpa galat pembulatan dari tipe Number JavaScript. Instal dengan:

shell
npm install decimal.js

Buat klien goldprice

Simpan sebagai goldprice.mjs. Fungsi spot() menyimpan cache tiap simbol selama 60 detik dalam Map, mencoba ulang hingga 3 kali saat 429 dengan jeda eksponensial, dan mengembalikan harga sebagai Decimal. Bid/ask hanya tersedia pada paket berbayar dan bernilai null jika tidak tersedia.

goldprice.mjs
// node: goldprice.mjs// curl-equivalent: https://api.goldprice.dev/v1/spot/XAU-USD-SPOTimport Decimal from "decimal.js";const API_BASE = "https://api.goldprice.dev";const API_KEY = process.env.GOLDPRICE_API_KEY;if (!API_KEY) {  throw new Error("GOLDPRICE_API_KEY not set");}const TTL_MS = 60_000;const cache = new Map();/** Fetch live spot price. Cached 60s per symbol, retries 3x on 429. */export async function spot(symbol = "XAU-USD-SPOT") {  const cached = cache.get(symbol);  if (cached && cached.expiresAt > Date.now()) {    return cached.data;  }  let lastErr;  for (let attempt = 0; attempt < 3; attempt++) {    const res = await fetch(`${API_BASE}/v1/spot/${symbol}`, {      headers: { "X-API-Key": API_KEY },      signal: AbortSignal.timeout(5000),    });    if (res.status === 429) {      lastErr = new Error("goldprice: 429 rate limited");      const backoffMs = 2 ** attempt * 1000; // 1s, 2s, 4s      await new Promise((resolve) => setTimeout(resolve, backoffMs));      continue;    }    if (!res.ok) {      throw new Error(`goldprice: unexpected status ${res.status}`);    }    const raw = await res.json();    const data = {      symbol: raw.symbol,      quoteCurrency: raw.quote_currency,      price: new Decimal(raw.price),      bid: raw.bid == null ? null : new Decimal(raw.bid),      ask: raw.ask == null ? null : new Decimal(raw.ask),      isStale: raw.is_stale,      computedAt: raw.computed_at,    };    cache.set(symbol, { data, expiresAt: Date.now() + TTL_MS });    return data;  }  throw lastErr;}

Jalankan

Impor modul dan panggil spot(). Panggilan pertama mengakses API. Panggilan dalam 60 detik berikutnya mengembalikan Decimal dari cache tanpa permintaan jaringan. Cache hanya tersimpan dalam proses dan terhapus saat proses dimulai ulang. Gunakan Redis jika cache perlu dibagikan antarproses.

run.mjs
import { spot } from "./goldprice.mjs";const r = await spot("XAU-USD-SPOT");console.log(`${r.symbol}-${r.quoteCurrency}: ${r.price} (computed ${r.computedAt})`);// XAU-USD: 4012.75 (computed 2026-10-23T07:00:18.221118+00:00)

Ganti mata uang atau logam

Format simbol adalah METAL-CURRENCY-SPOT. Gunakan simbol dari 31 mata uang spot saat memanggil spot(). Setiap simbol memiliki cache sendiri dalam Map. Dasbor yang memeriksa 5 simbol setiap 60 detik membuat 5 panggilan API/menit tanpa cache dan 0 saat menggunakan cache.

goldprice.mjs · multivaluta
// USD spot, defaultawait spot("XAU-USD-SPOT");await spot("XAU-INR-SPOT");await spot("XAU-EUR-SPOT");// Silver in USDawait spot("XAG-USD-SPOT");

Hasil yang diharapkan

JSON
{  "symbol": "XAU",  "quote_currency": "USD",  "unit": "troy_ounce",  "contract_type": "spot",  "price": "4012.75",  "is_stale": false,  "computed_at": "2026-10-23T07:00:18.221118+00:00"}

Stdout menampilkan satu baris: simbol, mata uang kuotasi, harga sebagai Decimal dari decimal.js, dan waktu computedAt dalam format ISO 8601. Kode berikutnya menggunakan objek biasa yang dikembalikan spot().

Kesalahan umum

KodeGejalaSolusi
401goldprice: unexpected status 401 pada panggilan pertamaKunci API tidak tersedia atau tidak valid. Periksa variabel: echo $GOLDPRICE_API_KEY. Jika kosong, ekspor ulang kunci dari dasbor Anda. Modul langsung melempar galat saat diimpor jika variabel lingkungan kosong, sehingga masalah segera terlihat.
429Tiga percobaan ulang dengan jeda semuanya menghasilkan 429, lalu spot() ditolakAnda mencapai batas per menit. Cache 60 detik mencegahnya saat pemeriksaan berjalan teratur. Jika banyak simbol berbeda diminta bersamaan, beri jeda antarpanggilan. Untuk penggunaan bervolume tinggi secara terus-menerus, lihat paket berbayar di /pricing.
N/AHarga terlihat benar, tetapi sedikit meleset setelah perhitungan berulangNumber JavaScript menggunakan float IEEE-754: 0.1 + 0.2 === 0.30000000000000004. Harga emas memiliki 2 angka desimal. Menjumlahkan ribuan nilai dengan Number menimbulkan galat dalam basis poin. Pertahankan harga sebagai Decimal dari decimal.js selama perhitungan. Panggil .toString() atau .toNumber() hanya saat menampilkan atau menserialisasi hasil.

Langkah berikutnya

  • Simpan cache antarproses. Ganti Map dengan cache Redis agar beberapa worker berbagi harga yang sudah tersimpan
  • Tambahkan fungsi bars() untuk /v1/bars?symbol=XAU-USD-SPOT&interval=1d&from=...&to=... dan gunakan deret datanya untuk menguji strategi dengan data historis
  • Hubungkan klien ke rute Express atau Fastify agar layanan selain Node dapat mengaksesnya secara internal
  • Gabungkan permintaan bersamaan untuk simbol yang belum tersimpan agar banyak pemanggil cukup memicu satu fetch
  • Sediakan metrik Prometheus untuk rasio penggunaan cache, latensi p50/p95, dan jumlah percobaan ulang akibat 429

Pertanyaan

Seberapa sering harga diperbarui?

Endpoint spot diperbarui setiap 60 detik dengan data live berlisensi. Harga Free dan tanpa kunci terlambat 15 menit; paket berbayar live. TTL 60 detik mengikuti jadwal tersebut. Panggilan spot() selama periode itu mengembalikan Decimal dari cache tanpa permintaan jaringan.

Apakah pembaruan otomatis masih masuk kuota paket Free?

Tergantung pemakaian. Panggilan setiap menit = 1.440 panggilan/hari = ~43.000/bulan, melebihi kuota Free 5.000/bulan. Gunakan cache dan panggil hanya saat diperlukan. Panggilan setiap jam = ~720/bulan, masih dalam kuota Free. Untuk penggunaan bervolume tinggi secara terus-menerus, lihat paket berbayar di /pricing.

Bolehkah digunakan secara komersial?

Semua paket mengizinkan penggunaan komersial. Paket berbayar tidak mewajibkan tautan atribusi. Jika Anda menggunakan paket Free, tampilkan tautan ke goldprice.dev yang terlihat jelas di dekat harga.

Mengapa menggunakan decimal.js, bukan Number?

Tipe angka JavaScript menggunakan float 64 bit, sehingga penjumlahan bisa meleset: 0.1 + 0.2 menghasilkan 0.30000000000000004. Harga emas memiliki 2 angka desimal. Penjumlahan ribuan nilai dengan Number menimbulkan galat basis poin. decimal.js menjaga presisi perhitungan. API mengembalikan harga sebagai string agar klien dapat membuat Decimal tanpa kehilangan presisi.

Apakah perlu TypeScript atau proses build?

Tidak. Contoh ini memakai modul ES biasa (.mjs) yang langsung dijalankan Node 18+ tanpa transpiler. Jika proyek Anda memakai TypeScript, kode yang sama dapat digunakan dalam berkas .ts. fetch, AbortSignal.timeout, dan decimal.js sudah menyediakan tipe masing-masing.

Logam apa saja yang didukung?

Logam yang didukung adalah emas (XAU), perak (XAG), dan tembaga (HG). Platinum dan paladium tidak tersedia pada paket mana pun. Ganti kode logam dalam simbol, misalnya spot("XAG-USD-SPOT").

Apakah paket Free benar-benar gratis?

Ya. Paket Free menyediakan 5.000 panggilan API per bulan, tanpa kartu kredit dan tanpa masa kedaluwarsa. Anda bisa mendapatkan kunci API dengan mendaftar di /onboarding.

Bisakah Claude membuatkan kode ini?

Bisa. Buka Claude Desktop dengan server MCP goldprice.dev terpasang, lalu minta: Buat klien Node.js untuk endpoint goldprice.dev /v1/spot. Gunakan fetch bawaan, decimal.js, cache Map 60 detik, dan percobaan ulang saat 429 dengan jeda eksponensial. Baca kunci API dari GOLDPRICE_API_KEY. Server MCP memberi Claude skema terkini agar kode menggunakan nama kolom yang benar sejak awal.

Baca selanjutnya

Mulai dengan kunci API gratis

5.000 permintaan per bulan pada paket gratis. Tanpa kartu kredit.

Dapatkan kunci gratis