نشانه گذاری API

Author profile photo
تیم Quickex
۱۰ آذر ۱۴۰۴
~6 دقیقه خوانده شده

<h1>پیش‌محاسبه نرخ</h1>
<h2>الگوریتم</h2>
Quickex از یک سیستم نرخ پویا برای تولید پیش‌بینی‌های نرخ تبدیل استفاده می‌کند و برای این کار، تحلیل عمق بازار تأمین‌کنندگان نقدینگی را به کار می‌گیرد. در حالی که جریان پیش‌فرض عمق بازار را تحلیل کرده و یک نتیجه محاسبه‌شده و واقع‌بینانه برمی‌گرداند، پارامتر <code>markup</code> می‌تواند بر نرخی که توسط الگوریتم پیش‌بینی نرخ برگردانده می‌شود تأثیر بگذارد.

پارامتر <code>markup</code> پیش‌محاسبه نرخ را که توسط سیستم ما بازگردانده می‌شود به شکل زیر تحت تأثیر قرار می‌دهد:
<div style=”font-family: ui-monospace,SFMono-Regular,Menlo,Consolas,;”>A_final = A_calculated × (1 − (K_markup / 100))</div>
<div style=”margin-top: 10px;”>
<div style=”margin-top: 10px;”>
<div style=”margin: 16px 0; font-family: system-ui, -apple-system, BlinkMacSystemFont,;”>
<table style=”width: 100%; border-collapse: collapse; background: #111111; color: #f5f5f5;”>
<thead>
<tr>
<th style=”border: 1px solid #3a3a3a; padding: 10px 12px; text-align: left;”>پارامتر</th>
<th style=”border: 1px solid #3a3a3a; padding: 10px 12px; text-align: left;”>توضیحات</th>
</tr>
</thead>
<tbody>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>A_final</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”>مبلغ نهایی قابل دریافت (پیش‌بینی‌شده)</td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>A_calculated</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”>مبلغ قبل از اعمال markup</td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>K_markup</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”>درصد markup</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
بر اساس فرمول ارائه‌شده، مقدار <code>markup</code> برابر با 0.3 برای یک تبدیل 1 BTC → USDT نتایج زیر را به دست می‌دهد و باعث می‌شود قیمت نهاییِ پیش‌بینی‌شده به اندازه 0.3٪ افزایش یابد:
<div style=”font-family: ui-monospace,SFMono-Regular,Menlo,Consolas,;”>مثال: 49549.728053855135 * (1 – \dfrac{0.3}{100}) = 49401.07886969357</div>
<h2>API</h2>
اطلاعات نرخ‌ها را می‌توان از طریق یک فراخوانی API <code>v1</code> به اندپوینت <code>/api/v1/rates/public/one</code> به دست آورد. API <code>v1</code> به مجوز کلید API یا لیست سفید کردن (whitelisting) آدرس‌های IP نیازی ندارد.
<div style=”margin: 16px 0; font-family: system-ui, -apple-system, BlinkMacSystemFont,;”>
<table style=”width: 100%; border-collapse: collapse; background: #111111; color: #f5f5f5;”>
<thead>
<tr>
<th style=”border: 1px solid #3a3a3a; padding: 10px 12px; text-align: left;”>پارامتر</th>
<th style=”border: 1px solid #3a3a3a; padding: 10px 12px; text-align: left;”>توضیحات</th>
<th style=”border: 1px solid #3a3a3a; padding: 10px 12px; text-align: left;”>مثال</th>
</tr>
</thead>
<tbody>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>instrumentFromCurrencyTitle</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”>ارز مبدأ</td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”font-family: monospace;”>BTC</span></td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>instrumentFromNetworkTitle</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”>شبکه ارز مبدأ</td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”font-family: monospace;”>BTC</span></td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>instrumentToCurrencyTitle</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”>ارز مقصد</td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”font-family: monospace;”>USDT</span></td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>instrumentToNetworkTitle</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”>شبکه ارز مقصد</td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”font-family: monospace;”>TRC20</span></td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>rateMode</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”>FLOATING / FIXED</td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”font-family: monospace;”>FLOATING</span></td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>claimedDepositAmount</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”>مبلغ واریز</td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”font-family: monospace;”>1</span></td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>markup</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”>درصد markup</td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”font-family: monospace;”>0.3</span></td>
</tr>
</tbody>
</table>
</div>
<div style=”background: #0d0d0d; border: 1px solid rgba(127,127,127,.3); border-radius: 14px; padding: 16px 18px; box-shadow: 0 1px 1px rgba(0,0,0,.2); margin-bottom: 16px; font-family: monospace; color: #dcdcdc;”>
<pre style=”margin: 0; line-height: 1.25; white-space: pre;”><span style=”color: #9cdcfe;”>GET</span> <span style=”color: #d1006c;”>/api/v1/rates/public/one
?instrumentFromCurrencyTitle=BTC
&amp;instrumentFromNetworkTitle=BTC
&amp;instrumentToCurrencyTitle=USDT
&amp;instrumentToNetworkTitle=TRC20
&amp;rateMode=FLOATING
&amp;claimedDepositAmount=1
&amp;markup=0.3</span>

