مستندات API

نشانی پایه همه درخواست‌ها: https://endpoint.daryno.xyz/partner/v1. پاسخ‌ها JSON و با UTF-8 است.

احراز هویت

کلید را در داشبورد بسازید؛ فقط یک بار نشان داده می‌شود. آن را در یکی از این دو سرآیند بفرستید:

Authorization: Bearer drn_xxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
X-Api-Key: drn_xxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

کلید را فقط در سرور نگه دارید، نه در اپ موبایل یا کد مرورگر. برای امنیت بیشتر، IPهای سرورتان را به کلید ببندید.

نقطه‌های پایانی

درخواستکار
GET /pricesهمه قیمت‌ها. با ?group=currency|gold|coin|metal فیلتر کنید.
GET /prices/{symbol}یک نماد، مثل USD یا COIN_EMAMI.
GET /prices/{symbol}/history?days=30قیمت بسته شدن روزانه، حداکثر ۹۰ روز.
فهرست نمادها (14)
نمادنامگروهواحد
USDدلار آمریکاcurrencyIRT
EURیوروcurrencyIRT
AEDدرهم اماراتcurrencyIRT
GBPپوند انگلیسcurrencyIRT
TRYلیر ترکیهcurrencyIRT
CNYیوان چینcurrencyIRT
GOLD18طلای ۱۸ عیار (هر گرم)goldIRT
MESGHALمثقال طلای ۱۸ عیارgoldIRT
COIN_EMAMIسکهٔ امامیcoinIRT
COIN_BAHARسکهٔ بهار آزادیcoinIRT
COIN_HALFنیم‌سکهcoinIRT
COIN_QUARTERربع‌سکهcoinIRT
XAUانس طلاmetalUSD
XAGانس نقرهmetalUSD

ساختار پاسخ

{
  "success": true,
  "data": {
    "item": {
      "symbol": "USD",          // stable identifier
      "name": "دلار آمریکا",
      "nameEn": "US Dollar",
      "group": "currency",      // currency | gold | coin | metal
      "unit": null,
      "currency": "IRT",        // prices are in toman unless USD
      "price": 101250,
      "buy": 101000, "sell": 101500,
      "changePct24h": 0.42,
      "computed": false,        // derived from other prices
      "stale": false,           // source hasn't updated recently
      "asOf": "2026-11-13T00:41:00Z"
    }
  }
}

محدودیت‌ها

هر پاسخ موفق این سرآیندها را دارد:

X-RateLimit-Limit / X-RateLimit-Remainingدرخواست مجاز در دقیقه، برای هر کلید
X-Quota-Limit / X-Quota-Remainingسهم درخواست دوره اشتراک
X-Quota-Resetsپایان دوره (ISO 8601)

خطاها

{ "success": false, "error": { "code": "quota_exceeded", "message": "…" } }
HTTPcodeیعنی
401missing_key, invalid_keyکلید نیامده یا درست نیست
401key_revokedکلید باطل شده
403ip_not_allowedIP درخواست در فهرست مجاز کلید نیست
403account_suspendedحساب معلق است؛ با ما تماس بگیرید
402subscription_expiredاشتراکی فعال نیست
429rate_limitedبیش از حد مجاز در دقیقه؛ پس از Retry-After ثانیه دوباره
429quota_exceededسهم دوره تمام شده؛ طرح را ارتقا دهید
404unknown_symbolچنین نمادی نیست

عامل‌های هوشمند

عامل را در داشبورد بسازید، زمینه بدهید، اعتبارسنجی و منتشر کنید. مشتری‌ها همیشه با نسخه منتشرشده صحبت می‌کنند؛ تغییر پیش‌نویس تا انتشار بعدی اثری ندارد. عامل‌ها طرح جداگانه خود را دارند، کنار طرح API قیمت: هر پاسخ عامل یک پیام از سهم طرح عامل کم می‌کند و سقف دقیقه‌ای آن هم جداست. خواندن گفتگو رایگان است. هر دو با همان کلید API صدا زده می‌شوند.

