goldprice.dev / Use case / Monitoring dealer Indonesia
Monitoring Harga Jual dan Buyback Dealer Emas Indonesia
Bandingkan kuotasi dealer Indonesia melalui API physical goldprice.dev. Jangan menyamakan harga spot internasional dengan harga jual dealer. Setiap kuotasi membawa produk, bobot, harga jual, harga buyback bila tersedia, dan timestamp sumber.
Field yang harus disimpan
- Normalisasi bobot: gunakan
denomination_gramssaat ada. Untuk produk yang sudahprice_basis=per_gram, gunakan 1 gram sebagai penyebut. - Produk dan kemurnian: simpan
product,brand, danprice_basis. Respons tidak memiliki field kemurnian universal. Periksa kemurnian produk dari sumber sebelum membandingkan; emas digital dan batangan fisik juga memiliki biaya serta ketentuan berbeda. - Jual dan buyback:
selladalah harga dealer menjual;buybackadalah harga dealer membeli kembali dan dapat bernilai null. - Waktu:
data_updated_atadalah waktu observasi sumber;fetched_atadalah waktu Goldprice mengambilnya. Keduanya harus disimpan.
Cakupan sumber Indonesia
Route Indonesia dikonfigurasi untuk Aneka Logam, IndoGold, Pegadaian, dan Treasury. Kuotasi yang benar-benar tersedia mengikuti publikasi sumber; jangan menganggap semua sumber selalu mengembalikan harga jual dan buyback lengkap. Lihat cakupan Indonesia untuk produk dan sumbernya.
Ambil kuotasi dealer Indonesia
Simpan contoh berikut sebagai monitor-dealer.mjs, atur GOLDPRICE_API_KEY pada lingkungan server, lalu jalankan node monitor-dealer.mjs dengan Node 20 atau lebih baru. Setiap eksekusi mencetak satu baris JSON per kuotasi; arahkan hasil ke berkas log bila ingin menyimpan pengamatan.
const key = process.env.GOLDPRICE_API_KEY;
if (!key) throw new Error("GOLDPRICE_API_KEY wajib di server");
const response = await fetch("https://api.goldprice.dev/v1/physical/id", {
headers: { Authorization: "Bearer " + key },
signal: AbortSignal.timeout(10000),
});
if (!response.ok) throw new Error("Goldprice HTTP " + response.status);
const data = await response.json();
if (data.result !== "success" || data.currency !== "IDR" || !Array.isArray(data.quotes)) {
throw new Error("Respons physical Indonesia tidak valid");
}
const spot = Number(data.spot_reference?.spot_per_gram_local);
for (const quote of data.quotes) {
const grams = quote.price_basis === "per_gram" ? 1
: quote.price_basis === "per_bar" ? Number(quote.denomination_grams) : NaN;
const sell = Number(quote.sell);
const buyback = quote.buyback == null ? null : Number(quote.buyback);
if (!Number.isFinite(grams) || grams <= 0 || !Number.isFinite(sell) || sell <= 0
|| (buyback != null && (!Number.isFinite(buyback) || buyback <= 0))) {
console.error("Lewati kuotasi tidak valid", quote.source, quote.product);
continue;
}
const observed = Date.parse(quote.data_updated_at);
const age = Date.now() - observed;
const stale = !Number.isFinite(observed) || age < -300000 || age > 3600000;
const sellPerGram = sell / grams;
const buybackPerGram = buyback == null ? null : buyback / grams;
console.log(JSON.stringify({
source: quote.source, brand: quote.brand, product: quote.product,
priceBasis: quote.price_basis, denominationGrams: quote.denomination_grams,
sellPerGram, buybackPerGram,
spreadPerGram: buybackPerGram == null ? null : sellPerGram - buybackPerGram,
premiumOverSpotPct: Number.isFinite(spot) && spot > 0 ? (sellPerGram / spot - 1) * 100 : null,
dataUpdatedAt: quote.data_updated_at, fetchedAt: quote.fetched_at, stale,
}));
}Endpoint memerlukan plan Physical atau lebih tinggi. Data Physical untuk evaluasi dan monitoring internal; penggunaan komersial membutuhkan Pro atau Realtime Pro. Simpan API key di server.
Bentuk respons
{
"result": "success",
"country": "ID",
"currency": "IDR",
"spot_reference": { "spot_per_gram_local": "2154917.00" },
"quotes": [{
"source": "treasury_id", "product": "digital_gram",
"denomination_grams": null, "price_basis": "per_gram",
"sell": "2497154", "buyback": "2414599",
"data_updated_at": "2026-09-29T02:14:02Z", "fetched_at": "2026-09-29T02:15:09Z"
}]
}Contoh respons ini bersifat ilustratif, bukan harga terkini. Gunakan penyebut 1 hanya jika price_basis adalah per_gram. Untuk per_bar, bobot harus ada dan positif; contoh melewati kuotasi dengan basis atau bobot tidak valid. Jangan menebak kemurnian yang tidak diberikan sumber.
Bedakan spread dealer dan premium terhadap spot
spreadPerGram = sellPerGram − buybackPerGram mengukur selisih jual dan buyback dealer untuk produk yang sama. Jika buyback tidak tersedia, spread tetap null. premiumOverSpotPct = (sellPerGram / spotPerGram − 1) × 100 membandingkan harga jual dengan referensi spot lokal; ini bukan spread dealer dan bukan laba yang dijamin. Referensi spot dan kuotasi dealer dapat memiliki waktu pengamatan berbeda, serta pajak, biaya cetak, merek, dan syarat penyerahan berbeda. Simpan respons asli untuk audit dan bandingkan produk dengan bobot serta kemurnian yang setara.
Pasang pemeriksaan freshness
Contoh memberi tanda stale jika pengamatan lebih lama dari 1 jam, tidak valid, atau lebih dari 5 menit di masa depan. Itu kebijakan contoh, bukan janji frekuensi pembaruan dealer. Tetapkan batas umur sesuai kebutuhan monitoring Anda. Jika data_updated_at tidak ada, tidak valid, atau terlalu lama, tandai kuotasi stale dan jangan gunakan sebagai harga terkini. fetched_at membantu membedakan keterlambatan sumber dari keterlambatan pengambilan.
Jalankan pemeriksaan sesuai jadwal internal. Satu eksekusi memakai satu permintaan API; setiap 6 jam berarti sekitar 120 permintaan per 30 hari sebelum retry. Untuk 401 periksa key, untuk 403 periksa hak plan, dan untuk 429 ikuti Retry-After. Jangan mengganti kegagalan atau buyback yang hilang dengan nol.
Lanjutkan
Baca dokumentasi API, lihat cakupan Indonesia, atau periksa detail plan. Untuk tampilan publik, ikuti terms dan panduan atribusi.