{
‘<span style=”color: #9cdcfe;”>instrumentFrom</span>’: {
‘<span style=”color: #9cdcfe;”>currencyTitle</span>’: ‘BTC’,
‘<span style=”color: #9cdcfe;”>networkTitle</span>’: ‘BTC’,
‘<span style=”color: #9cdcfe;”>precisionDecimals</span>’: 11
},
‘<span style=”color: #9cdcfe;”>instrumentTo</span>’: {
‘<span style=”color: #9cdcfe;”>currencyTitle</span>’: ‘USDT’,
‘<span style=”color: #9cdcfe;”>networkTitle</span>’: ‘TRC20’,
‘<span style=”color: #9cdcfe;”>precisionDecimals</span>’: 1
},
‘<span style=”color: #9cdcfe;”>depositRules</span>’: {
‘<span style=”color: #9cdcfe;”>minAmount</span>’: ‘0.0010202831699481001984’,
‘<span style=”color: #9cdcfe;”>maxAmount</span>’: ‘0’
},
‘<span style=”color: #9cdcfe;”>withdrawalRules</span>’: {
‘<span style=”color: #9cdcfe;”>minAmount</span>’: ‘51.324600057525118367’,
‘<span style=”color: #9cdcfe;”>maxAmount</span>’: ‘0’,
‘<span style=”color: #9cdcfe;”>withdrawalFeeRules</span>’: {
‘<span style=”color: #9cdcfe;”>maxAmount</span>’: ‘1’,
‘<span style=”color: #9cdcfe;”>minAmount</span>’: ‘1’
}
},
‘<span style=”color: #9cdcfe;”>minConfirmationsToWithdraw</span>’: 2,
‘<span style=”color: #9cdcfe;”>minConfirmationsToTrade</span>’: 2,
‘<span style=”color: #9cdcfe;”>updatedAt</span>’: ‘2024-08-05T13:31:44.315Z’,
‘<span style=”color: #9cdcfe;”>liquidityProviderPublicCode</span>’: ‘radio’,
‘<span style=”color: #9cdcfe;”>amountToGet</span>’: ‘50201.90689595’,
‘<span style=”color: #9cdcfe;”>amountToGive</span>’: ‘1’,
‘<span style=”color: #9cdcfe;”>marketMinAmount</span>’: ‘0.1’,
‘<span style=”color: #9cdcfe;”>enableFixedRate</span>’: <span style=”color: #569cd6;”>true</span>,
‘<span style=”color: #9cdcfe;”>amountToGiveCurrencyTitle</span>’: ‘BTC’,
‘<span style=”color: #9cdcfe;”>rateMode</span>’: ‘FLOATING’,
‘<span style=”color: #9cdcfe;”>finalNetworkFeeAmount</span>’: ‘0’,
‘<span style=”color: #9cdcfe;”>platformFee_Absolute</span>’: <span style=”color: #569cd6;”>null</span>,
‘<span style=”color: #9cdcfe;”>liquidityProviderQuotes</span>’: {
‘<span style=”color: #9cdcfe;”>sellQuote</span>’: {
‘<span style=”color: #9cdcfe;”>baseValue</span>’: ‘1’,
‘<span style=”color: #9cdcfe;”>quoteValue</span>’: ‘50304.27’
},
‘<span style=”color: #9cdcfe;”>buyQuote</span>’: {
‘<span style=”color: #9cdcfe;”>baseValue</span>’: ‘50294.99’,
‘<span style=”color: #9cdcfe;”>quoteValue</span>’: ‘1’
}
},
‘<span style=”color: #9cdcfe;”>price</span>’: ‘50201.90689595’,
‘<span style=”color: #9cdcfe;”>marketLeftPrice</span>’: ‘50304.27’,
‘<span style=”color: #9cdcfe;”>marketRightPrice</span>’: ‘0.000019882696069727819809’,
‘<span style=”color: #9cdcfe;”>marketAmountToGet</span>’: ‘50243.798064469251204’,
‘<span style=”color: #9cdcfe;”>marketAmountToGetUSDT</span>’: ‘50243.798064469251204’,
‘<span style=”color: #9cdcfe;”>quotesWithoutNetworkFee</span>’: {
‘<span style=”color: #9cdcfe;”>sellQuote</span>’: {
‘<span style=”color: #9cdcfe;”>baseValue</span>’: ‘1’,
‘<span style=”color: #9cdcfe;”>quoteValue</span>’: ‘50202.90689595’
},
‘<span style=”color: #9cdcfe;”>buyQuote</span>’: {
‘<span style=”color: #9cdcfe;”>baseValue</span>’: ‘50294.99’,
‘<span style=”color: #9cdcfe;”>quoteValue</span>’: ‘0.997985’
}
},
‘<span style=”color: #9cdcfe;”>quotes</span>’: {
‘<span style=”color: #9cdcfe;”>sellQuote</span>’: {
‘<span style=”color: #9cdcfe;”>baseValue</span>’: ‘1’,
‘<span style=”color: #9cdcfe;”>quoteValue</span>’: ‘50201.90689595’
},
‘<span style=”color: #9cdcfe;”>buyQuote</span>’: {
‘<span style=”color: #9cdcfe;”>baseValue</span>’: ‘50294.99’,
‘<span style=”color: #9cdcfe;”>quoteValue</span>’: ‘0.99796512097183797717’
}
},
‘<span style=”color: #d1006c;”>markup</span>’: ‘0.3’
}
</pre>
</div>