درخواستکار
POST /agents/{agentId}/chatیک پیام مشتری و پاسخ عامل. بدنه: message (حداکثر ۲٬۰۰۰ نویسه)، conversationId (اختیاری، شناسه خودتان؛ نباشد ساخته می‌شود)، customerRef (اختیاری).
GET /agents/{agentId}/conversations/{conversationId}پیام‌های گفتگو، از جمله پاسخ‌های شما به تیکت.
{
  "success": true,
  "data": {
    "conversationId": "order-1234",
    "reply": "این سؤال را برای همکارانمان فرستادم؛ به‌زودی پاسخ می‌دهند.",
    "handedOff": true,                       // not in the context, or a person was asked for
    "ticket": { "id": "6af…", "status": "open" }
  }
}

وب‌هوک تیکت

رویدادهای ticket.created و ticket.answered به نشانی وب‌هوک عامل POST می‌شوند. پاسخ 2xx بدهید؛ وگرنه پس از ۱، ۵، ۳۰، ۱۲۰ و ۶۰۰ دقیقه دوباره می‌فرستیم.

X-Daryno-Event: ticket.answered
X-Daryno-Signature: t=1794531178,v1=5f0c…

{ "event": "ticket.answered",
  "ticket": { "id": "…", "status": "answered", "reason": "no_answer",
              "subject": "…", "reply": "…", "createdAt": "…", "answeredAt": "…" },
  "agent": { "id": "…", "name": "…" },
  "conversation": { "id": "order-1234", "customerRef": "user-42" },
  "sentAt": "2026-11-13T01:20:00Z" }

امضا را با رمز وب‌هوک عامل بررسی کنید: HMAC-SHA256 از t + "." + body، و درخواست‌های قدیمی‌تر از ۵ دقیقه را رد کنید.

// Node
const [t, v1] = req.get('X-Daryno-Signature').split(',').map(p => p.split('=')[1])
const expected = crypto.createHmac('sha256', process.env.DARYNO_WEBHOOK_SECRET)
  .update(`${t}.${rawBody}`).digest('hex')
const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300
if (!fresh || !crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(expected))) return res.sendStatus(400)
HTTPcodeیعنی
402agents_not_in_planطرح عامل هوشمند ندارید (جدا از طرح API قیمت)
404agent_not_foundعامل نیست یا مال حساب این کلید نیست
409agent_not_published, agent_pausedعامل منتشر نشده یا متوقف است
429quota_exceededپیام‌های این دوره تمام شده
503agent_busy, agent_unavailableسرویس هوش مصنوعی در دسترس نیست؛ پس از Retry-After دوباره. پیامی کم نمی‌شود.

نمونه کد

cURL

curl "https://endpoint.daryno.xyz/partner/v1/prices?group=gold" -H "Authorization: Bearer $DARYNO_KEY"

JavaScript (Node 18+)

const res = await fetch('https://endpoint.daryno.xyz/partner/v1/prices/USD', {
  headers: { Authorization: `Bearer ${process.env.DARYNO_KEY}` },
})
const body = await res.json()
if (!body.success) throw new Error(body.error.code)
console.log(body.data.item.price)

Python

import os, requests

r = requests.get(
    "https://endpoint.daryno.xyz/partner/v1/prices/USD/history",
    params={"days": 30},
    headers={"Authorization": f"Bearer {os.environ['DARYNO_KEY']}"},
    timeout=10,
)
r.raise_for_status()
for point in r.json()["data"]["points"]:
    print(point["day"], point["close"])

PHP

$ch = curl_init('https://endpoint.daryno.xyz/partner/v1/prices/USD');
curl_setopt_array($ch, [
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('DARYNO_KEY')],
    CURLOPT_RETURNTRANSFER => true,
]);
$item = json_decode(curl_exec($ch), true)['data']['item'];