API اکسیر

API حرفه‌ای برای ساخت، اتصال و ترید خودکار

با مجموعه کامل توابع REST و WebSocket اکسیر، بات‌های معامله‌گر و استراتژی‌های الگوریتمی خود را روی یکی از معتبرترین بازارهای ارز دیجیتال ایران اجرا کنید. مستندات کامل همین صفحه است — از احراز هویت تا آخرین endpoint.

REST API WebSocket exir-node-lib
ticker.json
# GET /v2/ticker?symbol=btc-usdt
{
  "symbol": "btc-usdt",
  "last":   "64850.2",
  "high":   "65120.0",
  "low":    "63870.5",
  "open":   "64010.7",
  "volume": "182.43"
}

REST API کامل

دسترسی به داده‌های بازار، موجودی حساب و سفارش‌گذاری از طریق endpointهای ساده و مستند.

WebSocket بلادرنگ

تغییر قیمت، دفتر سفارش و معاملات را بدون وقفه و با کمترین تأخیر دریافت کنید.

ترید الگوریتمی و بات

زیرساخت مناسب برای اجرای استراتژی‌های خودکار، بات‌های معامله‌گر و Algo Trading.

کلید API با سطح دسترسی

برای هر کلید مجوزهای جداگانه تعریف کنید و دسترسی برنامه‌ها را به‌صورت امن مدیریت نمایید.

کتابخانه رسمی Node.js

کتابخانه exir-node-lib روی npm منتشر شده تا بدون درگیرشدن با جزئیات امضا و WebSocket به اکسیر متصل شوید.

داده‌های جامع بازار

ticker، دفتر سفارش، معاملات و داده نمودار همه بازارهای اکسیر در دسترس شماست.

در چند خط کد شروع کنید

داده‌های عمومی بازار بدون نیاز به احراز هویت در دسترس‌اند. کافی است یک درخواست بزنید.

# قیمت لحظه‌ای بیت‌کوین به تتر
curl "https://api.exir.io/v2/ticker?symbol=btc-usdt"

کتابخانه رسمی Node.js

کتابخانه exir-node-lib امضای HMAC، مدیریت کلیدها و اتصال WebSocket (با اتصال مجدد خودکار) را برای شما انجام می‌دهد تا مستقیم سراغ منطق معاملاتی‌تان بروید.

$ npm install exir-node-lib
exir-node-lib
const Exir = require("exir-node-lib");

const client = new Exir({
  apiKey: "<API_KEY>",
  apiSecret: "<API_SECRET>",
});

// REST — امضای درخواست‌ها خودکار انجام می‌شود
const balance = await client.getBalance();
const order = await client.createOrder(
  "btc-usdt", "buy", 0.001, "market"
);

// WebSocket — اتصال و اشتراک با یک خط
client.connect(["orderbook:btc-usdt", "order", "wallet"]);
client.ws.on("message", (data) => {
  console.log(JSON.parse(data));
});

احراز هویت

برای endpointهای خصوصی ابتدا از بخش امنیت حساب کاربری کلید API بسازید. هر درخواست خصوصی باید سه هدر زیر را داشته باشد:

هدرتوضیح
api-key کلید API شما
api-signature امضای HMAC-SHA256 درخواست با کلید مخفی (خروجی hex)
api-expires زمان انقضای درخواست به‌صورت Unix timestamp (ثانیه) — مثلاً ۶۰ ثانیه بعد

امضا روی رشته‌ای از متد HTTP، مسیر کامل (همراه query string)، زمان انقضا و — در صورت وجود — بدنه JSON درخواست محاسبه می‌شود:

# قالب رشته امضا
METHOD + PATH + api-expires + JSON_BODY

# نمونه‌ها
GET/v2/user/balance1575516146
POST/v2/order1583284849{"symbol":"btc-usdt","side":"buy","size":0.001,"type":"market"}
auth.js
const crypto = require("crypto");

const method = "GET";
const path = "/v2/user/balance";
const expires = Math.floor(Date.now() / 1000) + 60;

const signature = crypto
  .createHmac("sha256", API_SECRET)
  .update(method + path + expires)
  .digest("hex");

const res = await fetch("https://api.exir.io" + path, {
  headers: {
    "api-key": API_KEY,
    "api-signature": signature,
    "api-expires": String(expires),
  },
});
console.log(await res.json());

مرجع کامل REST API