<h1>پارامتر markup در جریان سفارش</h1>
<h2>الگوریتم</h2>
پارامتر markup باید در هنگام ایجاد سفارش نیز ارسال شود تا کارمزد سفارش به‌درستی محاسبه شود. با ارسال پارامتر markup، Quickex فرمول زیر را در الگوریتم محاسبه کارمزد سفارش اعمال می‌کند:
<div style=”font-family: ui-monospace,SFMono-Regular,Menlo,Consolas,;”>A_{withdrawal} = A_{exchange} * (1 – \dfrac {(C_{platform\ (\%)} + K_{markup})}{100})</div>
<div style=”margin: 16px 0; font-family: system-ui, -apple-system, BlinkMacSystemFont,;”>
<table style=”width: 100%; border-collapse: collapse; background: #111111; color: #f5f5f5;”>
<tbody>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px; width: 30%; font-size: 1.05rem;”>A<sub style=”font-style: normal; font-size: 0.75em; margin-left: 2px;”>withdrawal</sub></td>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px;”>میزان ارزی که به‌عنوان نتیجه‌ی تبدیل به مشتری ارسال می‌شود</td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px; width: 30%; font-size: 1.05rem;”>A<sub style=”font-style: normal; font-size: 0.75em; margin-left: 2px;”>exchange</sub></td>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px;”>میزان ارزی که Quickex پس از اجرای استراتژی معاملاتی خود در اختیار دارد</td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px; width: 30%; font-size: 1.05rem;”>C<sub style=”font-style: normal; font-size: 0.75em; margin-left: 2px;”>platform (%)</sub></td>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px;”>درصد کارمزدی که توسط Quickex تعریف شده است</td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px; width: 30%; font-size: 1.05rem;”>K<sub style=”font-style: normal; font-size: 0.75em; margin-left: 2px;”>markup</sub></td>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px;”>مقدار پارامتر markup</td>
</tr>
</tbody>
</table>
</div>
بر اساس فرمول ارائه‌شده، مقدار <code>markup</code> برابر با 0.3 که در هنگام ایجاد سفارش ارسال شود، درصد کارمزد Quickex را به اندازه 0.3 افزایش می‌دهد. در مثال زیر، کارمزد Quickex روی 1 درصد تنظیم شده است:
<div style=”font-family: ui-monospace,SFMono-Regular,Menlo,Consolas,;”>A_{withdrawal} = A_{exchange} * (1 – \dfrac {1 + 0.3}{100})</div>
با استفاده از مثال قبلی، یک تبدیل 1 BTC به USDT بر اساس قیمت بازار <span class=”notion-enable-hover” spellcheck=”false” data-token-index=”1″>50243.798064469251204 </span>BTC:USDT، مقدار برداشت زیر را برای مشتری به همراه خواهد داشت:
<div style=”font-family: ui-monospace,SFMono-Regular,Menlo,Consolas,;”>50243.798064469251204 * (1 – \dfrac{1 + 0.3}{100}) = 49590.62868963115</div>
بر اساس فرمول ارائه‌شده، مقدار <code>markup</code> برابر با 0.3 که در هنگام ایجاد سفارش ارسال شود، درصد کارمزد Quickex را به اندازه 0.3 افزایش می‌دهد.
پس از آنکه یک تبدیل با پارامتر markup به وضعیت <code>COMPLETED</code> برسد، پارامتر markup در فرمول محاسبه‌ی حاشیه‌ی شریک (affiliate) استفاده می‌شود:
<div style=”font-family: ui-monospace,SFMono-Regular,Menlo,Consolas,;”>C_{affiliate} = (C_{platform} * \dfrac{C_{affiliate\ (\%)}}{100}) + (C_{platform} * \dfrac{K_{markup}}{100})</div>
<div style=”margin: 16px 0; font-family: system-ui, -apple-system, BlinkMacSystemFont,;”>
<table style=”width: 100%; border-collapse: collapse; background: #111111; color: #f5f5f5;”>
<tbody>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px; width: 30%; font-size: 1.05rem;”>C<sub style=”font-style: normal; font-size: 0.75em; margin-left: 2px;”>affiliate</sub></td>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px;”>میزان ارزی که در هر تبدیل به کیف‌پول همکار (affiliate) ارسال می‌شود (حاشیه‌ی همکار)</td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px; width: 30%; font-size: 1.05rem;”>C<sub style=”font-style: normal; font-size: 0.75em; margin-left: 2px;”>platform</sub></td>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px;”>میزان ارزی که Quickex از تبدیل به دست آورده است (حاشیه‌ی پلتفرم)</td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px; width: 30%; font-size: 1.05rem;”>C<sub style=”font-style: normal; font-size: 0.75em; margin-left: 2px;”>affiliate (%)</sub></td>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px;”>درصد کارمزدی که برای همکار (affiliate) تعریف شده است</td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px; width: 30%; font-size: 1.05rem;”>K<sub style=”font-style: normal; font-size: 0.75em; margin-left: 2px;”>markup</sub></td>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px;”>مقدار پارامتر markup</td>
</tr>
</tbody>
</table>
</div>
<h2>ارسال پارامتر <code>markup</code></h2>
در هنگام ایجاد سفارش، API کوئیک‌اکس (Quickex) پارامتر <code>markup</code> را همراه با سایر پارامترهای ایجاد سفارش می‌پذیرد:
<div style=”background: #0d0d0d; border: 1px solid rgba(127,127,127,.3); border-radius: 14px; padding: 16px 18px; box-shadow: 0 1px 1px rgba(0,0,0,.2); margin-bottom: 16px; font-family: monospace; color: #dcdcdc; line-height: 1.5; white-space: pre;”><span style=”color: #9cdcfe;”>{</span>
<span style=”color: #9cdcfe;”>’rateMode'</span>: <span style=”color: #ce9178;”>’FLOATING'</span>,
<span style=”color: #9cdcfe;”>’instrumentFrom'</span>: {
<span style=”color: #9cdcfe;”>’currencyTitle'</span>: <span style=”color: #ce9178;”>’USDT'</span>,
<span style=”color: #9cdcfe;”>’networkTitle'</span>: <span style=”color: #ce9178;”>’TRC20′</span>
},
<span style=”color: #9cdcfe;”>’instrumentTo'</span>: {
<span style=”color: #9cdcfe;”>’currencyTitle'</span>: <span style=”color: #ce9178;”>’BTC'</span>,
<span style=”color: #9cdcfe;”>’networkTitle'</span>: <span style=”color: #ce9178;”>’BTC'</span>
},
<span style=”color: #9cdcfe;”>’destinationAddress'</span>: <span style=”color: #ce9178;”>’bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh'</span>,
<span style=”color: #9cdcfe;”>’destinationAddressMemo'</span>: <span style=”color: #569cd6;”>null</span>,
<span style=”color: #9cdcfe;”>’refundAddress'</span>: <span style=”color: #569cd6;”>null</span>,
<span style=”color: #9cdcfe;”>’refundAddressMemo'</span>: <span style=”color: #569cd6;”>null</span>,
<span style=”color: #9cdcfe;”>’claimedNetworkFee'</span>: <span style=”color: #569cd6;”>null</span>,
<span style=”color: #9cdcfe;”>’legacyOrderId'</span>: <span style=”color: #569cd6;”>null</span>,
<span style=”color: #9cdcfe;”>’referrerId'</span>: <span style=”color: #ce9178;”>’aff_616′</span>,
<span style=”color: #9cdcfe;”>’claimedDepositAmount'</span>: <span style=”color: #ce9178;”>’125000′</span>,
<span style=”color: #9cdcfe;”>’utmData'</span>: [],
<span style=”color: #9cdcfe;”>’browserFingerprint'</span>: <span style=”color: #ce9178;”>’6b3add86bec11616427d069556a33548′</span>,
<span style=”color: #9cdcfe;”>’markup'</span>: <span style=”color: #d1006c;”>’0.2′</span> <span style=”color: #6a9955;”>// &lt;— here</span>
<span style=”color: #9cdcfe;”>}</span></div>
مقدار ضریب <code>markup</code> همراه با سایر پارامترها ارسال می‌شود.
<h1>استفاده از API <code>v2</code></h1>
استفاده از اندپوینت‌های API نسخه <code>v2</code> به پیکربندی اضافی احراز هویت نیاز دارد. بدون پارامترهای احراز هویت لازم، اندپوینت‌های <code>v2</code> خطاهای <code>403 Forbidden</code> برمی‌گردانند.
این یکپارچه‌سازی از دو مرحله تشکیل شده است: ایجاد یک کلید API و ادغام استفاده از آن در درخواست‌های API. با ایجاد یک کلید API، مشتریان B2B ما یک جفت کلید برای امضای درخواست‌های خود، همراه با فهرستی از آدرس‌های IP در لیست سفید که می‌توانند به اندپوینت‌های API دسترسی داشته باشند، دریافت می‌کنند.
<div style=”margin: 16px 0; font-family: system-ui, -apple-system, BlinkMacSystemFont,;”>
<div style=”display: flex; align-items: center; gap: 12px; padding: 10px 18px; border-radius: 9999px; background: #242424; color: #f5f5f5;”>
<div style=”width: 26px; height: 26px; border-radius: 50%; background: #facc15; color: #111111; display: flex; align-items: center; justify-content: center; font-weight: bold; font-size: 18px; flex-shrink: 0;”>!</div>
<div style=”font-size: 0.95rem;”><strong>توجه:</strong>
برای انجام درخواست‌های
<span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em; margin: 0 2px;”>/api/v1/users/*</span>
باید یک کوکی احراز هویت فعال داشته باشید.</div>
</div>
</div>
<h2>ایجاد یک کلید API</h2>
در زمان ایجاد کلید API، باید یک آرایه از آدرس‌های IP در لیست سفید ارسال شود:
<div style=”background: #0d0d0d; border: 1px solid rgba(127,127,127,.3); border-radius: 14px; padding: 16px 18px; box-shadow: 0 1px 1px rgba(0,0,0,.2); margin-bottom: 16px; font-family: monospace; color: #dcdcdc;”>
<pre style=”margin: 0; line-height: 1.2; white-space: pre;”><span style=”color: #9cdcfe;”>POST</span> <span style=”color: #d1006c;”>/api/v1/users/generate-api-key</span>
<span style=”color: #9cdcfe;”>Request:</span>
{
  <span style=”color: #9cdcfe;”>’name'</span>: <span style=”color: #ce9178;”>’test'</span>,
  <span style=”color: #9cdcfe;”>’whiteListIp'</span>: [<span style=”color: #ce9178;”>’127.0.0.1′</span>],
  <span style=”color: #9cdcfe;”>’isActive'</span>: <span style=”color: #569cd6;”>true</span>
}
<span style=”color: #9cdcfe;”>Response:</span>
{
  <span style=”color: #9cdcfe;”>’apiId'</span>: 40,
  <span style=”color: #9cdcfe;”>’name'</span>: <span style=”color: #ce9178;”>’test'</span>,
  <span style=”color: #9cdcfe;”>’isActive'</span>: <span style=”color: #569cd6;”>true</span>,
  <span style=”color: #9cdcfe;”>’publicKey'</span>: <span style=”color: #ce9178;”>’ZgzycV6Sf78BZKuyIAiz+0Bor002+0/rx1gLKsmYCsY='</span>,
  <span style=”color: #9cdcfe;”>’secretKey'</span>: <span style=”color: #ce9178;”>’a482a8e3a3ff9aeadefb11d3d8c11253e7e8412e05ef2b8599016cc87a64b7d6′</span>,
  <span style=”color: #9cdcfe;”>’whiteListIp'</span>: [
    <span style=”color: #ce9178;”>’127.0.0.1′</span>
  ],
  <span style=”color: #9cdcfe;”>’createdAt'</span>: <span style=”color: #ce9178;”>’2024-08-05T13:54:18.427Z'</span>
}
</pre>
</div>
پاسخ شامل جفت کلیدی است که برای احراز هویت API نسخه <span class=”notion-enable-hover” spellcheck=”false” data-token-index=”1″>v2 </span>لازم است.
<div style=”margin: 16px 0; font-family: system-ui, -apple-system, BlinkMacSystemFont,;”>
<div style=”display: flex; align-items: center; gap: 12px; padding: 10px 18px; border-radius: 9999px; background: #242424; color: #f5f5f5;”>
<div style=”width: 26px; height: 26px; border-radius: 50%; background: #facc15; color: #111111; display: flex; align-items: center; justify-content: center; font-weight: bold; font-size: 18px; flex-shrink: 0;”>!</div>
<div style=”font-size: 0.95rem;”><strong>توجه:</strong>
فیلد
<span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em; margin: 0 2px;”>secretKey</span>
فقط یک‌بار، در زمان ایجاد کلید API نمایش داده می‌شود. توصیه می‌کنیم بلافاصله پس از ایجاد کلید API آن را ذخیره کنید.</div>
</div>
</div>
<h2>فهرست‌کردن کلیدهای API شما</h2>
اگر یکپارچه‌سازی شما نیاز به استفاده از بیش از یک کلید API داشته باشد، می‌توانید به‌راحتی آن‌ها را از طریق اندپوینت <code>list</code> فهرست کنید:
<div style=”background: #0d0d0d; border: 1px solid rgba(127,127,127,.3); border-radius: 14px; padding: 16px 18px; box-shadow: 0 1px 1px rgba(0,0,0,.2); margin-bottom: 16px; font-family: monospace; color: #dcdcdc;”>
<pre style=”margin: 0; line-height: 1.2; white-space: pre;”><span style=”color: #9cdcfe;”>GET</span> <span style=”color: #d1006c;”>/api/v1/users/list-api-key</span>
[
  {
    <span style=”color: #9cdcfe;”>’apiId'</span>: 40,
    <span style=”color: #9cdcfe;”>’name'</span>: <span style=”color: #ce9178;”>’test'</span>,
    <span style=”color: #9cdcfe;”>’isActive'</span>: <span style=”color: #569cd6;”>true</span>,
    <span style=”color: #9cdcfe;”>’settings'</span>: {},
    <span style=”color: #9cdcfe;”>’publicKey'</span>: <span style=”color: #ce9178;”>’ZgzycV6Sf78BZKuyIAiz+0Bor002+0/rx1gLKsmYCsY='</span>,
    <span style=”color: #9cdcfe;”>’whiteListIp'</span>: [
      <span style=”color: #ce9178;”>’127.0.0.1′</span>
    ],
    <span style=”color: #9cdcfe;”>’createdAt'</span>: <span style=”color: #ce9178;”>’2024-08-05T13:54:18.427Z'</span>
  }
]
</pre>
</div>
<h2>مدیریت کلیدهای API شما</h2>
مدیریت کلیدهای API موجود از طریق خط پشتیبانی مشتریان B2B ما انجام می‌شود. این شامل موارد زیر است:
<ul>
  <li>حذف کلیدهای API</li>
  <li>افزودن آدرس‌های IP جدیدِ لیست‌سفید به یک کلید API موجود</li>
  <li>به‌روزرسانی و افزودن تنظیمات برای یک کلید API (مثلاً: مقادیر حداقل/حداکثر برای مقدار markup)</li>
  <li>غیرفعال کردن کلیدهای API</li>
</ul>
<h2>استفاده از کلید API</h2>
API نسخه <code>v2</code> نیاز دارد که ۳ هدر در هر درخواست تنظیم شوند:
<div style=”margin: 16px 0; font-family: system-ui, -apple-system, BlinkMacSystemFont,;”>
<table style=”width: 100%; border-collapse: collapse; background: #111111; color: #f5f5f5;”>
<tbody>
<tr>
<th style=”border: 1px solid #3a3a3a; padding: 12px 16px; text-align: left;”>هدر</th>
<th style=”border: 1px solid #3a3a3a; padding: 12px 16px; text-align: left;”>مقدار</th>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>x-api-public-key</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px;”>کلید عمومی‌ای که هنگام ایجاد کلید API دریافت کرده‌اید</td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>x-api-timestamp</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px;”>مهر زمانی یونیکس (UNIX timestamp)</td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>x-api-signature</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 12px 16px;”>امضای درخواست</td>
</tr>
</tbody>
</table>
</div>

مقدار امضا با استفاده از <span class=”notion-enable-hover” spellcheck=”false” data-token-index=”1″>hmac sha256</span> تولید می‌شود. داده‌ای که استفاده می‌شود، الحاق (concat) رشته‌ایِ مهر زمانی (timestamp)، نمایش رشته‌ای بدنهٔ درخواست و کلید عمومی است، در حالی که کلید خصوصی به‌عنوان کلید تابع <span class=”notion-enable-hover” spellcheck=”false” data-token-index=”3″>hmac</span> به کار می‌رود:
<div style=”background: #0d0d0d; border: 1px solid rgba(127,127,127,.3); border-radius: 14px; padding: 16px 18px; box-shadow: 0 1px 1px rgba(0,0,0,.2); margin-bottom: 16px; font-family: monospace; color: #dcdcdc; line-height: 1.5; white-space: pre;”>

<span style=”color: #569cd6;”>function</span> signRequest(requestBody) {
<span style=”color: #569cd6;”>const</span> timestamp = <span style=”color: #569cd6;”>new</span> Date().getTime();
<span style=”color: #569cd6;”>const</span> publicKey = <span style=”color: #ce9178;”>’ZgzycV6Sf78BZKuyIAiz+0Bor002+0/rx1gLKsmYCsY='</span>;
<span style=”color: #569cd6;”>const</span> privateKey = <span style=”color: #ce9178;”>’a482a8e3a3ff9aeadefb11d3d8c11253e7e8412e05ef2b8599016cc87a64b7d6′</span>;

<span style=”color: #569cd6;”>const</span> encoder = <span style=”color: #569cd6;”>new</span> TextEncoder();
<span style=”color: #569cd6;”>const</span> data = encoder.encode(
timestamp + JSON.stringify(requestBody) + publicKey,
);

<span style=”color: #569cd6;”>const</span> hmac = createHmac(<span style=”color: #ce9178;”>’sha256′</span>, privateKey);
<span style=”color: #569cd6;”>const</span> dataSign = hmac.update(data);
<span style=”color: #569cd6;”>const</span> signature = dataSign.digest(<span style=”color: #ce9178;”>’base64′</span>);

<span style=”color: #569cd6;”>return</span> signature;
}

signRequest({ myKey: <span style=”color: #ce9178;”>’myValue'</span> })

</div>
<h2>نمونه کد یکپارچه‌سازی</h2>
<div style=”margin: 16px 0; font-family: system-ui, -apple-system, BlinkMacSystemFont,;”>
<div style=”display: flex; align-items: center; gap: 12px; padding: 10px 18px; border-radius: 9999px; background: #242424; color: #e5e5e5;”>
<div style=”width: 24px; height: 24px; border-radius: 6px; background: #3b82f6; display: flex; align-items: center; justify-content: center; color: #ffffff; font-weight: bold; font-size: 16px; flex-shrink: 0;”>i</div>
<div style=”font-size: 0.95rem;”>برای نسخهٔ Python، به
<a style=”color: #e5e5e5; text-decoration: underline;” href=”https://pypi.org/project/quickex-sdk/”>
SDK ما در PyPi
</a>
مراجعه کنید.</div>
<div></div>
</div>
</div>
<div style=”background: #0d0d0d; border: 1px solid rgba(127,127,127,.3); border-radius: 14px; padding: 16px 18px; box-shadow: 0 1px 1px rgba(0,0,0,.2); margin-bottom: 16px; font-family: monospace; color: #dcdcdc; line-height: 1.5; white-space: pre;”>

<span style=”color: #569cd6;”>const</span> { createHmac } = require(<span style=”color: #ce9178;”>’crypto'</span>);

<span style=”color: #569cd6;”>const</span> API_PREFIX = <span style=”color: #ce9178;”>’https://quickex.io/api/'</span>;
<span style=”color: #569cd6;”>const</span> PUBKEY = <span style=”color: #ce9178;”>’public_key'</span>; <span style=”color: #6a9955;”>// changeme</span>
<span style=”color: #569cd6;”>const</span> PRIVKEY = <span style=”color: #ce9178;”>’private_key'</span>; <span style=”color: #6a9955;”>// changeme</span>

<span style=”color: #569cd6;”>function</span> signRequest(requestBody, timestamp) {
<span style=”color: #569cd6;”>const</span> encoder = <span style=”color: #569cd6;”>new</span> TextEncoder();
<span style=”color: #569cd6;”>const</span> data = encoder.encode(timestamp + JSON.stringify(requestBody) + PUBKEY);

<span style=”color: #569cd6;”>const</span> hmac = createHmac(<span style=”color: #ce9178;”>’sha256′</span>, PRIVKEY);
<span style=”color: #569cd6;”>const</span> dataSign = hmac.update(data);
<span style=”color: #569cd6;”>const</span> signature = dataSign.digest(<span style=”color: #ce9178;”>’base64′</span>);

<span style=”color: #569cd6;”>return</span> signature;
}

<span style=”color: #569cd6;”>async function</span> createOrder() {
<span style=”color: #569cd6;”>const</span> clientBrowserFingerprint = <span style=”color: #ce9178;”>’6b3add86bec11616427d069556a33548′</span>;
<span style=”color: #569cd6;”>const</span> orderRateMode = <span style=”color: #ce9178;”>’FLOATING'</span>;
<span style=”color: #569cd6;”>const</span> depositAmount = <span style=”color: #ce9178;”>’1′</span>;
<span style=”color: #569cd6;”>const</span> clientDestinationAddress = <span style=”color: #ce9178;”>’TUhw6S1HyXDhycKvTec3x7HNGQfNn3Vhpc'</span>;
<span style=”color: #569cd6;”>const</span> clientDestinationAddressMemo = <span style=”color: #569cd6;”>null</span>;
<span style=”color: #569cd6;”>const</span> markup = <span style=”color: #ce9178;”>’0.3′</span>;
<span style=”color: #569cd6;”>const</span> instrumentFromCurrencyTitle = <span style=”color: #ce9178;”>’BTC'</span>;
<span style=”color: #569cd6;”>const</span> instrumentFromNetworkTitle = <span style=”color: #ce9178;”>’BTC'</span>;

<span style=”color: #569cd6;”>const</span> instrumentToCurrencyTitle = <span style=”color: #ce9178;”>’USDT'</span>;
<span style=”color: #569cd6;”>const</span> instrumentToNetworkTitle = <span style=”color: #ce9178;”>’TRC20′</span>;

<span style=”color: #6a9955;”>// گام ۱. آماده‌سازی بدنهٔ درخواست createOrder با استفاده از داده‌های نرخِ به‌دست‌آمده</span>

<span style=”color: #569cd6;”>const</span> createOrderRequestBody = {
rateMode: orderRateMode,
instrumentFrom: {
currencyTitle: instrumentFromCurrencyTitle,
networkTitle: instrumentFromNetworkTitle,
},
instrumentTo: {
currencyTitle: instrumentToCurrencyTitle,
networkTitle: instrumentToNetworkTitle,
},
destinationAddress: clientDestinationAddress,
destinationAddressMemo: clientDestinationAddressMemo,
refundAddress: <span style=”color: #569cd6;”>null</span>,
refundAddressMemo: <span style=”color: #569cd6;”>null</span>,
markup: markup,
claimedNetworkFee: <span style=”color: #569cd6;”>null</span>,
legacyOrderId: <span style=”color: #569cd6;”>null</span>,
referrerId: <span style=”color: #569cd6;”>null</span>,
claimedDepositAmount: depositAmount,
utmData: [],
browserFingerprint: clientBrowserFingerprint,
};

<span style=”color: #6a9955;”>// گام ۲. آماده‌سازی امضا بر پایهٔ جفت‌کلید و داده‌های درخواست createOrder</span>

<span style=”color: #569cd6;”>const</span> timestamp = <span style=”color: #569cd6;”>new</span> Date().getTime();
<span style=”color: #569cd6;”>const</span> signature = signRequest(createOrderRequestBody, timestamp);

<span style=”color: #6a9955;”>// گام ۳. فراخوانی اندپوینت create-order در API v2</span>

<span style=”color: #569cd6;”>const</span> order = JSON.parse(
<span style=”color: #569cd6;”>await</span> (
<span style=”color: #569cd6;”>await</span> fetch(<span style=”color: #ce9178;”>`${API_PREFIX}v2/orders/public/create`</span>, {
method: <span style=”color: #ce9178;”>’POST'</span>,
headers: {
<span style=”color: #ce9178;”>’x-api-public-key'</span>: PUBKEY,
<span style=”color: #ce9178;”>’x-api-timestamp'</span>: timestamp,
<span style=”color: #ce9178;”>’x-api-signature'</span>: signature,
<span style=”color: #ce9178;”>’content-type'</span>: <span style=”color: #ce9178;”>’application/json; charset=utf-8′</span>,
},
body: JSON.stringify(createOrderRequestBody),
})
).text(),
);

console.log(<span style=”color: #ce9178;”>’order'</span>, order);
}

<span style=”color: #569cd6;”>void</span> createOrder();

</div>

این مقاله را به اشتراک بگذارید: