توثيق الواجهة البرمجية (API)
واجهة REST آمنة تُمكّن أنظمة إدارة المساحات والوصول من إنشاء حسابات الإنترنت والتحكم بجلساتها الحيّة وقراءة استهلاكها على شبكة يديرها RadiusX — بمفتاح واحد لكل شبكة، بصيغة JSON عبر HTTPS.
المصادقة
كل طلب يحمل مفتاح الشبكة كـ Bearer token. المفتاح وحده يحدّد الشبكة — لا تُمرّر أي معرّف شبكة. صاحب كل شبكة ينسخ مفتاحه من لوحته لدى RadiusX ويُدخله في نظامك، والمفتاح لا يرى ولا يتحكّم إلا ببيانات تلك الشبكة.
# header on every request
Authorization: Bearer rxk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
| الضابط | السلوك |
|---|---|
| البيئات | Sandbox والإنتاج يتشاركان نفس الـ Base URL؛ المفتاح يحدّد البيئة (مفتاح Sandbox يعمل على بيانات تجريبية معزولة). |
| قائمة السماح (IP) | اختيارية لكل شبكة. عند ضبطها تُرفض الطلبات من عناوين أخرى بـ 403 ip_not_allowed. |
| توقيع الطلب | HMAC اختياري (مرحلة 2): أرسل X-Signature: sha256=<hmac of raw body>. |
| حد الاستخدام | 120 طلب/دقيقة لكل مفتاح؛ التجاوز يُرجع 429 rate_limited. |
الأساسيات
| الموضوع | القاعدة |
|---|---|
| حجم البيانات | بالبايت، مجموع التنزيل + الرفع. |
| السرعة | ميجابت/ثانية (Mbps). |
| التواريخ | ISO 8601 مع الإزاحة، مثل 2026-08-31T23:59:59+03:00. نخزّن اللحظة الدقيقة. |
| منع التكرار | أرسل external_ref (معرّف بطاقتك) عند الإنشاء؛ تكرار نفس المرجع يُرجع الحساب القائم لا نسخة مكررة. ويُقبل أيضاً ترويسة Idempotency-Key. |
| العنونة | كل مسار /subscribers/{id} يقبل subscriber_id الرقمي لدينا أو external_ref الخاص بك. |
| شكل النجاح | { "status":"success", … } |
| شكل الخطأ | { "status":"error", "code":"…", "message":"…" } |
الكوتا والصلاحية
يُقيَّد الحساب بـ كوتا بيانات و/أو تاريخ صلاحية — اضبط أيّهما أو كليهما أو لا شيء. كلاهما يُفرض تلقائياً من طرفنا؛ لا حاجة لأن تراقب وتقطع بنفسك.
كوتا البيانات — quota_bytes
سقف إجمالي عبر كل الجلسات (رفع + تنزيل). الجلسة الحيّة مقيّدة بالمتبقي، وعند بلوغ السقف يُمنع الحساب عند إعادة المصادقة — لا يُصفَّر بإعادة الاتصال. القيمة 0 أو تركها = بلا حد.
الصلاحية — expires_at
تاريخ انتهاء زمني يُفرض فوراً: عند بلوغه يُمنع الدخول وتُقطع الجلسة الجارية. اتركه ليرث نافذة الباقة، أو أرسل null لبلا انتهاء.
النقاط (Endpoints)
{
"status": "success",
"profiles": [{
"id": 70, "name": "Day pass — 10 Mbps / 5 GB",
"download_mbps": "10", "upload_mbps": "10", "rate_limit": "10/10",
"quota_bytes": 5368709120, "time_limit_seconds": null,
"validity": "30 days", "price": 0
}]
}
external_ref.| الحقل | النوع | ملاحظات |
|---|---|---|
| username | string | اسم الدخول (معرّف بطاقتك). required |
| password | string | كلمة المرور. required |
| profile_id | integer | من GET /profiles. required |
| quota_bytes | integer | يتجاوز كوتا الباقة. 0 = بلا حد. optional |
| expires_at | string | ISO 8601. null = بلا انتهاء؛ الحذف = افتراضي الباقة. optional |
| external_ref | string | مرجعك — يفعّل منع التكرار والعنونة. optional |
| simultaneous_use | integer | أقصى أجهزة متزامنة. optional |
curl -X POST https://radiusx.link/api/v1/subscribers \ -H "Authorization: Bearer rxk_…" \ -H "Content-Type: application/json" \ -d '{ "username": "u-1001", "password": "s3cret", "profile_id": 70, "quota_bytes": 1073741824, "expires_at": "2026-08-31T23:59:59+03:00", "external_ref": "CARD-001" }'
{
"status": "success", "idempotent": false,
"subscriber": {
"subscriber_id": 33, "external_ref": "CARD-001",
"username": "u-1001", "profile_id": 70, "status": "active",
"online": false, "download_bytes": 0, "upload_bytes": 0,
"used_bytes": 0, "quota_bytes": 1073741824, "remaining_bytes": 1073741824,
"session_time": 0, "last_seen": null, "expires_at": "2026-08-31T20:59:59+00:00"
}
}
{id} هو subscriber_id لدينا أو external_ref الخاص بك.| الحقل | المعنى |
|---|---|
| status | active · suspended · expired |
| online | لديه جلسة حيّة الآن. |
| download_bytes | مجموع ما أُرسل للمستخدم (تنزيل). |
| upload_bytes | مجموع ما استُقبل من المستخدم (رفع). |
| used_bytes | المجموع الكلي (تنزيل + رفع). |
| remaining_bytes | الكوتا − المستهلك، أو null عند اللامحدود. |
| session_time | مجموع ثواني الاتصال. |
| last_seen | آخر تحديث محاسبة (ISO 8601) أو null. |
| expires_at | نهاية الصلاحية أو null. |
يتحدّث الاستهلاك على فترة محاسبة ~5 دقائق ولحظياً عند انتهاء الجلسة.
| الحقل | ملاحظات |
|---|---|
| status | active أو suspended — الإيقاف = منع + فصل فوري. |
| profile_id | تبديل الباقة (سرعة/كوتا/صلاحية). |
| quota_bytes | سقف إجمالي جديد (0 = بلا حد). |
| expires_at | صلاحية جديدة (null = بلا انتهاء). |
| password | تغيير كلمة المرور. |
curl -X PATCH https://radiusx.link/api/v1/subscribers/CARD-001 \ -H "Authorization: Bearer rxk_…" -H "Content-Type: application/json" \ -d '{ "status": "suspended" }'
{ "status": "success", "message": "Subscriber deleted." }{ "status": "success", "disconnected": true }
// disconnected:false = no live sessionالإشعارات (Webhooks) — مرحلة 2
زوّدنا برابط callback وسرّ مشترك، فنرسل أحداث دورة الحياة لحظياً. كل تسليم موقّع ويُعاد عند الفشل (5 محاولات، تراجع 10ث ← 15د).
| الحدث | يُطلق عند |
|---|---|
| subscriber.created | تجهيز الحساب. |
| subscriber.online | بدء جلسة. |
| subscriber.offline | انتهاء جلسة. |
| subscriber.quota_exhausted | بلوغ الاستهلاك للسقف. |
| subscriber.expired | انقضاء الصلاحية. |
| subscriber.suspended | إيقاف الحساب عبر الـ API. |
| subscriber.deleted | حذف الحساب. |
# headers X-RadiusX-Event: subscriber.quota_exhausted X-RadiusX-Signature: sha256=<hmac-sha256 of raw body, keyed by your secret> # body { "event": "subscriber.quota_exhausted", "sent_at": "2026-07-23T12:30:15+00:00", "data": { "subscriber_id": 33, "external_ref": "CARD-001", "username": "u-1001", "used_bytes": 1073741824, "quota_bytes": 1073741824 } }
HMAC-SHA256(secret, rawBody) ومقارنته بترويسة X-RadiusX-Signature قبل الوثوق به.الأخطاء
الاستجابات غير الناجحة تستخدم code ثابتاً قابلاً للقراءة آلياً؛ وmessage نصّي مكمّل. أخطاء التحقق تُضيف خريطة errors بالحقل.
| HTTP | code | المعنى |
|---|---|---|
| 401 | unauthorized | مفتاح مفقود أو غير صالح. |
| 401 | invalid_signature | فشل توقيع HMAC (عند تفعيله). |
| 403 | ip_not_allowed | العنوان خارج قائمة السماح. |
| 403 | network_suspended | الشبكة موقوفة. |
| 404 | not_found | لا مشترك بهذا المعرّف لهذه الشبكة. |
| 409 | username_taken | اسم المستخدم مستخدَم مسبقاً. |
| 422 | validation_failed | حقول ناقصة/خاطئة — راجع errors. |
| 429 | rate_limited | تجاوز 120 طلب/دقيقة. |
| 500 | server_error | خطأ غير متوقع — آمن لإعادة المحاولة. |
{
"status": "error", "code": "validation_failed",
"message": "The given data was invalid.",
"errors": { "profile_id": ["The profile id field is required."] }
}
بيئة الاختبار (Sandbox)
مفتاح Sandbox يشير إلى شبكة اختبار معزولة — أنشئ وأوقف واقرأ واحذف بحرية دون أي أثر حقيقي. نفس الـ Base URL؛ المفتاح يحدّد البيئة.
# list sandbox profiles, then create a test account curl https://radiusx.link/api/v1/profiles -H "Authorization: Bearer <sandbox key>" curl -X POST https://radiusx.link/api/v1/subscribers -H "Authorization: Bearer <sandbox key>" \ -H "Content-Type: application/json" \ -d '{"username":"test-1","password":"pw","profile_id":<id>,"external_ref":"T-1"}'