Để lấy giá vàng trực tiếp trong Python, dùng requests gửi GET tới api.goldprice.dev/v1/spot/XAU-USD-SPOT, đặt khóa API trong header X-API-Key. Dùng cachetools.TTLCache lưu đệm 60 giây và Decimal tính giá.
Gói miễn phí có 5.000 lượt/tháng, không cần thẻ tín dụng. Đã kiểm thử tháng Mười 2026 với Python 3.15 + requests 2.34.
Lấy khóa API goldprice.dev
Đăng ký tài khoản miễn phí tại goldprice.dev/onboarding. Sau khi xác nhận email, bảng điều khiển hiển thị khóa bắt đầu bằng ga_live_. Đặt khóa làm biến môi trường:
export GOLDPRICE_API_KEY=ga_live_replace_with_your_key_hereGói miễn phí có 5.000 lượt/tháng và giá vàng giao ngay theo 31 tiền tệ. Không cần thẻ tín dụng.
Cài các thư viện cần thiết
Bạn cần ba gói: requests để gọi HTTP, cachetools để lưu đệm TTL trong tiến trình và tenacity để thử lại khi gặp 429. Cài bằng pip hoặc uv:
# pippip install requests cachetools tenacity# or uv (recommended)uv add requests cachetools tenacityViết trình khách goldprice
Lưu mã thành goldprice.py. Hàm spot() lưu đệm từng mã trong 60 giây, thử lại tối đa 3 lần khi gặp 429 với thời gian chờ tăng theo cấp số nhân, trả giá dạng Decimal để phép tính sau đó không sai lệch do số thực dấu phẩy động.
# 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']})")Chạy mã
Chạy tệp trong shell đã đặt GOLDPRICE_API_KEY. Lần đầu gọi API; các lần trong 60 giây trả ngay giá đã lưu đệm. Chạy lại bằng tiến trình mới sẽ không dùng được bộ nhớ đệm cũ vì nó chỉ tồn tại trong tiến trình. Dùng Redis nếu cần chia sẻ bộ nhớ đệm giữa các tiến trình.
python goldprice.py# XAU-USD: 4012.75 (computed 2026-10-23T07:00:18.221118+00:00)Đổi tiền tệ hoặc kim loại
Mã có dạng METAL-CURRENCY-SPOT. Truyền mã thuộc 31 tiền tệ giao ngay vào spot(). Mỗi mã lưu đệm riêng trong TTLCache. Bảng tổng quan lấy 5 mã mỗi 60s gửi 5 lượt gọi API/phút khi không trúng bộ nhớ đệm và 0 lượt khi trúng.
# USD spot, defaultspot("XAU-USD-SPOT")spot("XAU-INR-SPOT")spot("XAU-EUR-SPOT")# Silver in USDspot("XAG-USD-SPOT")Kết quả mong đợi
{ "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 hiện một dòng: symbol, quote_currency, price dạng Decimal và dấu thời gian computed_at theo ISO 8601. Mã xử lý tiếp theo dùng phản hồi TypedDict này.
Lỗi thường gặp
| Mã | Biểu hiện | Cách sửa |
|---|---|---|
| 401 | requests.exceptions.HTTPError: 401 Client Error | Thiếu khóa API hoặc khóa sai. Kiểm tra GOLDPRICE_API_KEY bằng echo $GOLDPRICE_API_KEY. Nếu trống, đặt lại khóa từ bảng điều khiển. Trình khách báo thiếu biến khi nhập mô-đun, không đợi lúc gọi hàm, nên lỗi xuất hiện ngay lần đầu import goldprice. |
| 429 | Ba lần thử lại RateLimited sau thời gian chờ đều thất bại, rồi lỗi được ném ra ngoài | Bạn đã hết hạn mức mỗi phút. Bộ nhớ đệm 60 giây ngăn lỗi khi lấy giá đều đặn; nếu nhiều mã khác nhau được gọi cùng lúc, tăng TTLCache.maxsize hoặc giãn các lần gọi. Nếu cần lượng gọi lớn liên tục, xem gói trả phí tại /pricing. |
| N/A | Sai số float tích lũy khi cộng nhiều giá | Luôn tính bằng Decimal, không dùng float. Trình khách trả giá dạng Decimal; khi chuyển sang JSON, dùng str(price) thay cho ép sang float để giữ độ chính xác khi truyền dữ liệu. |
Làm thêm
- Lưu đệm qua nhiều tiến trình: thay
TTLCachebằng bộ nhớ đệm Redis để nhiều worker dùng chung giá trong bộ nhớ - Thêm hàm bọc
bars()cho/v1/bars?symbol=XAU-USD-SPOT&interval=1d&from=...&to=..., chuyển sang pandas DataFrame để kiểm thử chiến lược - Đổi
requestssanghttpx.AsyncClientnếu dịch vụ dùng xử lý bất đồng bộ; cấu trúc phản hồi giữ nguyên - Gắn trình khách vào endpoint FastAPI để các dịch vụ không dùng Python gọi nội bộ
- Xuất chỉ số Prometheus về tỷ lệ trúng bộ nhớ đệm, độ trễ p50/p95 và số lần thử lại do 429