Untuk mendapatkan harga emas terkini di Python, kirim GET ke api.goldprice.dev/v1/spot/XAU-USD-SPOT melalui requests dengan kunci API di header X-API-Key. Gunakan cachetools.TTLCache untuk cache 60 detik dan Decimal untuk perhitungan harga. Paket gratis mencakup 5.000 panggilan/bulan tanpa kartu kredit. Diuji pada Oktober 2026 dengan Python 3.15 + requests 2.34.
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 gratis mencakup 5.000 panggilan/bulan dan harga spot emas dalam 31 mata uang. Tidak perlu kartu kredit.
Instal dependensi
Anda membutuhkan tiga paket: requests untuk panggilan HTTP, cachetools untuk cache TTL dalam proses, dan tenacity untuk mencoba ulang saat 429. Instal dengan pip atau uv:
# pippip install requests cachetools tenacity# or uv (recommended)uv add requests cachetools tenacityTulis klien goldprice
Simpan sebagai goldprice.py. Fungsi spot() menyimpan cache per simbol selama 60 detik, mencoba ulang hingga 3 kali saat 429 dengan jeda eksponensial, dan mengembalikan harga sebagai Decimal agar perhitungan berikutnya tidak meleset akibat ketidakpresisian float.
# python: goldprice.py# curl-equivalent: https://api.goldprice.dev/v1/spot/XAU-USD-SPOTimport osfrom decimal import Decimalfrom typing import TypedDictimport requestsfrom cachetools import TTLCache, cachedfrom tenacity import ( retry, retry_if_exception_type, stop_after_attempt, wait_exponential,)API_BASE = "https://api.goldprice.dev"API_KEY = os.environ["GOLDPRICE_API_KEY"]TIMEOUT = 5 # secondsclass SpotResponse(TypedDict): symbol: str quote_currency: str price: Decimal bid: Decimal | None # only on plans that include bid and ask ask: Decimal | None is_stale: bool computed_at: strclass RateLimited(Exception): """Raised on HTTP 429 so tenacity retries with backoff."""@cached(cache=TTLCache(maxsize=128, ttl=60))@retry( retry=retry_if_exception_type(RateLimited), wait=wait_exponential(multiplier=1, min=2, max=30), stop=stop_after_attempt(3), reraise=True,)def spot(symbol: str = "XAU-USD-SPOT") -> SpotResponse: """Fetch live spot price. Cached 60s per symbol, retries 3x on 429.""" resp = requests.get( f"{API_BASE}/v1/spot/{symbol}", headers={"X-API-Key": API_KEY}, timeout=TIMEOUT, ) if resp.status_code == 429: raise RateLimited(resp.text) resp.raise_for_status() data = resp.json() return { "symbol": data["symbol"], "quote_currency": data["quote_currency"], "price": Decimal(data["price"]), "bid": Decimal(data["bid"]) if data.get("bid") else None, "ask": Decimal(data["ask"]) if data.get("ask") else None, "is_stale": data["is_stale"], "computed_at": data["computed_at"], }if __name__ == "__main__": r = spot("XAU-USD-SPOT") print(f"{r['symbol']}-{r['quote_currency']}: {r['price']} (computed {r['computed_at']})")Jalankan
Jalankan file dari shell tempat Anda mengekspor GOLDPRICE_API_KEY. Panggilan pertama mengakses API; panggilan dalam 60 detik langsung memakai cache. Menjalankan proses baru tidak memakai cache sebelumnya karena cache hanya ada dalam proses; simpan di Redis jika perlu berbagi cache antarproses.
python goldprice.py# XAU-USD: 4012.75 (computed 2026-10-23T07:00:18.221118+00:00)Ganti mata uang atau logam
Format simbol adalah METAL-CURRENCY-SPOT. Berikan simbol dari 31 mata uang spot ke spot(). Setiap simbol memiliki cache terpisah dalam TTLCache, jadi dasbor yang mengambil 5 simbol setiap 60 detik mengirim 5 panggilan API/menit tanpa cache dan 0 saat dilayani cache.
# USD spot, defaultspot("XAU-USD-SPOT")spot("XAU-INR-SPOT")spot("XAU-EUR-SPOT")# Silver in USDspot("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: symbol, quote_currency, price sebagai Decimal, dan penanda waktu computed_at berformat ISO 8601. Kode Anda selanjutnya memakai respons TypedDict tersebut.
Kesalahan umum
| Kode | Gejala | Solusi |
|---|---|---|
| 401 | requests.exceptions.HTTPError: 401 Client Error | Kunci API tidak ada atau tidak valid. Periksa GOLDPRICE_API_KEY: echo $GOLDPRICE_API_KEY. Jika kosong, ekspor ulang dari dasbor Anda. Klien memunculkan kesalahan variabel lingkungan saat impor, bukan saat pemanggilan, sehingga kegagalan muncul pada import goldprice pertama. |
| 429 | Tiga percobaan ulang RateLimited dengan jeda gagal, lalu exception diteruskan | Batas per menit sudah habis. Cache 60 detik mencegahnya saat pengambilan berkala stabil; jika banyak simbol berbeda dipanggil bersamaan, naikkan TTLCache.maxsize atau beri jeda antarpanggilan. Untuk volume tinggi berkelanjutan, lihat paket berbayar di /pricing. |
| N/A | Kesalahan presisi float menumpuk saat banyak harga dijumlahkan | Selalu gunakan Decimal dalam perhitungan, jangan float. Klien mengembalikan harga sebagai Decimal; untuk serialisasi JSON, gunakan str(price) alih-alih mengubahnya ke float agar presisi tetap terjaga saat dikirim. |
Langkah berikutnya
- Simpan cache lintas proses dengan mengganti
TTLCachemenjadi cache berbasis Redis agar beberapa worker berbagi satu harga dalam memori - Tambahkan pembungkus
bars()untuk/v1/bars?symbol=XAU-USD-SPOT&interval=1d&from=...&to=...dengan konversi pandas DataFrame untuk uji historis - Ganti
requestsdenganhttpx.AsyncClientjika layanan Anda asinkron; bentuk respons tetap sama - Hubungkan klien ke endpoint FastAPI dan sediakan secara internal untuk layanan non-Python
- Sediakan metrik Prometheus untuk rasio cache hit, latensi p50/p95, dan jumlah percobaan ulang 429