API رایگان بورس و فرابورس؛ وب‌سرویس قیمت سهام

قیمت لحظه‌ای همه‌ی نمادهای بورس اوراق بهادار تهران و فرابورس ایران، از سهام و حق‌تقدم تا اوراق، اختیار معامله، آتی و شاخص‌ها؛ با دامنه‌ی نوسان، سرخط خرید و فروش، حجم و ارزش معاملات، EPS و P/E. وضعیت بازار از خود بورس خوانده می‌شود، پس تعطیلی‌ها و روزهای نیمه‌کاره هم درست‌اند.

چه نمادهایی پوشش داده می‌شوند

نوع هر نماد از دسته‌بندی خود بورس می‌آید، نه از حدس روی نام. با پارامتر type هر نوع را جدا بگیرید (چند نوع را با کاما جدا کنید).

typeیعنیواحد قیمت (unit)
stockسهام (بورس، فرابورس و بازار پایه)share · سهم
rightحق‌تقدمshare · سهم
fundصندوق‌های قابل معاملهunit · واحد
bondاوراق بدهیunit · ورقه
optionاختیار معاملهcontract · قرارداد
futureقراردادهای آتیcontract · قرارداد
commodity_certificateگواهی سپرده‌ی کالاییunit · واحد
housing_facilityتسهیلات مسکنunit · ورقه
indexشاخص‌ها (شاخص کل، هم‌وزن، صنایع و …)points · امتیاز

قیمت‌ها ریالی‌اند (currency: IRR). شاخص‌ها واحد پول ندارند. نمادهای متوقف وضعیت suspended می‌گیرند و آخرین قیمت پایانی و تاریخ آخرین معامله‌شان را نگه می‌دارند، پس ارزش پرتفوی که سهم متوقف دارد هم محاسبه می‌شود.

شناسه‌ی نمادها

شناسه‌ی هر نماد tse: به‌علاوه‌ی ISIN آن است، مثل tse:IRO1FOLD0001 برای فولاد. شاخص‌ها ISIN ندارند و با کد داخلی بورس شناخته می‌شوند؛ شاخص کل tse:32097828799138957 است. اگر فقط نماد را می‌دانید، با symbols بپرسید؛ املای «ی» و «ک» عربی و فارسی فرقی نمی‌کند.

curl -G -H "x-api-key: YOUR_API_KEY" "https://nerkhy.ir/v1/quotes" \
  --data-urlencode "symbols=فولاد,فملی" \
  --data-urlencode "market=tse"

برای جست‌وجوی آزاد (بخشی از نماد یا نام شرکت) از GET /v1/instruments?q=… استفاده کنید؛ نماد دقیق اول برمی‌گردد.

قیمت یک سهم

GET/v1/quotes/tse:IRO1FOLD0001200 OK
{
  "data": {
    "id": "tse:IRO1FOLD0001",
    "market": "tse",
    "type": "stock",
    "symbol": "فولاد",
    "name": {
      "fa": "فولاد مبارکه اصفهان",
      "en": null
    },
    "currency": "IRR",
    "unit": "share",
    "status": "active",
    "referencePrice": 4540,
    "price": {
      "last": 4540,
      "close": 4540,
      "open": 4460,
      "high": 4560,
      "low": 4430,
      "previousClose": 4410
    },
    "change": {
      "amount": 130,
      "percent": 2.95
    },
    "limits": {
      "upper": 4540,
      "lower": 4280
    },
    "orderBook": {
      "bestBid": 4540,
      "bestAsk": null
    },
    "trading": {
      "volume": 1563050927,
      "value": 7096251208580,
      "count": 13401
    },
    "fund": null,
    "fundamentals": {
      "eps": 518,
      "pe": 8.8,
      "sharesOutstanding": "1935000000000",
      "marketCap": "8784900000000000"
    },
    "tradeDate": "2026-10-14",
    "lastTradeAt": "2026-10-14T12:29:54+03:30",
    "observedAt": "2026-10-15T10:50:06.986Z",
    "stale": false,
    "source": "tsetmc"
  }
}
نمونه‌ی پاسخ با مقادیر یک روز مشخص؛ قیمت روز نیست.
فیلدمعنا
referencePriceقیمت پایانی؛ برای ارزش‌گذاری سهم همین را به کار ببرید
price.lastقیمت آخرین معامله
price.open · high · lowاولین، بیشترین و کمترین قیمت معامله‌ی روز
price.previousCloseقیمت پایانی روز معاملاتی قبل (قیمت مبنای روز)
changeتغییر قیمت پایانی نسبت به روز قبل، به ریال و درصد
limits.upper · lowerسقف و کف دامنه‌ی نوسان مجاز روز
orderBook.bestBid · bestAskبهترین قیمت خرید و فروش (سرخط)
trading.volume · value · countحجم، ارزش (ریال) و تعداد معاملات روز
fundamentals.eps · peسود هر سهم و نسبت قیمت به سود، به گزارش بورس
fundamentals.marketCapارزش بازار (رشته، چون ممکن است از دقت عدد بزرگ‌تر شود)
statusactive · suspended (متوقف) · inactive (دیگر در بازار دیده نمی‌شود)