پایه آدرس: https://api.exir.io/v2 — endpointهای علامت‌خورده با کلید API نیازمند احراز هویت هستند.

عمومی — داده‌های بازار

این endpointها بدون احراز هویت در دسترس‌اند.

  • GET /health وضعیت و سلامت سرویس
  • GET /constants لیست بازارها و ارزهای فعال به‌همراه مشخصات هر یک
  • GET /kit تنظیمات و اطلاعات عمومی صرافی
  • GET /tiers سطح‌های کاربری و ساختار کارمزد هر سطح
  • GET /ticker قیمت لحظه‌ای یک بازار در ۲۴ ساعت گذشته
    پارامترها (1)
    پارامترنوعتوضیح
    symbol الزامی string نماد بازار، مثلاً btc-usdt
  • GET /tickers قیمت لحظه‌ای همه بازارها
  • GET /orderbook دفتر سفارش (خرید و فروش) یک بازار
    پارامترها (1)
    پارامترنوعتوضیح
    symbol الزامی string نماد بازار، مثلاً btc-usdt
  • GET /orderbooks دفتر سفارش همه بازارها
  • GET /trades آخرین معاملات انجام‌شده
    پارامترها (1)
    پارامترنوعتوضیح
    symbol string نماد بازار؛ بدون آن معاملات همه بازارها برمی‌گردد
  • GET /chart داده کندل (OHLCV) یک بازار برای نمودار
    پارامترها (4)
    پارامترنوعتوضیح
    symbol الزامی string نماد بازار، مثلاً btc-usdt
    resolution الزامی string تایم‌فریم: 15، 60، 240 (دقیقه)، 1D یا 1W
    from الزامی timestamp ابتدای بازه (Unix timestamp)
    to الزامی timestamp انتهای بازه (Unix timestamp)
  • GET /charts داده کندل همه بازارها
    پارامترها (3)
    پارامترنوعتوضیح
    resolution الزامی string تایم‌فریم: 15، 60، 240 (دقیقه)، 1D یا 1W
    from الزامی timestamp ابتدای بازه (Unix timestamp)
    to الزامی timestamp انتهای بازه (Unix timestamp)
  • GET /minicharts داده فشرده نمودار برای نمایش چند ارز کنار هم
    پارامترها (2)
    پارامترنوعتوضیح
    assets الزامی string لیست ارزها، جداشده با ویرگول
    quote string ارز مبنا برای قیمت‌گذاری
  • GET /quick-trade استعلام نرخ تبدیل سریع دو ارز
    پارامترها (4)
    پارامترنوعتوضیح
    spending_currency الزامی string ارزی که پرداخت می‌کنید
    receiving_currency الزامی string ارزی که دریافت می‌کنید
    spending_amount number مقدار پرداختی (یکی از دو مقدار کافی است)
    receiving_amount number مقدار دریافتی (یکی از دو مقدار کافی است)

حساب کاربری

نیازمند احراز هویت با کلید API.

  • GET /user کلید API اطلاعات حساب کاربری شما
  • GET /user/balance کلید API موجودی کیف پول برای همه ارزها
  • GET /user/trades کلید API تاریخچه معاملات شما
    پارامترها (8)
    پارامترنوعتوضیح
    symbol string فیلتر بر اساس نماد بازار
    limit number تعداد آیتم‌ها در هر صفحه (پیش‌فرض ۵۰، حداکثر ۱۰۰)
    page number شماره صفحه
    order_by string فیلدی که داده بر اساس آن مرتب می‌شود
    order asc | desc ترتیب صعودی یا نزولی
    start_date ISO8601 ابتدای بازه زمانی
    end_date ISO8601 انتهای بازه زمانی
    format string با مقدار csv خروجی به‌صورت فایل CSV برمی‌گردد

واریز و برداشت

