📡 SMS Numbers API
شراء أرقام التفعيل ونجوم وبريميوم تيليجرام والجلسات وخدمات الـ SMM،
والاستعلام عن الرصيد والطلبات برمجيًا،
وبالبيانات نفسها المستخدمة في البوت تمامًا.
كل عمليات الشراء تدعم
external_order_id
لإعادة المحاولة بأمان دون تكرار الخصم.
Buy activation numbers, Telegram Stars/Premium, sessions and SMM services,
check your balance and orders programmatically —
using the exact same data as the bot.
Every purchase supports
external_order_id
for safe retries without double-charging.
🔑 المصادقة 🔑 Authentication
يجب أن يتضمن كل طلب — عدا نقاط النهاية العامة
(GET /v1/health،
GET /v1/countries،
GET /v1/services،
GET /v1/sessions/countries،
GET /v1/telegram/premium/prices،
GET /v1/telegram/stars/price)
— ترويسة Authorization على النحو التالي:
Every request — except the public endpoints
(GET /v1/health,
GET /v1/countries,
GET /v1/services,
GET /v1/sessions/countries,
GET /v1/telegram/premium/prices,
GET /v1/telegram/stars/price)
— must include an Authorization header:
Authorization: Bearer <api_token>
- من البوت: الإعدادات ← 🔑 APIKEY ← 🌐 الـ IP المسموح بيها (عنوان أو نطاق مثل
203.0.113.0/24). - أي طلب من عنوان آخر يُرفض بـ
403 IP_NOT_ALLOWED، فيصبح المفتاح المسروق بلا فائدة. - القائمة فارغة = المفتاح يعمل من أي مكان. وتُدار من البوت فقط حتى لا يغيّرها من سرق المفتاح.
- In the bot: Settings → 🔑 APIKEY → 🌐 Allowed IPs (an address or a range like
203.0.113.0/24). - Any request from another address is rejected with
403 IP_NOT_ALLOWED, so a stolen key is useless. - Empty list = the key works from anywhere. It is managed from the bot only, so a thief cannot change it.
🌍 العنوان الأساسي 🌍 Base URL
http://fi16.bot-hosting.cloud:25538
⚠️ الاتصال هنا عبر HTTP دون تشفير، لذا لا تشارك مفتاحك مع أحد، ولا ترسله عبر شبكات عامة. ⚠️ This connection uses plain HTTP (unencrypted), so never share your token and avoid sending it over public networks.
⏱️ حدّ الطلبات ⏱️ Rate Limit
القراءة (طلبات GET مثل الأرصدة والطلبات والأكواد) لكل مفتاح في الدقيقة.
Reads (GET requests such as balance, orders and codes) per token per minute.
الشراء والتعديل (طلبات POST) لكل مفتاح في الدقيقة، وهو أضيق عمدًا لحماية رصيدك.
Purchases and writes (POST requests) per token per minute. It is intentionally tighter to protect your balance.
لكل عنوان IP في الدقيقة: 300 للقراءة و60 للشراء. Per IP address per minute: 300 reads and 60 writes.
- الحدود قابلة للتخصيص لكل مفتاح، تواصل مع الدعم.
- قلّل الاستعلام المتكرر باستخدام Webhooks.
- الترويسات
X-RateLimit-*تعرض دائمًا الحد المطبّق عليك فعلًا.
- Limits can be customised per key, contact support.
- Cut repeated polling with Webhooks.
- The
X-RateLimit-*headers always show the limit actually applied to you.
عند تجاوز الحد يُعاد الرمز
429
مع ترويسة Retry-After تحدد عدد الثواني التي يجب أن تنتظرها قبل إعادة المحاولة.
كما يحمل كل رد ترويسات تساعدك على ضبط معدّل طلباتك قبل الوصول للحد:
When the limit is exceeded you get
429
with a Retry-After header telling you how many seconds to wait before retrying.
Every response also carries headers that let you pace your requests before hitting the limit:
| Header | المعنىMeaning |
|---|---|
| X-RateLimit-Limit | الحد الأقصى المطبّق عليك الآن (حد المفتاح أو حد الـ IP، أيهما أضيق) The limit currently applied to you (token or IP limit, whichever is tighter) |
| X-RateLimit-Remaining | عدد الطلبات المتبقية لك قبل الوصول للحد Requests you have left before hitting the limit |
| X-RateLimit-Reset | عدد الثواني حتى يتحرر مكان لطلب جديد Seconds until a slot frees up for a new request |
| Retry-After |
مع الرد 429 فقط: ثواني الانتظار قبل إعادة المحاولة (وتظهر أيضًا في error.retry_after)
On 429 only: seconds to wait before retrying (also in error.retry_after)
|
HTTP/1.1 429 Too Many Requests Retry-After: 23 X-RateLimit-Limit: 20 X-RateLimit-Remaining: 0 X-RateLimit-Reset: 23
📚 نقاط النهاية 📚 Endpoints
- المبالغ نصوص مثل
"12.50"(حتى 4 خانات عشرية). استخدم مكتبة decimal لا float. - الأسماء ثنائية اللغة:
nameبالعربية وname_enبالإنجليزية (وكذلكdescription_enوtitle_en).
- Amounts are strings like
"12.50"(up to 4 decimals). Use a decimal library, not float. - Bilingual names:
nameis Arabic andname_enis English (same fordescription_enandtitle_en).
يعيد رصيد حسابك الحالي. Returns your current account balance.
curl -H "Authorization: Bearer YOUR_TOKEN" \ http://fi16.bot-hosting.cloud:25538/v1/balance
{
"ok": true,
"balance": "125.50",
"currency": "USD"
}
balance نص بخانتين عشريتين دائمًا (وليس رقمًا)،
وcurrency هي عملة الحساب.
balance is always a string with two decimals (not a number),
and currency is the account currency.
إحصائيات استخدام حسابك للـ API: عدد وقيمة الطلبات (الإجمالي وآخر 24 ساعة)، وعدد الطلبات والأخطاء اليوم (اليوم بتوقيت UTC). الخطأ هو أي رد حالته 400 أو أكثر. الأوردرات المحسوبة هي التي تمت عبر الـ API فقط. Usage statistics for your API account: number and value of orders (all-time and last 24 hours), plus today's request and error counts (day = UTC). An error is any response with status 400 or higher. Only orders placed through the API are counted.
curl -H "Authorization: Bearer YOUR_TOKEN" \ http://fi16.bot-hosting.cloud:25538/v1/usage
{
"balance": "113.00",
"currency": "USD",
"apiOrdersTotal": 47,
"apiSpendTotal": "582.30",
"apiOrders24h": 5,
"apiSpend24h": "62.50",
"requestCountToday": 128,
"errorCountToday": 3
}
فحص صحة الخدمة. يعيد 200 عندما يعمل الـ API، و503 عندما يكون متوقفًا للصيانة. Service health check. Returns 200 when the API is running and 503 when it is stopped for maintenance.
curl http://fi16.bot-hosting.cloud:25538/v1/health
{ "ok": true, "service": "partner-api", "version": 1 }
{ "ok": false, "service": "partner-api", "version": 1, "error": "maintenance" }
يعيد قائمة الدول المتاحة للشراء حاليًا مع أسعارها. Returns the countries currently available for purchase, with their prices.
curl http://fi16.bot-hosting.cloud:25538/v1/countries
[
{
"country_code": "US",
"country_name": "United States",
"flag": "🇺🇸",
"price": "1.50"
}
]
يعيد سجل طلباتك (أرقام ومنتجات) من الأحدث إلى الأقدم، بترقيم صفحات.
المعامل limit إجباري (من 1 إلى 200)،
وإن أُرسل الطلب بدونه يُرجِع الخطأ LIMIT_REQUIRED (HTTP 400).
المعامل offset اختياري (الافتراضي 0) لجلب الصفحات التالية،
مثال: ?limit=50&offset=50 للصفحة الثانية. الإجمالي في الترويسة
X-Total-Count، و
X-Has-More: true إن وُجدت صفحة تالية.
إذا سبق جلب كود الرقم فإنه يظهر في الحقل
code
ومعه
password
إن وُجدت.
Returns your order history (numbers and products), newest first, paginated.
The limit parameter is required (1 to 200);
a request without it gets LIMIT_REQUIRED (HTTP 400).
offset is optional (default 0) for the next pages,
e.g. ?limit=50&offset=50 for page two. The total is in the
X-Total-Count header, and
X-Has-More: true means another page exists.
If the number's code was already fetched, it appears in
code
with
password
if present.
curl -H "Authorization: Bearer YOUR_TOKEN" \ "http://fi16.bot-hosting.cloud:25538/v1/orders?limit=50"
[
{
"id": 118,
"type": "number",
"title": "United States",
"title_en": "United States",
"price": "1.50",
"discount": "0.00",
"status": "completed",
"created_at": "2026-09-19T10:15:00+00:00",
"phone": "+1555...",
"code": "482913",
"password": null
}
]
يشتري رقم تفعيل لدولة محددة، ويُخصم السعر من رصيدك فورًا.
إذا فشلت العملية قبل التنفيذ أو رُفضت بوضوح، يُعاد الرصيد تلقائيًا.
أما إذا لم تتأكد النتيجة (انتهاء مهلة أو خطأ في المعالجة)، فلا يُعاد الرصيد
تلقائيًا: يُراجَع الطلب يدويًا (الرمز ORDER_UNDER_REVIEW).
Buys an activation number for a given country.
The price is deducted immediately. If the purchase fails before execution,
or is clearly rejected, your balance is refunded automatically.
If the result is unknown (timeout or a processing error), the balance is
not refunded automatically: the order goes to manual review
(ORDER_UNDER_REVIEW).
idempotent_replay: true).
استخدام نفس القيمة مع دولة مختلفة يعيد
409.
🔁 external_order_id is optional but strongly recommended.
Retrying with the same value returns the original result without
an extra charge
(idempotent_replay: true).
Reusing it with another country returns
409.
curl -X POST \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"country_code": "US", "external_order_id": "shop-order-1001"}' \
http://fi16.bot-hosting.cloud:25538/v1/numbers/buy
{
"order_id": 118,
"order_type": "number",
"country_code": "US",
"phone": "+1555xxxxxxx",
"price": "1.50",
"status": "pending",
"external_order_id": "shop-order-1001",
"idempotent_replay": false
}
يجلب كود التفعيل لطلب معيّن.
قيمة order_type
إما number
(الافتراضية) أو
manual_number.
إذا لم يصل الكود بعد فسيُعاد
404؛
أعد الطلب بعد بضع ثوانٍ.
وبمجرد وصول الكود يُحفظ، فإذا استدعيت الطلب نفسه مرة أخرى
أعاد الكود نفسه.
ويكون password
قيمته null
إذا لم يكن للرقم كلمة مرور.
Fetches the activation code for a specific order.
order_type
is either number
or manual_number.
If the code has not arrived yet you get
404;
retry after a few seconds.
Once the code arrives it is stored and repeated requests
return the same code.
curl -H "Authorization: Bearer YOUR_TOKEN" \ "http://fi16.bot-hosting.cloud:25538/v1/orders/118/code?order_type=number"
{
"order_id": 118,
"phone": "+1555xxxxxxx",
"code": "482913",
"password": null,
"status": "completed"
}
⭐ نجوم وبريميوم تيليجرام ⭐ Telegram Stars & Premium
يعيد سعر اشتراك تيليجرام مميز لكل مدة متاحة. Returns the price of Telegram Premium for every available duration.
curl -H "Authorization: Bearer YOUR_TOKEN" \ http://fi16.bot-hosting.cloud:25538/v1/telegram/premium/prices
[
{ "duration_months": 3, "price": "15.00" },
{ "duration_months": 6, "price": "22.00" },
{ "duration_months": 12, "price": "38.00" }
]
يحسب سعر كمية معيّنة من نجوم تيليجرام قبل الشراء. Calculates the price of a given quantity of Telegram Stars before buying.
curl -H "Authorization: Bearer YOUR_TOKEN" \ "http://fi16.bot-hosting.cloud:25538/v1/telegram/stars/price?quantity=100"
{ "quantity": 100, "price": "2.00" }
يشتري نجوم تيليجرام ويرسلها لليوزر المحدد.
نفس آلية الخصم الذري وقاعدة الاسترجاع (تلقائي عند الرفض المؤكد فقط، ومراجعة يدوية عند عدم تأكد النتيجة) و
external_order_id
بتاعة
/v1/numbers/buy.
Buys Telegram Stars and sends them to the given username.
Same atomic deduction, refund rule (automatic only on a clear rejection, manual review when the result is unknown) and
external_order_id
mechanics as
/v1/numbers/buy.
curl -X POST \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"target_username": "someuser", "quantity": 100, "external_order_id": "shop-stars-1"}' \
http://fi16.bot-hosting.cloud:25538/v1/telegram/stars/buy
{
"order_id": 45,
"order_type": "stars",
"target_username": "someuser",
"quantity": 100,
"duration_months": null,
"price": "2.00",
"status": "processing",
"external_order_id": "shop-stars-1",
"idempotent_replay": false
}
@،
ومن 5 إلى 32 حرفًا/رقمًا/underscore.
الكمية بين 50 و
50000.
Username without @,
5–32 letters/digits/underscore.
Quantity between 50
and 50000.
يشتري اشتراك تيليجرام مميز لليوزر المحدد.
نفس آلية
/v1/numbers/buy
تمامًا.
Buys a Telegram Premium subscription for the given username.
Same mechanics as
/v1/numbers/buy.
curl -X POST \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"target_username": "someuser", "duration_months": 3, "external_order_id": "shop-prem-1"}' \
http://fi16.bot-hosting.cloud:25538/v1/telegram/premium/buy
{
"order_id": 46,
"order_type": "premium",
"target_username": "someuser",
"quantity": null,
"duration_months": 3,
"price": "15.00",
"status": "processing",
"external_order_id": "shop-prem-1",
"idempotent_replay": false
}
duration_months
لازم يكون
3
أو
6
أو
12.
duration_months
must be
3,
6,
or
12.
يعيد حالة طلب نجوم/بريميوم.
إن لم تكن الحالة نهائية بعد، يحاول تحديثها مباشرةً.
الحالات: processing، completed،
failed، under_review (تحت المراجعة اليدوية؛
الرصيد لم يُعَد بعد)، refunded (أُعيد الرصيد بعد المراجعة).
Returns the status of a Stars/Premium order.
If the status is not final yet, it tries to refresh it live.
Statuses: processing, completed,
failed, under_review (manual review;
balance not refunded yet), refunded (balance returned after review).
curl -H "Authorization: Bearer YOUR_TOKEN" \ http://fi16.bot-hosting.cloud:25538/v1/telegram/orders/45
{
"order_id": 45,
"order_type": "stars",
"target_username": "someuser",
"quantity": 100,
"duration_months": null,
"price": "2.00",
"status": "completed",
"external_order_id": "shop-stars-1",
"idempotent_replay": false
}
📦 المنتجات (مخزون وتسليم فوري) 📦 Products (stock & instant delivery)
code (كود) أو link (رابط)
أو account (بريد وباسورد) أو text (نص).
كل عنصر مخزون يُباع لعميل واحد فقط. الشراء ذري بالكامل (خصم الرصيد وسحب العنصر وتسجيل الطلب معًا)،
فإذا نفد المخزون أو لم يكفِ الرصيد لا يُخصم شيء.
المنتجات اليدوية (بدون مخزون) لا تُباع عبر الـ API.
Every product has a delivery type: code, link,
account (email & password) or text.
Each stock item is sold to exactly one customer. A purchase is fully atomic (balance deduction, taking the item
and recording the order happen together), so if stock runs out or the balance is too low
nothing is charged. Manual products (no stock) are not sold through the API.
يعيد المنتجات المتاحة للشراء مجمّعة حسب التصنيف (المفعّل فقط).
المنتج الذي نفد مخزونه يبقى ظاهرًا ويأتي بـ
in_stock: false.
الكمية الفعلية stock تظهر فقط للمنتجات التي فعّل لها المسؤول إظهار الكمية،
وإلا تكون null.
معامل اختياري: category_id لعرض تصنيف واحد.
التصنيفات قد تكون متداخلة: الحقل parent_id يكون
null للتصنيف الرئيسي، ورقم التصنيف الأب للتصنيف الفرعي.
التصنيف الفرعي تحت أب معطّل لا يظهر، والأب الذي يحتوي فرعيات فقط يظهر بقائمة
products فارغة ليسهل بناء الشجرة.
Returns the products you can buy, grouped by (active) category.
Categories can be nested: parent_id is
null for a top-level category, or the parent category's id for a subcategory.
A subcategory under a disabled parent is hidden, and a parent that only contains subcategories is
listed with an empty products array so you can rebuild the tree.
A sold-out product stays listed with
in_stock: false.
The real quantity stock is only shown for products whose admin enabled
quantity display; otherwise it is null.
Optional parameter: category_id to show a single category.
curl -H "Authorization: Bearer YOUR_TOKEN" \ "http://fi16.bot-hosting.cloud:25538/v1/products"
[
{
"id": 3,
"parent_id": null,
"name": "حسابات جيميل",
"name_en": "Gmail accounts",
"description": null,
"description_en": null,
"products": [
{
"id": 12,
"name": "Gmail 2019",
"name_en": "Gmail 2019",
"description": "حساب جيميل قديم",
"description_en": "Old Gmail account",
"price": "1.50",
"delivery_type": "account",
"in_stock": true,
"stock": null
},
{
"id": 14,
"name": "كود تفعيل",
"name_en": "Activation code",
"description": null,
"description_en": null,
"price": "0.80",
"delivery_type": "code",
"in_stock": false,
"stock": null
}
]
}
]
يشتري منتجًا ويسلّمه فورًا في نفس الرد داخل الحقل
delivery.
المعاملات: product_id (إجباري، من
GET /v1/products) و
external_order_id (اختياري لكن يُنصح به بشدة).
إعادة نفس الطلب بنفس external_order_id تُرجِع نفس الطلب ونفس البيانات
من غير خصم ثانٍ (idempotent_replay: true)،
فإذا انقطع الاتصال قبل وصول الرد فأعد الطلب بأمان.
Buys a product and delivers it right away in the same response, inside
delivery.
Parameters: product_id (required, from
GET /v1/products) and
external_order_id (optional but strongly recommended).
Repeating the request with the same external_order_id returns the same order and data
without a second charge (idempotent_replay: true),
so if the connection drops before the response arrives you can safely retry.
curl -X POST \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"product_id": 12, "external_order_id": "shop-prod-1"}' \
http://fi16.bot-hosting.cloud:25538/v1/products/buy
{
"order_id": 88,
"order_code": "ORD-7K2M9X4QA",
"product_id": 12,
"product_name": "Gmail 2019",
"product_name_en": "Gmail 2019",
"category_name": "حسابات جيميل",
"category_name_en": "Gmail accounts",
"price": "1.50",
"status": "completed",
"delivery": {
"type": "account",
"content": "user@example.com:S3cretPass",
"email": "user@example.com",
"password": "S3cretPass"
},
"external_order_id": "shop-prod-1",
"idempotent_replay": false,
"created_at": "2026-10-04T00:55:00+00:00"
}
delivery: type هو نوع التسليم، و
content هو المحتوى كاملًا (الكود أو الرابط أو النص أو بريد:باسورد).
للنوع account فقط يأتي أيضًا email و
password مفصولين (وإلا يكونان null).
The delivery field: type is the delivery type and
content is the full content (the code, link, text, or email:password).
Only for account you also get separate email and
password (otherwise they are null).
PRODUCT_NOT_FOUND (404)،
PRODUCT_DISABLED (400)،
PRODUCT_NOT_SUPPORTED (400)،
OUT_OF_STOCK (409)،
INSUFFICIENT_BALANCE (402)،
EXTERNAL_ORDER_ID_REUSED (409). في كل هذه الحالات لا يُخصم أي رصيد.
Possible errors: PRODUCT_NOT_FOUND (404),
PRODUCT_DISABLED (400),
PRODUCT_NOT_SUPPORTED (400),
OUT_OF_STOCK (409),
INSUFFICIENT_BALANCE (402),
EXTERNAL_ORDER_ID_REUSED (409). In every one of these cases nothing is charged.
يعيد بيانات طلب منتج اشتريته سابقًا (نفس حقل delivery الذي وصلك عند الشراء).
لا يعمل إلا مع طلباتك أنت؛ غير ذلك يُرجِع ORDER_NOT_FOUND (404).
Returns a product order you bought earlier (the same delivery field you got at purchase time).
It only works for your own orders; otherwise it returns ORDER_NOT_FOUND (404).
curl -H "Authorization: Bearer YOUR_TOKEN" \ http://fi16.bot-hosting.cloud:25538/v1/products/orders/88
🧰 الجلسات والخدمات والرصيد 🧰 Sessions, Services & Account
- الخصم يتم أولًا قبل التنفيذ، و
external_order_idيمنع الشراء المزدوج. - النتيجة المجهولة =
409 ORDER_UNDER_REVIEWدون إعادة رصيد تلقائية. - طلبات الـ API لا تظهر في «طلباتي» داخل البوت، وتظهر فقط في
GET /v1/orders.
- The charge happens first, before execution, and
external_order_idprevents double purchases. - An unknown outcome =
409 ORDER_UNDER_REVIEWwith no automatic refund. - API orders do not appear in “My Orders” inside the bot, only in
GET /v1/orders.
يجلب حالة أي طلب (أرقام / نجوم / بريميوم / منتجات / جلسات / خدمات) عبر external_order_id الذي أرسلته عند الشراء، دون الحاجة إلى order_id. مفيد جدًا بعد ORDER_UNDER_REVIEW أو انقطاع الاتصال. الحقل state هو حالة الطلب إن وُجد، وإلا حالة العملية (under_review / processing / refunded / done). إن لم يوجد شيء يعيد ORDER_NOT_FOUND (404).
Looks up any order (numbers / Stars / Premium / products / sessions / services) by the external_order_id you sent at purchase time, without needing the order_id. Very useful after ORDER_UNDER_REVIEW or a dropped connection. state is the order status when an order exists, otherwise the operation state (under_review / processing / refunded / done). If nothing exists it returns ORDER_NOT_FOUND (404).
curl -H "Authorization: Bearer YOUR_TOKEN" \ http://fi16.bot-hosting.cloud:25538/v1/orders/by-external/shop-1042
{
"external_order_id": "shop-1042",
"state": "under_review",
"order": null,
"pending_op_id": 57
}
الدول المتاحة لشراء حزم الجلسات مع سعر الجلسة الواحدة والكمية المتاحة. Countries available for session packages, with the price per session and the available quantity.
curl -H "Authorization: Bearer YOUR_TOKEN" \ http://fi16.bot-hosting.cloud:25538/v1/sessions/countries
[
{ "country_code": "US", "country_name": "United States", "flag": "🇺🇸", "price": "0.45", "available": 320 }
]
يشتري حزمة جلسات (من 1 إلى 1000). الرد status: processing حتى تُجهَّز الحزمة؛ تابع الحالة من GET /v1/sessions/orders/{order_id} ثم حمّل الملف.
Buys a sessions package (1 to 1000). The response has status: processing until the package is prepared; poll GET /v1/sessions/orders/{order_id} and then download the file.
curl -H "Authorization: Bearer YOUR_TOKEN" -X POST -H "Content-Type: application/json" \
-d '{"country_code":"US","quantity":5,"external_order_id":"shop-2001"}' \
http://fi16.bot-hosting.cloud:25538/v1/sessions/buy
{
"order_id": 31,
"order_type": "session",
"country_code": "US",
"quantity": 5,
"unit_price": "0.45",
"price": "2.25",
"status": "processing",
"progress_percent": null,
"completed_count": null,
"download_ready": false,
"external_order_id": "shop-2001",
"idempotent_replay": false
}
حالة طلب الجلسات مع نسبة التقدم. عندما يصبح status: done وdownload_ready: true يمكنك التحميل.
Sessions order status with progress. When status: done and download_ready: true you can download.
curl -H "Authorization: Bearer YOUR_TOKEN" \ http://fi16.bot-hosting.cloud:25538/v1/sessions/orders/31
يحمّل حزمة الجلسات كملف zip بعد اكتمال الطلب. قبل الاكتمال يعيد ORDER_NOT_READY (409).
Downloads the sessions package as a zip file once the order is done. Before that it returns ORDER_NOT_READY (409).
curl -H "Authorization: Bearer YOUR_TOKEN" -o sessions.zip \ http://fi16.bot-hosting.cloud:25538/v1/sessions/orders/31/download
خدمات الـ SMM المتاحة مجمّعة حسب التصنيف، مع السعر لكل 1000 وحدود الكمية. الأسماء بالعربية name والإنجليزية name_en.
الحقل parent_id يكون null للتصنيف الرئيسي، وإلا رقم التصنيف الأب.
Available SMM services grouped by category, with the price per 1000 and the quantity limits. Names are in Arabic name and English name_en.
parent_id is null for a top-level category, otherwise the parent category's id.
curl -H "Authorization: Bearer YOUR_TOKEN" \ http://fi16.bot-hosting.cloud:25538/v1/services
[
{
"id": 4,
"parent_id": null,
"name": "متابعين",
"name_en": "Followers",
"services": [
{ "id": 21, "name": "متابعين انستجرام", "name_en": "Instagram followers",
"price_per_1000": "1.80", "min_quantity": 100, "max_quantity": 10000 }
]
}
]
يطلب خدمة SMM. السعر = السعر لكل 1000 × الكمية ÷ 1000. حالة الطلب تتحدث تلقائيًا؛ تابعها من GET /v1/services/orders/{order_id}.
Orders an SMM service. Price = price per 1000 × quantity ÷ 1000. The order status updates automatically; follow it with GET /v1/services/orders/{order_id}.
curl -H "Authorization: Bearer YOUR_TOKEN" -X POST -H "Content-Type: application/json" \
-d '{"service_id":21,"link":"https://instagram.com/yourpage","quantity":500,"external_order_id":"shop-3001"}' \
http://fi16.bot-hosting.cloud:25538/v1/services/buy
{
"order_id": 12,
"order_code": "SMM-4H2K9QZ1",
"order_type": "service",
"service_id": 21,
"service_name": "متابعين انستجرام",
"service_name_en": "Instagram followers",
"link": "https://instagram.com/yourpage",
"quantity": 500,
"price": "0.90",
"status": "pending",
"external_order_id": "shop-3001",
"idempotent_replay": false
}
حالة طلب خدمة SMM اشتريتها. Status of an SMM service order you bought.
curl -H "Authorization: Bearer YOUR_TOKEN" \ http://fi16.bot-hosting.cloud:25538/v1/services/orders/12
كشف حركات رصيدك من الأحدث للأقدم (شحن deposit / مشتريات purchase / استرجاع refund / تسويات adjustment) مع الرصيد قبل وبعد كل حركة. المبالغ نصوص، والسالب = خصم. الإجمالي في X-Total-Count وX-Has-More. الحقل request_id يربط الحركة بالطلب الذي سبّبها. الحركات القديمة (قبل الإصدار 1.5) قد تكون ناقصة.
Your balance statement, newest first (deposit / purchase / refund / adjustment) with the balance before and after each entry. Amounts are strings; negative = debit. Total in X-Total-Count and X-Has-More. request_id links an entry to the request that caused it. Older entries (before v1.5) may be incomplete.
curl -H "Authorization: Bearer YOUR_TOKEN" \ "http://fi16.bot-hosting.cloud:25538/v1/transactions?limit=50"
[
{ "id": 905, "type": "purchase", "amount": "-1.50", "balance_before": "10.00",
"balance_after": "8.50", "request_id": "req_9de799b93459485f", "created_at": "2026-10-07T10:15:00+00:00" },
{ "id": 904, "type": "deposit", "amount": "10.00", "balance_before": "0.00",
"balance_after": "10.00", "request_id": null, "created_at": "2026-10-07T09:50:00+00:00" }
]
شبكات USDT المتاحة للشحن وعنوان المحفظة لكل شبكة، مع معدل التحويل إلى رصيد. Available USDT networks for top-up, the wallet address for each, and the credit rate.
curl -H "Authorization: Bearer YOUR_TOKEN" \ http://fi16.bot-hosting.cloud:25538/v1/deposit/networks
[
{ "network": "trc20", "label": "USDT · TRC20 (Tron)", "currency": "USDT",
"address": "T...", "credit_rate": "1.00" }
]
الخطوة الأولى في الشحن. أرسل الشبكة والمبلغ المطلوب (لحد رقمين عشريين)، فيعيد لك مبلغًا دقيقًا فريدًا (مثل 10.0089) وعنوان المحفظة. حوّل هذا المبلغ بالضبط بنفس الأرقام العشرية قبل expires_at، ثم استدعِ /v1/deposit/verify. هذا المبلغ هو ما يربط التحويل بحسابك، فلا يستطيع أحد غيرك استخدام تحويلك. الحد الأقصى 3 طلبات نشطة لكل شبكة. الأخطاء: INVALID_AMOUNT وAMOUNT_OUT_OF_RANGE (422)، TOO_MANY_PENDING_REQUESTS (429)، AMOUNT_BUSY (503).
Step 1 of a deposit. Send the network and the amount you want (up to 2 decimals) and you get back a unique exact amount (e.g. 10.0089) and the wallet address. Send exactly that amount, with the same decimals, before expires_at, then call /v1/deposit/verify. This amount is what ties the transfer to your account, so nobody else can claim your transaction. At most 3 active requests per network. Errors: INVALID_AMOUNT and AMOUNT_OUT_OF_RANGE (422), TOO_MANY_PENDING_REQUESTS (429), AMOUNT_BUSY (503).
curl -H "Authorization: Bearer YOUR_TOKEN" -X POST -H "Content-Type: application/json" \
-d '{"network":"trc20","amount":"10"}' \
http://fi16.bot-hosting.cloud:25538/v1/deposit/request
{
"request_id": 41,
"network": "trc20",
"address": "T...",
"amount_usdt": "10.0089",
"expires_at": 1760000000,
"expires_in": 3600
}
بعد أن تحوّل USDT إلى العنوان، أرسل الـ txid ليتحقق السيرفر من الشبكة ويضيف الرصيد (مع بونص الشحن إن وُجد). الـ txid هو مفتاح الـ idempotency: إعادته من نفس الحساب تعيد نفس النتيجة (idempotent_replay: true) دون شحن مرتين، واستخدامه من حساب آخر يعيد TXID_ALREADY_USED (409). يجب استدعاء /v1/deposit/request أولًا وتحويل المبلغ الدقيق الذي يعيده، وإلا يُرفض التحقق: NO_DEPOSIT_REQUEST وAMOUNT_MISMATCH وTX_BEFORE_REQUEST وREQUEST_EXPIRED (422). الأخطاء الأخرى: TX_NOT_VERIFIED (422) وVERIFICATION_UNAVAILABLE (503). كذلك DEPOSIT_REQUEST_ALREADY_USED (409): طلب الشحن استُهلك قبل كده، أنشئ طلبًا جديدًا. وCREDIT_FAILED (503): تم التحقق من التحويل لكن إضافة الرصيد فشلت، لا تحوّل مرة أخرى وتواصل مع الدعم برقم العملية (txid).
After sending USDT to the address, submit the txid so the server verifies it on-chain and credits your balance (plus the top-up bonus when applicable). The txid is the idempotency key: repeating it from the same account returns the same result (idempotent_replay: true) without crediting twice, and using it from another account returns TXID_ALREADY_USED (409). You must call /v1/deposit/request first and send the exact amount it returns, otherwise verification is rejected: NO_DEPOSIT_REQUEST, AMOUNT_MISMATCH, TX_BEFORE_REQUEST and REQUEST_EXPIRED (422). Other errors: TX_NOT_VERIFIED (422) and VERIFICATION_UNAVAILABLE (503). Also DEPOSIT_REQUEST_ALREADY_USED (409): the deposit request was already used, create a new one. And CREDIT_FAILED (503): the transfer was verified but crediting failed, do not transfer again and contact support with the txid.
curl -H "Authorization: Bearer YOUR_TOKEN" -X POST -H "Content-Type: application/json" \
-d '{"network":"trc20","txid":"<TRANSACTION_HASH>"}' \
http://fi16.bot-hosting.cloud:25538/v1/deposit/verify
{
"txid": "<TRANSACTION_HASH>",
"network": "trc20",
"amount_usdt": "10.00",
"credited": "10.00",
"bonus": "0.50",
"total_credited": "10.50",
"balance": "18.50",
"currency": "USD",
"idempotent_replay": false
}
🔔 الـ Webhooks 🔔 Webhooks
- من البوت فقط: الإعدادات ← 🔑 APIKEY ← 🔔 Webhook.
- ضع رابط HTTPS عامًا، وخذ السر
whsec_…لتوقيع الرسائل (وفيه زر «إرسال تجربة»). - الروابط الداخلية (localhost / شبكات خاصة) مرفوضة، والتحويلات (redirects) لا تُتبع.
- Bot only: Settings → 🔑 APIKEY → 🔔 Webhook.
- Set a public HTTPS URL and take the secret
whsec_…to sign messages (there is a “send test” button). - Internal URLs (localhost / private networks) are rejected and redirects are not followed.
كل إشعار هو JSON بهذا الشكل، مع الترويسات X-Webhook-Id وX-Webhook-Event وX-Webhook-Timestamp وX-Webhook-Signature:
Every notification is JSON in this shape, with the headers X-Webhook-Id, X-Webhook-Event, X-Webhook-Timestamp and X-Webhook-Signature:
{
"id": "evt_1042",
"event": "number.code_received",
"created_at": 1790000000,
"data": {
"order_id": 8841,
"order_type": "number",
"phone": "+15551234567",
"code": "123456",
"password": null,
"external_order_id": "shop-1042"
}
}
| event | متى يُرسلWhen it is sent |
|---|---|
| number.code_received |
وصل كود الرقم. الحقل data يحوي order_id وphone وcode (وأحيانًا password). يُراقَب الكود حتى 30 دقيقة من الشراء.
The number's code arrived. data has order_id, phone, code (and sometimes password). The code is watched for up to 30 minutes after purchase.
|
| order.status_changed |
تغيّرت حالة طلب (نجوم / بريميوم / جلسات / خدمات). data.order بنفس شكل GET /v1/orders وdata.previous_status الحالة السابقة.
An order's status changed (Stars / Premium / sessions / services). data.order has the same shape as GET /v1/orders and data.previous_status is the previous status.
|
| operation.resolved |
حُسمت عملية كانت ORDER_UNDER_REVIEW: data.state إمّا refunded (أُعيد الرصيد) أو done (تم التنفيذ)، مع external_order_id.
A previously ORDER_UNDER_REVIEW operation was settled: data.state is refunded (balance returned) or done (fulfilled), with external_order_id.
|
| webhook.test | رسالة تجربة من زر «إرسال تجربة» في البوت. A test message from the “send test” button in the bot. |
- احسب
HMAC-SHA256بالسر على النص{timestamp}.{raw_body}(الجسم الخام كما وصل). - قارنه بالقيمة بعد
sha256=فيX-Webhook-Signatureبمقارنة ثابتة الزمن. - ارفض الرسالة إن اختلف
X-Webhook-Timestampعن الوقت الحالي بأكثر من 5 دقائق.
- Compute
HMAC-SHA256with the secret over{timestamp}.{raw_body}(the raw body as received). - Compare it with the value after
sha256=inX-Webhook-Signatureusing a constant-time comparison. - Reject the message if
X-Webhook-Timestampdiffers from the current time by more than 5 minutes.
import hmac, hashlib, time
def verify(secret: str, headers, raw_body: bytes) -> bool:
ts = headers["X-Webhook-Timestamp"]
if abs(time.time() - int(ts)) > 300:
return False
mac = hmac.new(secret.encode(), ts.encode() + b"." + raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest("sha256=" + mac, headers["X-Webhook-Signature"])
- ردّ
2xxخلال 8 ثوانٍ = تم التسليم. - عند الفشل: 7 محاولات (10ث ← 30ث ← 2د ← 10د ← ساعة ← 6 ساعات)، وبعد 50 فشلًا متتاليًا يتوقف الـ webhook (فعّله من البوت).
- قد يصلك الإشعار أكثر من مرة وبترتيب مختلف، فاعتمد على
idلمنع التكرار. - الحالة:
GET /v1/webhook· السجل:GET /v1/webhook/deliveries
- Reply
2xxwithin 8 seconds = delivered. - On failure: 7 attempts (10s → 30s → 2m → 10m → 1h → 6h); after 50 consecutive failures the webhook is disabled (re-enable it from the bot).
- A notification may arrive more than once and out of order, so de-duplicate by
id. - State:
GET /v1/webhook· Log:GET /v1/webhook/deliveries
⚠️ شكل الأخطاء ورموزها ⚠️ Error Shape & Codes
أي خطأ يرجع دائمًا بنفس الشكل الموحّد التالي: Any error always comes back in this exact same shape:
{
"ok": false,
"error": {
"code": "INSUFFICIENT_BALANCE",
"message": "Required 1.50, available 0.30.",
"requestId": "req_9de799b93459485f",
"required": "1.50",
"balance": "0.30"
}
}
code
لأنه ثابت، وليس على
message
لأنه نص وصفي وقد يتغير.
أرسل requestId
عند التواصل مع الدعم (نفس القيمة تأتي أيضًا في الهيدر
X-Request-Id لكل رد).
Branch your integration logic on
code
because it is stable, not on
message
which may change.
Include requestId
when contacting support (the same value is also returned in the
X-Request-Id header of every response).
| HTTP | code | المعنى Meaning |
|---|---|---|
| 400 | COUNTRY_DISABLED | الدولة معطّلة The country is disabled |
| 400 | COUNTRY_UNAVAILABLE | الدولة غير متاحة حاليًا للشراء The country is not available to buy right now |
| 400 | PRICE_NOT_SET | لا يوجد سعر بيع محدد No selling price is set |
| 400 | INVALID_QUANTITY | كمية النجوم خارج المدى المسموح Stars quantity outside the allowed range |
| 400 | INVALID_DURATION | مدة البريميوم غير مدعومة (3/6/12) Unsupported premium duration (3/6/12) |
| 400 | INVALID_TARGET_USERNAME | يوزر المستلم غير صالح Invalid recipient username |
| 401 | INVALID_API_KEY | المفتاح مفقود أو غير صحيح Token missing or invalid |
| 402 | INSUFFICIENT_BALANCE | الرصيد غير كافٍ Insufficient balance |
| 403 | ACCOUNT_BANNED | الحساب محظور Account is banned |
| 403 | API_KEY_DISABLED | تم إيقاف مفتاح الـ API الخاص بك، تواصل مع الدعم Your API key has been disabled, please contact support |
| 403 | IP_NOT_ALLOWED |
المفتاح مقيّد بعناوين IP محددة وعنوان طلبك ليس منها (يظهر عنوانك في error.client_ip)
The key is restricted to specific IPs and your request IP is not one of them (shown in error.client_ip)
|
| 404 | COUNTRY_NOT_FOUND | كود الدولة غير موجود Unknown country code |
| 404 | ORDER_NOT_FOUND | الطلب غير موجود أو ليس ملكًا للتوكن Order not found or not owned by this token |
| 404 | CODE_NOT_ARRIVED | الكود لم يصل بعد The code has not arrived yet |
| 409 | EXTERNAL_ORDER_ID_REUSED | تم استخدام نفس external_order_id مع طلب مختلف Same external_order_id was used with a different request |
| 409 | COUNTRY_UNAVAILABLE | أصبحت الدولة غير متاحة أثناء الشراء ويُعاد الرصيد Country became unavailable during purchase and balance is refunded |
| 400 | LIMIT_REQUIRED |
المعامل limit إجباري في GET /v1/orders (من 1 إلى 200)،
مثال: /v1/orders?limit=50
The limit parameter is required on GET /v1/orders (1 to 200),
e.g. /v1/orders?limit=50
|
| 404 | PRODUCT_NOT_FOUND | المنتج غير موجود Product not found |
| 400 | PRODUCT_DISABLED | المنتج (أو تصنيفه) معطّل حاليًا The product (or its category) is currently disabled |
| 400 | PRODUCT_NOT_SUPPORTED | المنتج يدوي (بدون مخزون) ولا يُباع عبر الـ API The product is manual (no stock) and is not sold through the API |
| 409 | OUT_OF_STOCK | نفد مخزون المنتج؛ لم يُخصم أي رصيد The product is out of stock; your balance was not charged |
| 409 | ORDER_UNDER_REVIEW |
لم تتأكد النتيجة في الوقت المناسب؛ الرصيد لم يُعَد بعد والطلب تحت المراجعة.
نفس الرمز في الأرقام والنجوم والبريميوم، ويحمل error.order_id (إن وُجد طلب مسجّل)
و error.external_order_id.
لا تنشئ طلبًا جديدًا بمعرّف مختلف، بل أعد نفس الطلب (نفس external_order_id) لمعرفة الحالة.
The result was not confirmed in time; your balance has not been refunded yet and the order is under review.
Same code for numbers, Stars and Premium; it carries error.order_id (when an order was recorded)
and error.external_order_id.
Do not create a new order with a different id; repeat the same request (same external_order_id) to check its state.
|
| 409 | ORDER_CANCELLED | أُلغي الطلب من الأدمن ورُدّ رصيده Order cancelled by admin and refunded |
| 409 | CODE_NOT_STORED | لا يوجد كود محفوظ لهذا الطلب القديم No stored code for this older order |
| 422 | VALIDATION_ERROR | جسم الطلب ناقص أو غير صالح Request body is missing or invalid |
| 409 | ORDER_NOT_READY | حزمة الجلسات لم تجهز بعد The sessions package is not ready yet |
| 409 | TXID_ALREADY_USED | رقم العملية (txid) استُخدم من قبل This transaction id was already used |
| 409 | DEPOSIT_REQUEST_ALREADY_USED | طلب الشحن استُهلك قبل كده، أنشئ طلبًا جديدًا This deposit request was already used, create a new one |
| 422 | TX_NOT_VERIFIED | تعذّر التحقق من التحويل على الشبكة (غير موجود/غير مؤكد/مبلغ أو عنوان غير مطابق) The transfer could not be verified on-chain (not found / unconfirmed / wrong amount or address) |
| 400 | NETWORK_UNAVAILABLE | شبكة الشحن غير متاحة حاليًا This deposit network is not available right now |
| 429 | RATE_LIMIT_EXCEEDED | تجاوزت حدّ الطلبات Rate limit exceeded |
| 500 | ORDER_SAVE_FAILED |
خطأ أثناء حفظ الطلب؛ يُعاد الرصيد، إلا إذا كان الطلب قد نُفِّذ فعلًا فيُراجَع يدويًا
(يأتي الرمز مع pending_op_id)
Error saving the order; balance is refunded, unless it was already executed, in which case it is reviewed manually
(the response then carries pending_op_id)
|
| 500 | INTERNAL_ERROR | خطأ داخلي عام Generic internal error |
| 502 | PROVIDER_ERROR | رفض واضح للطلب ويُعاد الرصيد تلقائيًا Clear rejection of the order and balance is refunded automatically |
| 503 | CREDIT_FAILED | اتأكد التحويل لكن إضافة الرصيد فشلت. لا تحوّل مرة أخرى وتواصل مع الدعم برقم العملية Transfer verified but crediting failed. Do not transfer again, contact support with the txid |
| 503 | MAINTENANCE | الـ API متوقف مؤقتًا للصيانة، أعد المحاولة لاحقًا The API is temporarily stopped for maintenance, try again later |
| 503 | PURCHASES_PAUSED | الشراء متوقف مؤقتًا (أرقام / نجوم / بريميوم / جلسات). لم يُخصم أي رصيد، أعد المحاولة لاحقًا. القراءة (الأرصدة والطلبات) تعمل بشكل طبيعي Purchases (numbers / Stars / Premium / sessions) are temporarily paused. Nothing was charged, try again later. Reads (balance, orders) keep working |
- يُعاد تلقائيًا فقط عندما نتأكد أن الطلب لم يُنفَّذ (فشل قبل التنفيذ أو رفض واضح).
- غير ذلك (مهلة / خطأ في المعالجة / انقطاع):
409 ORDER_UNDER_REVIEWويبقى الرصيد مخصومًا حتى تتم المراجعة. - لا تنشئ طلبًا جديدًا: أعد نفس الطلب بنفس
external_order_idأو استخدمGET /v1/orders/by-external/{id}.
- Refunded automatically only when we are sure the order was not executed (failed before execution, or a clear rejection).
- Otherwise (timeout / processing error / dropped connection):
409 ORDER_UNDER_REVIEWand the balance stays charged until reviewed. - Do not create a new order: repeat the same request with the same
external_order_idor useGET /v1/orders/by-external/{id}.