بازارنما
مستندات API نسخهٔ ۱
API عمومی، ایستا و بدون کلید. نمونههای این صفحه از فایلهای واقعی API ساخته شدهاند.
نقاط دسترسی
| مسیر | توضیح |
|---|---|
GET /api/v1/latest.json | آخرین قیمتها (44 قلم؛ coin: 5، crypto: 13، currency: 12، energy: 6، gold: 3، metal: 5) |
GET /api/v1/history/{asset_id}.json | تاریخچهٔ قیمت؛ فهرست شناسهها در index.json (44 دارایی) |
GET /api/v1/index.json | فهرست داراییها و الگوی مسیر تاریخچه |
GET /api/v1/source-health.json | سلامت منابع، سقف تازگی و تعداد هر وضعیت |
پایهٔ آدرس: https://bazarnama.github.io. فایلها ایستا هستند و با GitHub Actions بازسازی میشوند؛ زمان واقعی بهروزرسانی را از freshness بخوانید، نه از زمان درخواست.
نمونه: latest.json (ساختار)
{
"api": "bazarnama/v1",
"generated_utc": "2026-11-13T10:57:03",
"fetched_utc": "2026-11-13T11:03:43Z",
"freshness": {
"counts": {
"fresh": 44,
"aging": 0,
"stale": 0,
"unknown": 0
},
"checked_utc": "2026-11-13T11:03:43Z",
"policy_version": 1
},
"items": [
"... 44 items ..."
]
}یک قلم واقعی
{
"id": "usd",
"family": "currency",
"name": {
"en": "US dollar (Tehran free market)",
"fa": "دلار آمریکا (بازار آزاد)"
},
"unit": "IRT",
"price": 268200.0,
"price_irt": null,
"change_pct": 0.47,
"spread_pct": 0.97,
"sources": 2,
"method": "average",
"as_of": null,
"updated_utc": "2026-11-13T10:44:43",
"stale": false,
"page": {
"fa": "https://nerkhara.com/dollar/",
"en": "https://nerkhara.com/en/dollar/"
},
"history": {
"json": "https://nerkhara.com/api/v1/history/usd.json",
"csv": "https://nerkhara.com/api/v1/history/usd.csv",
"first": "2016-09-21",
"last": "2026-11-13"
},
"freshness": {
"status": "fresh",
"observed_utc": "2026-11-13T10:44:43Z",
"checked_utc": "2026-11-13T11:03:43Z",
"age_seconds": 1140,
"max_age_seconds": 5400,
"clock_basis": "provider_timestamp"
},
"source_checked_utc": "2026-11-13T11:03:43Z",
"source_name": "NerkhAra",
"source_updated_utc": "2026-11-13T10:44:43",
"source_selection": "primary-aggregated",
"secondary_source": "NerkhSanj",
"secondary_price": 266900.0,
"validation_source": "NerkhSanj",
"validation_price": 266900.0,
"source_discrepancy_pct": 0.485,
"validation_warning": false,
"discrepancy_warning": false,
"validation": {
"status": "accepted",
"reason": "ok_in_range"
}
}فیلدها
| فیلد | معنی |
|---|---|
| id | شناسهٔ دارایی؛ همان نام فایل تاریخچه. |
| family | گروه: currency، gold، coin، metal، crypto، energy. |
| name.fa / name.en | نام دارایی. |
| unit | واحد قیمت، مثلاً IRT (تومان)، USD، USDT. قیمتها را بدون توجه به این فیلد با هم جمع یا مقایسه نکنید. |
| price | قیمت فعلی در واحد unit. |
| change_pct | درصد تغییر ۲۴ساعته؛ ممکن است null باشد. |
| stale | اگر true باشد قیمت زنده تلقی نشود. |
| updated_utc | زمان بهروزرسانی ثبتشده توسط منبع. |
| freshness.status | وضعیت تازگی: fresh، aging، stale، unknown. |
| freshness.observed_utc | زمان اعلام قیمت توسط منبع. |
| freshness.checked_utc | زمان بررسی توسط بازارنما. |
| freshness.age_seconds / max_age_seconds | سن داده و سقف مجاز آن گروه. |
| freshness.clock_basis | مبنای ساعت: provider_timestamp یعنی ساعت خود منبع؛ unknown یعنی زمان معتبر موجود نبود. |
| source_name / secondary_source | منبع اصلی و (در صورت وجود) منبع مقایسهکننده. |
| source_discrepancy_pct | اختلاف درصدی با منبع دوم؛ فقط وقتی منبع دوم دارد. |
| validation.status / validation.reason | نتیجهٔ اعتبارسنجی بازارنما (جدول دلایل پایینتر). |
| validation_warning / discrepancy_warning | هشدار اعتبارسنجی یا اختلاف بیش از آستانه. |
| sources, method, spread_pct, as_of, price_irt | ارائهشده توسط منبع داده؛ معنی دقیق به مستندات آن منبع بستگی دارد و بازارنما آنها را بازتعریف نمیکند. ممکن است نباشند. |
| page, history (داخل هر قلم) | توجه: این آدرسها به وبسایت منبع داده اشاره میکنند، نه بازارنما. تاریخچهٔ بازارنما فقط از الگوی history_pattern در index.json خوانده شود. |
نمونه: تاریخچه (usd، سه نقطهٔ آخر)
{
"api": "bazarnama/v1",
"id": "usd",
"unit": "IRT",
"updated_utc": "2026-11-13T11:00:00Z",
"points": [
{
"timestamp": 1794553200,
"price": 268200.0
},
{
"timestamp": 1794564000,
"price": 268200.0
},
{
"timestamp": 1794567600,
"price": 268200.0
}
]
}timestamp یعنی Unix UTC بر حسب ثانیه و price در همان unit سطح بالای فایل است. فاصلهٔ نقاط یکنواخت نیست (سالهای قدیم معمولاً روزانهاند و نقاط اخیر میتوانند ساعتی باشند) و ممکن است شکاف داشته باشد؛ نقطهٔ گمشده را درونیابی نکنید.
تازگی و سقف سن
| گروه | حداکثر سن |
|---|---|
| crypto | 20 دقیقه |
| currency | 90 دقیقه |
| gold | 120 دقیقه |
| coin | 120 دقیقه |
| metal | 120 دقیقه |
| energy | 120 دقیقه |
وضعیت aging از ۶۵٪ سقف شروع میشود. سریهای روزانه (مثل برنت و WTI فیزیکی، سبد اوپک، گاز طبیعی) آستانههای بلندتری دارند؛ جزئیات در DATA-FRESHNESS.md. نمونهٔ source-health.json:
{
"schema": "bazarnama/source-health/v1",
"freshness": {
"policy": {
"crypto": 1200,
"currency": 5400,
"gold": 7200,
"coin": 7200,
"metal": 7200,
"energy": 7200
},
"counts": {
"fresh": 44,
"aging": 0,
"stale": 0,
"unknown": 0
}
}
}اعتبارسنجی
دلایل ممکن برای validation.reason (از آخرین اجرا):
| دلیل | معنی |
|---|---|
ok_in_range | within the 24h band |
ok_no_baseline | not enough own history for a 24h band; basic checks passed |
ok_confirmed_move | outside the 24h band but confirmed by two consecutive readings |
held_outside_24h_range | outside the 24h band; waiting for a confirming reading |
held_source_conflict | independent sources disagree strongly; waiting for a confirming reading |
invalid_number | price is missing, not a number, not finite or not positive |
skipped_stale | item already flagged stale; not re-validated |
نمونهٔ اجرا
# curl
curl -s https://bazarnama.github.io/api/v1/latest.json | jq '.items[] | select(.id=="usd") | {price, unit, freshness: .freshness.status}'
# JavaScript
const r = await fetch("https://bazarnama.github.io/api/v1/latest.json");
const { items } = await r.json();
const x = items.find(i => i.id === "usd");
if (x.stale || x.freshness.status !== "fresh") console.warn("not live");
# Python
import requests
d = requests.get("https://bazarnama.github.io/api/v1/history/usd.json", timeout=15).json()
print(d["unit"], d["points"][-1])سیاست پایداری
- مسیرها و نام فیلدهای v1 حذف یا تغییر نمیکنند؛ فقط فیلد اضافه میشود. کد شما باید فیلدهای ناشناخته را نادیده بگیرد.
- تغییر ناسازگار فقط در مسیر
/api/v2/منتشر میشود. - بدون کلید و بدون محدودیت رسمی؛ بیش از یک خواندن در دقیقه برای هر فایل لازم نیست. بدون SLA.
- داده «لحظهای» تضمینشده نیست؛ فقط
freshness.status = freshبهمعنی تازه بودن طبق سیاست بالاست و قیمتstaleنباید زنده تلقی شود. - مجوز بازنشر دادههای منبع هنوز با تأیید انسانی بررسی نشده؛ پیش از استفادهٔ تجاری آن را بررسی کنید.