نیازمند احراز هویت با کلید API.

  • GET /user/deposits کلید API لیست واریزهای شما
    پارامترها (15)
    پارامترنوعتوضیح
    currency string فیلتر بر اساس ارز (مثلاً btc)
    status boolean فقط تراکنش‌های تکمیل‌شده
    dismissed boolean فقط تراکنش‌های لغوشده
    rejected boolean فقط تراکنش‌های ردشده
    processing boolean فقط تراکنش‌های در حال پردازش
    waiting boolean فقط تراکنش‌های در انتظار
    transaction_id string فیلتر بر اساس شناسه تراکنش (TXID)
    address string فیلتر بر اساس آدرس کیف پول
    limit number تعداد آیتم‌ها در هر صفحه (پیش‌فرض ۵۰، حداکثر ۱۰۰)
    page number شماره صفحه
    order_by string فیلدی که داده بر اساس آن مرتب می‌شود
    order asc | desc ترتیب صعودی یا نزولی
    start_date ISO8601 ابتدای بازه زمانی
    end_date ISO8601 انتهای بازه زمانی
    format string با مقدار csv خروجی به‌صورت فایل CSV برمی‌گردد
  • GET /user/withdrawals کلید API لیست برداشت‌های شما
    پارامترها (15)
    پارامترنوعتوضیح
    currency string فیلتر بر اساس ارز (مثلاً btc)
    status boolean فقط تراکنش‌های تکمیل‌شده
    dismissed boolean فقط تراکنش‌های لغوشده
    rejected boolean فقط تراکنش‌های ردشده
    processing boolean فقط تراکنش‌های در حال پردازش
    waiting boolean فقط تراکنش‌های در انتظار
    transaction_id string فیلتر بر اساس شناسه تراکنش (TXID)
    address string فیلتر بر اساس آدرس کیف پول
    limit number تعداد آیتم‌ها در هر صفحه (پیش‌فرض ۵۰، حداکثر ۱۰۰)
    page number شماره صفحه
    order_by string فیلدی که داده بر اساس آن مرتب می‌شود
    order asc | desc ترتیب صعودی یا نزولی
    start_date ISO8601 ابتدای بازه زمانی
    end_date ISO8601 انتهای بازه زمانی
    format string با مقدار csv خروجی به‌صورت فایل CSV برمی‌گردد
  • GET /user/withdrawal/fee کلید API کارمزد برداشت یک ارز
    پارامترها (1)
    پارامترنوعتوضیح
    currency الزامی string نماد ارز، مثلاً btc
  • POST /user/withdrawal کلید API ثبت درخواست برداشت
    پارامترها (4)
    پارامترنوعتوضیح
    currency الزامی string نماد ارز، مثلاً btc
    amount الزامی number مقدار برداشت
    address الزامی string آدرس کیف پول مقصد
    network string شبکه انتقال، در صورتی که ارز چند شبکه داشته باشد

سفارش‌ها

نیازمند احراز هویت با کلید API.

  • GET /orders کلید API لیست سفارش‌های شما
    پارامترها (10)
    پارامترنوعتوضیح
    symbol string فیلتر بر اساس نماد بازار
    side buy | sell فیلتر بر اساس سمت سفارش
    open boolean فقط سفارش‌های باز
    limit number تعداد آیتم‌ها در هر صفحه (پیش‌فرض ۵۰، حداکثر ۱۰۰)
    page number شماره صفحه
    order_by string فیلدی که داده بر اساس آن مرتب می‌شود
    order asc | desc ترتیب صعودی یا نزولی
    start_date ISO8601 ابتدای بازه زمانی
    end_date ISO8601 انتهای بازه زمانی
    format string با مقدار csv خروجی به‌صورت فایل CSV برمی‌گردد
  • GET /order کلید API جزئیات یک سفارش
    پارامترها (1)
    پارامترنوعتوضیح
    order_id الزامی string شناسه سفارش
  • POST /order کلید API ثبت سفارش جدید
    پارامترها (8)
    پارامترنوعتوضیح
    symbol الزامی string نماد بازار، مثلاً btc-usdt
    side الزامی buy | sell سمت سفارش
    size الزامی number مقدار سفارش
    type الزامی limit | market نوع سفارش
    price number قیمت — برای سفارش limit الزامی است
    stop number قیمت فعال‌سازی سفارش استاپ
    meta.post_only boolean سفارش فقط به‌صورت میکر ثبت شود
    meta.note string یادداشت دلخواه روی سفارش
    # درخواست
    POST /v2/order
    {"symbol":"btc-usdt","side":"buy","size":0.001,"type":"market"}
    
    # پاسخ
    {
      "id": "7d3d9545-b7e6-4e7f-84a0-a39efa4cb173",
      "symbol": "btc-usdt",
      "side": "buy",
      "size": 0.001,
      "type": "market",
      "filled": 0,
      "status": "new",
      "fee": 0,
      "fee_coin": "usdt",
      "fee_structure": { "maker": 0.2, "taker": 0.2 },
      "created_at": "2021-02-17T03:03:19.231Z"
    }
  • DELETE /order کلید API لغو یک سفارش
    پارامترها (1)
    پارامترنوعتوضیح
    order_id الزامی string شناسه سفارش
  • DELETE /order/all کلید API لغو همه سفارش‌های باز یک بازار
    پارامترها (1)
    پارامترنوعتوضیح
    symbol الزامی string نماد بازار، مثلاً btc-usdt
  • POST /order/execute کلید API اجرای معامله تبدیل سریع با کد استعلام
    پارامترها (1)
    پارامترنوعتوضیح
    token الزامی string توکن دریافتی از استعلام /quick-trade