کل بازار در چند درخواست

برای گرفتن همه‌ی سهام یا هر نوع دیگر، market و type را با صفحه‌بندی (limit تا ۱۰۰۰ و offset) بخواهید؛ تعداد کل در meta.total است.

async function allQuotes(type) {
  const out = [];
  for (let offset = 0; ; offset += 1000) {
    const url = new URL("https://nerkhy.ir/v1/quotes");
    url.search = new URLSearchParams({ market: "tse", type, limit: "1000", offset: String(offset) });
    const res = await fetch(url, { headers: { "x-api-key": "YOUR_API_KEY" } });
    const { data, meta } = await res.json();
    out.push(...data);
    if (out.length >= meta.total || data.length === 0) return out;
  }
}

const stocks = await allQuotes("stock");

مشخصات نماد و گروه صنعت

GET /v1/instruments/{id} مشخصات پایه را همراه با آخرین قیمت برمی‌گرداند: گروه صنعت، بازار (TSE برای بورس و IFB برای فرابورس) و شناسه‌های بیرونی مثل کد داخلی TSETMC.

GET/v1/instruments/tse:IRO1FOLD0001200 OK
{
  "data": {
    "id": "tse:IRO1FOLD0001",
    "market": "tse",
    "code": "IRO1FOLD0001",
    "type": "stock",
    "symbol": "فولاد",
    "name": {
      "fa": "فولاد مبارکه اصفهان",
      "en": null
    },
    "exchange": "TSE",
    "sector": {
      "code": "27",
      "name": "فلزات اساسی"
    },
    "currency": "IRR",
    "unit": "share",
    "status": "active",
    "statusNote": null,
    "externalIds": {
      "isin": "IRO1FOLD0001",
      "tsetmcInsCode": "46348559193224090",
      "tgjuKey": null
    },
    "firstSeenAt": "2026-10-15T11:21:01.089Z",
    "lastSeenAt": "2026-10-22T10:36:22.567Z",
    "quote": "{ … همان Quote … }"
  }
}
نمونه‌ی پاسخ با مقادیر یک روز مشخص؛ قیمت روز نیست.

باز یا بسته بودن بازار

GET /v1/markets روز معاملاتی، باز یا بسته بودن بورس و زمان آخرین فعالیت را می‌گوید. این وضعیت از خود بورس خوانده می‌شود، نه از تقویم.

GET/v1/markets200 OK
{
  "data": [
    {
      "market": "tse",
      "name": "بورس و فرابورس",
      "state": "closed",
      "stateTitle": "بسته",
      "sessionDate": "2026-10-21",
      "lastActivityAt": "2026-10-21T19:31:03+03:30",
      "snapshotAt": "2026-10-22T10:36:22.567Z",
      "observedAt": "2026-10-22T10:50:28.196Z",
      "stale": false
    },
    {
      "market": "spot",
      "name": "بازار آزاد",
      "state": "open",
      "stateTitle": null,
      "sessionDate": null,
      "lastActivityAt": null,
      "snapshotAt": "2026-10-22T10:51:17.695Z",
      "observedAt": "2026-10-22T10:51:17.695Z",
      "stale": false
    }
  ]
}
نمونه‌ی پاسخ با مقادیر یک روز مشخص؛ قیمت روز نیست.
تاریخچه‌ی روزانه‌ی سهام، حق‌تقدم‌ها، صندوق‌ها، گواهی‌های کالایی و شاخص‌ها هم در دسترس است؛ API تاریخچه را ببینید.

همین حالا شروع کنید

ثبت‌نام و استفاده از نرخی API رایگان است. پس از تأیید حساب، کلید API را از داشبورد بسازید و اولین درخواست را بفرستید.