جارٍ التحميل…
جارٍ التحميل…
جارٍ التحميل…
للمطورين
نسخة تجريبية عامةتداول على Croleo من برامجك الخاصة. بيانات السوق عامة؛ أما الأوامر والأرصدة وعمليات التنفيذ فتحتاج مفتاح API وطلبًا موقَّعًا. تداول فوري فقط. لا تستطيع مفاتيح API السحب أبدًا.
نسخة تجريبية عامة بأموال تجريبية
BASE-QUOTE، مثل BTC-USDT أو ETH-USDC.Content-Type: application/json.تحتاج الأوامر والأرصدة وعمليات التنفيذ إلى مفتاح API. أنشئه من الحساب، مفاتيح API: أدرج عناوين IP المسموح باستخدامه منها، وأكّد بمفتاح المرور، وانسخ السر الذي يُعرض مرة واحدة فقط. راجع أيضًا كيف تعمل مفاتيح API.
timestamp + "\n" + METHOD + "\n" + path?query + "\n" + body: الطابع الزمني، ثم الطريقة بأحرف كبيرة، ثم المسار مع سلسلة الاستعلام كما ترسلها تمامًا، ثم الجسم الخام (فارغ لطلبات GET)، مفصولة بأسطر جديدة (\n).1793323476006
GET
/api/orders/history?market=BTC-USDT&limit=50
1793323476006
POST
/api/orders
{"market":"BTC-USDT","side":"buy","price":"50000.00","quantity":"0.0010"}stale_timestamp. أبقِ ساعتك متزامنة.invalid_signature.replayed_request. وقّع كل طلب مرة واحدة، بطابعه الزمني الخاص.ip_not_allowed.key_not_allowed. الطلب الذي يحمل مفتاحًا لا يرجع أبدًا إلى جلسة المتصفح.يقرأ كل مثال CROLEO_KEY وCROLEO_SECRET (وCROLEO_BASE لتوجيهه إلى عنوان آخر) من متغيرات البيئة ويطبع أرصدتك. السطر الأخير المعلَّق يضع أمرًا محددًا.
#!/usr/bin/env bash
# Needs bash, curl and openssl.
# Run: CROLEO_KEY=ck_... CROLEO_SECRET=... bash croleo.sh
BASE=https://croleo.com
[ -n "$CROLEO_BASE" ] && BASE=$CROLEO_BASE
croleo() {
method=$1 path=$2 body=$3
ts=$(date +%s%3N) # Unix ms (GNU date)
case $ts in *N) ts=$(($(date +%s) * 1000)) ;; esac # macOS date: seconds * 1000
sig=$(printf '%s\n%s\n%s\n%s' "$ts" "$method" "$path" "$body" |
openssl dgst -sha256 -hmac "$CROLEO_SECRET" | awk '{print $NF}')
set -- -sS -X "$method" "$BASE$path" \
-H "X-Croleo-Key: $CROLEO_KEY" \
-H "X-Croleo-Timestamp: $ts" \
-H "X-Croleo-Signature: $sig"
[ -n "$body" ] && set -- "$@" -H "Content-Type: application/json" --data-raw "$body"
curl "$@"
echo
}
croleo GET /api/balances
# croleo POST /api/orders '{"market":"BTC-USDT","side":"buy","price":"50000.00","quantity":"0.0010"}'يعمل المفتاح نيابة عن حسابك، لكن عبر نقاط النهاية هذه فقط. لكل المفاتيح الصلاحية نفسها: لا توجد نطاقات للاختيار.
لا تستطيع المفاتيح السحب أبدًا ولا تغيير حسابك
السحب وعناوين الإيداع والعناوين المحفوظة ومفاتيح المرور والجلسات ومفاتيح API وكل إعدادات الحساب الأخرى خارج متناولها. المفتاح الذي يستدعيها يتلقى 403 key_not_allowed.
إلغاء المفتاح من الحساب، مفاتيح API يوقفه فورًا. واستعادة حسابك تلغي كل المفاتيح.
429 rate_limited، مع retryAfter في الجسم وترويسة Retry-After، وكلاهما بالثواني.429 too_many_streams.maxOpenOrders في GET /api/markets)؛ والأمر الزائد يتلقى 409 too_many_open_orders.{ "error": "rate_limited", "retryAfter": 3 }تستخدم الأخطاء رمز حالة HTTP وجسم JSON فيه رمز ثابت يمكنك المطابقة عليه.
{ "error": "insufficient_funds" }عامة: لا تحتاج مفتاحًا ولا توقيعًا. أرسل هذه الطلبات دون ترويسات X-Croleo.
GET/api/markets
كل أصل مع خاناته العشرية، وكل سوق مع حالته (trading أو halted أو delisted) وخطوة السعر (tick) وخطوة الكمية (lot) والحدود ورسوم الصانع والآخذ بنقاط الأساس والنطاق السعري.
لا توجد معاملات.
{
"assets": [{ "code": "BTC", "decimals": 8 }, { "code": "USDT", "decimals": 6 }],
"markets": [
{
"symbol": "BTC-USDT",
"base": "BTC",
"quote": "USDT",
"status": "trading",
"tick": "0.01",
"lot": "0.0001",
"minQuantity": "0.0001",
"maxQuantity": "100.0000",
"maxPrice": "10000000.00",
"maxOpenOrders": 200,
"makerFeeBps": 10,
"takerFeeBps": 20,
"priceBandBps": 500
}
]
}GET/api/markets/{symbol}/book
أعلى 50 مستوى سعري في كل جانب، الأفضل أولًا، كأزواج [السعر، الكمية]. للتغييرات المباشرة استخدم بث السوق.
{
"symbol": "BTC-USDT",
"bids": [["77209.22", "0.0037"], ["77070.49", "0.0042"]],
"asks": [["77487.43", "0.0042"], ["77626.91", "0.0053"]]
}GET/api/markets/{symbol}/trades
أحدث الصفقات، الأحدث أولًا، حتى 100. يمثل side جانب الآخذ.
{
"symbol": "BTC-USDT",
"trades": [
{
"id": 13,
"price": "77284.47",
"quantity": "0.0005",
"side": "buy",
"time": 1793320210895
},
{
"id": 12,
"price": "77191.84",
"quantity": "0.0025",
"side": "buy",
"time": 1793320210895
}
]
}GET/api/markets/{symbol}/candles
الشموع، الأقدم أولًا؛ وtime بداية الفترة. تُستبعد الفترات التي لا صفقات فيها. تغطي 1m و5m و15m آخر 24 ساعة؛ وتغطي 1h و4h و1d و1w آخر سنة (أحدث 1,000 شمعة). تبدأ الأيام عند 00:00 بتوقيت UTC، والأسابيع يوم الاثنين.
{
"symbol": "BTC-USDT",
"interval": "1h",
"candles": [
{
"time": 1793318400000,
"open": "62803.91",
"high": "77284.47",
"low": "62803.91",
"close": "77284.47",
"volume": "0.0035",
"quoteVolume": "265.919648",
"trades": 7
}
]
}GET/api/tickers
إحصاءات متجددة لآخر 24 ساعة لكل سوق. تكون open وhigh وlow قيمة null إذا لم تحدث صفقات خلال 24 ساعة؛ وlast هي آخر صفقة على الإطلاق، أو null. التغيّر = (last − open) / open.
لا توجد معاملات.
{
"tickers": [
{
"symbol": "BTC-USDT",
"last": "77284.47",
"open": "60000.00",
"high": "77284.47",
"low": "60000.00",
"volume": "0.0179",
"quoteVolume": "1130.159648",
"trades": 13
}
]
}موقَّعة بمفتاح API. معرّفات الأوامر أرقام، فريدة داخل السوق الواحد.
POST/api/orders
يضع أمرًا محددًا أو أمر سوق ويرد بالرمز 201 مع الأمر بعد المطابقة والصفقات التي نفّذها. تكون status إحدى القيم open أو filled أو closed (وcloseReason إحدى unfilled أو self_trade، أو would_trade لأمر post_only كان سينفَّذ فورًا). سعر أمر السوق هو أسوأ سعر يمكن أن يبلغه، مقيدًا بالنطاق السعري.
{
"market": "BTC-USDT",
"side": "buy",
"type": "limit",
"price": "50000.00",
"quantity": "0.0010",
"timeInForce": "gtc"
}{
"order": {
"market": "BTC-USDT",
"id": 111,
"type": "limit",
"side": "buy",
"price": "50000.00",
"quantity": "0.0010",
"remaining": "0.0010",
"spend": null,
"timeInForce": "gtc",
"placedAt": 1793323476006,
"status": "open",
"closeReason": null,
"trades": []
}
}POST/api/orders/cancel
يلغي أمرًا مفتوحًا واحدًا ويحرر ما كان محجوزًا له. المعرّفات فريدة داخل السوق الواحد، لذا أرسل الاثنين.
{ "market": "BTC-USDT", "id": 111 }{
"order": {
"market": "BTC-USDT",
"id": 111,
"type": "limit",
"side": "buy",
"price": "50000.00",
"quantity": "0.0010",
"remaining": "0.0010",
"spend": null,
"timeInForce": "gtc",
"placedAt": 1793323476006,
"status": "closed",
"closeReason": "cancelled"
}
}POST/api/orders/cancel-all
يلغي كل أوامرك المفتوحة، أو أوامر سوق واحد فقط. يمكن حذف الجسم (كل الأسواق). وcancelled هو عدد الأوامر الملغاة.
{ "market": "BTC-USDT" }{ "cancelled": 2 }GET/api/orders
أوامرك المفتوحة في كل الأسواق، مع ما تبقى تنفيذه (remaining).
لا توجد معاملات.
{
"orders": [
{
"market": "BTC-USDT",
"id": 111,
"type": "limit",
"side": "buy",
"price": "50000.00",
"quantity": "0.0010",
"remaining": "0.0010",
"timeInForce": "gtc",
"placedAt": 1793323476006
}
]
}GET/api/orders/history
أوامرك المغلقة، الأحدث إغلاقًا أولًا، مع ما نُفّذ وقيمته والرسوم. تنتهي كل صفحة بقيمة next: مرّرها في before للحصول على صفوف أقدم؛ وnull تعني عدم وجود المزيد.
{
"orders": [
{
"market": "BTC-USDT",
"id": 95,
"type": "limit",
"side": "buy",
"price": "74624.04",
"quantity": "0.0010",
"remaining": "0.0000",
"spend": null,
"timeInForce": "gtc",
"placedAt": 1793321026544,
"status": "filled",
"closeReason": null,
"filled": "0.0010",
"filledValue": "74.624040",
"fee": "0.149249",
"feeAsset": "USDT",
"closedAt": 1793321027591
}
],
"next": null
}موقَّعة بمفتاح API.
GET/api/balances
كل أصل، مع المتاح منه والمحجوز (في أوامر مفتوحة أو عمليات سحب معلّقة)، بكامل خاناته العشرية.
لا توجد معاملات.
{
"balances": [
{ "asset": "BTC", "available": "0.01250000", "onHold": "0.00000000" },
{ "asset": "USDT", "available": "68175.000000", "onHold": "12000.000000" }
]
}GET/api/fills
جانبك من كل صفقة، الأحدث أولًا: يكون role صانعًا (maker) أو آخذًا (taker)، وتُحتسب الرسوم بأصل التسعير. مقسّمة إلى صفحات مثل سجل الأوامر.
{
"fills": [
{
"market": "BTC-USDT",
"order": 95,
"trade": 14,
"side": "buy",
"role": "taker",
"price": "74624.04",
"quantity": "0.0010",
"value": "74.624040",
"fee": "0.149249",
"feeAsset": "USDT",
"time": 1793321027591
}
],
"next": "1188-2"
}يبث كل سوق دفتر أوامره (أعلى 50 مستوى في كل جانب) وصفقاته ومؤشره خلال 24 ساعة كأحداث يرسلها الخادم. لا حاجة إلى مفتاح: افتح بثًّا واحدًا لكل سوق تتابعه وأغلقه عند الانتهاء.
GET/api/markets/{symbol}/streamعامة
// In a browser (or Node.js with an EventSource package). No key needed.
const stream = new EventSource("https://croleo.com/api/markets/BTC-USDT/stream");
let seq = null;
stream.addEventListener("snapshot", (event) => {
const s = JSON.parse(event.data);
seq = s.seq;
// Replace your state with s.bids, s.asks, s.trades (newest first) and s.ticker.
});
stream.addEventListener("update", (event) => {
const u = JSON.parse(event.data);
if (u.seq !== seq + 1) {
stream.close(); // a gap: open a new stream, which starts with a snapshot
return;
}
seq = u.seq;
// Apply u.bids and u.asks (a quantity of 0 removes the level), then u.trades (oldest first).
});snapshot: الحالة كاملة (الدفتر، وآخر الصفقات الأحدث أولًا، والمؤشر، والحالة). هو دائمًا الحدث الأول؛ وقد يصل أيضًا في منتصف البث إلى عميل تأخّر، وعندها يحل محل كل شيء.update: ما تغيّر. يحتوي bids وasks المستويات المتغيرة فقط: استبدل المستوى عند ذلك السعر، واحذفه عندما تكون الكمية صفرًا. ويسرد trades الصفقات الجديدة، الأقدم أولًا. ولا يُضمَّن ticker إلا عند حدوث صفقات.seq بمقدار 1 بالضبط مع كل تحديث على الاتصال الواحد. عند وجود فجوة، أغلق البث وافتحه من جديد. بعد إعادة تشغيل الخادم يستمر الترقيم من رقم أعلى: تابع دائمًا من أحدث لقطة.GET /api/orders وGET /api/balances وGET /api/fills.{
"symbol": "BTC-USDT",
"seq": 922,
"status": "trading",
"bids": [["77209.22", "0.0037"]],
"asks": [["77487.43", "0.0042"]],
"trades": [
{
"id": 13,
"price": "77284.47",
"quantity": "0.0005",
"side": "buy",
"time": 1793320210895
}
],
"ticker": {
"last": "77284.47",
"open": "60000.00",
"high": "77284.47",
"low": "60000.00",
"volume": "0.0179",
"quoteVolume": "1130.159648",
"trades": 13
}
}{
"seq": 923,
"status": "trading",
"bids": [["77209.22", "0.0000"]],
"asks": [],
"trades": [
{
"id": 14,
"price": "77209.22",
"quantity": "0.0037",
"side": "sell",
"time": 1793320230512
}
],
"ticker": {
"last": "77209.22",
"open": "60000.00",
"high": "77284.47",
"low": "60000.00",
"volume": "0.0216",
"quoteVolume": "1415.833762",
"trades": 14
}
}لا يستطيع أي مفتاح الوصول إلى نقطة نهاية للسحب، ولا يوجد إعداد يمكن أن يسمح بذلك. يتم السحب داخل التطبيق فقط، مع تحقق بمفتاح المرور وفترة انتظار للعناوين الجديدة ومراجعة للمبالغ الكبيرة. أقصى ما يفعله مفتاح مسرَّب هو وضع أوامر أو إلغاؤها ضمن رصيدك؛ ألغه فورًا من الحساب، مفاتيح API.
كيف نحمي عمليات السحب