TradingView UDF

برای اتصال مستقیم کتابخانه نمودار TradingView (پروتکل UDF). بدون نیاز به احراز هویت.

  • GET /udf/config تنظیمات UDF برای TradingView
  • GET /udf/history تاریخچه کندل با قرارداد UDF
    پارامترها (4)
    پارامترنوعتوضیح
    symbol الزامی string نماد بازار
    resolution الزامی string تایم‌فریم: 15، 60، 240 (دقیقه)، 1D یا 1W
    from الزامی timestamp ابتدای بازه (Unix timestamp)
    to الزامی timestamp انتهای بازه (Unix timestamp)
  • GET /udf/symbols مشخصات نماد با قرارداد UDF
    پارامترها (1)
    پارامترنوعتوضیح
    symbol الزامی string نماد بازار

مستندات WebSocket

آدرس اتصال: wss://api.exir.io/stream — برای دریافت بلادرنگ دفتر سفارش، معاملات و رویدادهای حساب. اگر تا ۶۰ ثانیه پیامی رد و بدل نشود اتصال قطع می‌شود؛ هر ۳۰ ثانیه یک پیام ping بفرستید.

عملیات

# اشتراک در کانال‌ها
{ "op": "subscribe", "args": ["orderbook:btc-usdt", "trade"] }

# لغو اشتراک
{ "op": "unsubscribe", "args": ["trade"] }

# پیام keep-alive (هر ۳۰ ثانیه)
{ "op": "ping" }

احراز هویت اتصال خصوصی

همان امضای HMAC-SHA256 بخش REST، این‌بار به‌صورت پارامترهای query string و با رشته امضای CONNECT/stream + api-expires:

# اتصال خصوصی: پارامترهای احراز هویت در query string
wss://api.exir.io/stream?api-key=...&api-signature=...&api-expires=...

# رشته امضا برای WebSocket
CONNECT/stream1583284849

اتصال با JavaScript

const ws = new WebSocket("wss://api.exir.io/stream");

ws.onopen = () => {
  ws.send(JSON.stringify({
    op: "subscribe",
    args: ["orderbook:btc-usdt", "trade:btc-usdt"],
  }));
};

ws.onmessage = (event) => console.log(JSON.parse(event.data));

نمونه پیام دریافتی

{
  "topic": "orderbook",
  "action": "partial",
  "symbol": "btc-usdt",
  "data": {
    "bids": [[64850.2, 0.12]],
    "asks": [[64851.0, 0.08]],
    "timestamp": "2020-12-15T06:45:27.766Z"
  },
  "time": 1608015328
}

کانال‌های عمومی

  • orderbook دفتر سفارش — با orderbook:btc-usdt فقط یک بازار، بدون نماد همه بازارها
  • trade معاملات لحظه‌ای — با trade:btc-usdt فقط یک بازار، بدون نماد همه بازارها

کانال‌های خصوصی

تنها با اتصال احراز هویت‌شده در دسترس‌اند.

  • order ایجاد و به‌روزرسانی سفارش‌های شما
  • usertrade اجرای معاملات شما
  • wallet تغییرات موجودی کیف پول
  • deposit اعلان واریز جدید
  • withdrawal اعلان برداشت جدید

فیلد action در پیام‌ها

  • partial تصویر اولیه داده هنگام اشتراک (حداکثر ۵۰ آیتم، به ترتیب نزولی)
  • insert افزوده‌شدن آیتم جدید
  • update به‌روزرسانی آیتم موجود

کدهای خطا

