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

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.