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:
export GOLDPRICE_API_KEY=ga_live_replace_with_your_key_herePaket 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:
npm install decimal.jsBuat 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.
// 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.
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.
// 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
{ "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
| Kode | Gejala | Solusi |
|---|---|---|
| 401 | goldprice: unexpected status 401 pada panggilan pertama | Kunci 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. |
| 429 | Tiga percobaan ulang dengan jeda semuanya menghasilkan 429, lalu spot() ditolak | Anda 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/A | Harga terlihat benar, tetapi sedikit meleset setelah perhitungan berulang | Number 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
Mapdengan 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