خطاها با کد وضعیت استاندارد HTTP برمی‌گردند. توجه کنید که تعداد درخواست‌ها محدودیت نرخ (Rate Limit) دارد و در صورت عبور از آن، پاسخ ۴۲۹ دریافت می‌کنید.

کدعنوانتوضیح
400 Bad Request درخواست نامعتبر است — پارامترها را بررسی کنید
401 Unauthorized احراز هویت ناموفق — کلید API یا امضا نامعتبر است
403 Forbidden دسترسی به این منبع مجاز نیست
404 Not Found منبع موردنظر پیدا نشد
405 Method Not Allowed متد HTTP برای این آدرس پشتیبانی نمی‌شود
406 Not Acceptable درخواست قابل پذیرش نیست
410 Gone این منبع دیگر در دسترس نیست
429 Too Many Requests عبور از محدودیت تعداد درخواست — کمی صبر کنید و دوباره تلاش کنید
500 Internal Server Error خطای داخلی سرور
503 Service Unavailable سرویس موقتاً در دسترس نیست

نمونه کد کامل به چهار زبان

یک سناریوی کامل و آماده اجرا: دریافت موجودی کیف پول، ثبت یک سفارش limit، دریافت همان سفارش با شناسه و سپس اتصال به کانال wallet از طریق WebSocket برای دریافت لحظه‌ای تغییرات موجودی. کافی است کلید و رمز API خود را جایگزین کنید. نسخه Node.js از کتابخانه رسمی exir-node-lib استفاده می‌کند؛ بقیه زبان‌ها بدون وابستگی خاص، مستقیم با REST و WebSocket کار می‌کنند.

// npm install exir-node-lib
const Exir = require('exir-node-lib');

const client = new Exir({
  apiKey: '<API_KEY>',
  apiSecret: '<API_SECRET>',
});

const main = async () => {
  // موجودی کیف پول
  const balance = await client.getBalance();
  console.log('balance:', balance);

  // ثبت سفارش limit
  const order = await client.createOrder('btc-usdt', 'buy', 0.001, 'limit', 50000);
  console.log('created order:', order);

  // دریافت همان سفارش با شناسه
  const fetched = await client.getOrder(order.id);
  console.log('order:', fetched);

  // WebSocket: اشتراک در همه کانال‌های خصوصی (ping را خود کتابخانه می‌فرستد)
  // wallet: موجودی، order: وضعیت سفارش‌ها، usertrade: اجرای معاملات،
  // deposit / withdrawal: وضعیت واریز و برداشت
  client.connect(['wallet', 'order', 'usertrade', 'deposit', 'withdrawal']);
  client.ws.on('message', (raw) => {
    const message = JSON.parse(raw);
    if (!message.topic) return; // پیام‌های سیستمی مثل pong
    console.log(message.topic, message.action, message.data);
  });
};

main().catch(console.error);

کانال‌های خصوصی این نمونه چگونه کار می‌کنند؟

هر پیام دریافتی سه فیلد اصلی دارد: topic (نام کانال)، action و data. مقدار action یکی از partial (تصویر اولیه که بلافاصله پس از اشتراک می‌رسد)، insert (آیتم جدید) یا update (به‌روزرسانی آیتم موجود) است:

  • wallet بلافاصله پس از اشتراک یک partial با موجودی همه ارزها می‌رسد؛ سپس با هر تغییر موجودی (اجرای معامله، واریز یا برداشت) یک update با موجودی جدید دریافت می‌کنید.
  • order partial اولیه حداکثر ۵۰ سفارش اخیر شما را برمی‌گرداند؛ ثبت سفارش جدید insert و هر تغییر وضعیت (new ← pfilled ← filled یا canceled) یک update می‌فرستد.
  • usertrade هر بار سفارش شما — کامل یا بخشی از آن — اجرا شود، یک insert با جزئیات معامله (قیمت، مقدار، کارمزد) می‌رسد.
  • deposit ثبت واریز جدید insert می‌فرستد و تغییر وضعیت آن (مثلاً پس از تأیید شبکه یا تکمیل) با update اعلام می‌شود.
  • withdrawal مانند deposit برای برداشت‌ها؛ از ثبت درخواست تا تکمیل یا رد شدن، وضعیت با insert و update دنبال می‌شود.

آماده‌اید اولین اتصال را بسازید؟

کلید API خود را بسازید و با exir-node-lib یا چند خط fetch ساده، اولین درخواست را بزنید.