RelySMS
API · بروتوكول handler_api.php

أرقام لاستقبال الرسائل — من برنامجك مباشرة

إن كان برنامجك يعمل مع خدمة تفعيل عبر handler_api.php، فسيعمل مع RelySMS: غيّر عنوان الخادم والمفتاح. الإجراءات نفسها والردود نفسها، بأسعارنا وسياسة الاسترداد لدينا.

https://relysms.pro/stubs/handler_api.php

بداية سريعة

  1. ادخل حسابك وافتح «الرصيد» → «API» → «إنشاء مفتاح». يظهر المفتاح مرة واحدة — احفظه.
  2. اشحن رصيدك إلى $20 أو أكثر: الشراء عبر API لا يتم إلا بهذا الرصيد. لا بأس بالاحتفاظ بالمفتاح ورصيدك صفر.
  3. اضبط في برنامجك الخادم https://relysms.pro/stubs/handler_api.php ومفتاحك بدلًا من مفتاح الخدمة السابقة.
  4. اشترِ رقمًا (getNumber) ثم استعلم عن الحالة كل 5–10 ثوانٍ (getStatus) حتى يصل STATUS_OK مع الرمز.
  5. أكمِل الطلب (setStatus=6). إن لم يصل رمز، ألغِه بعد دقيقتين (setStatus=8) أو انتظر انتهاء المهلة: يعود المال تلقائيًا.

القواعد والحدود

  • الشراء عبر API يتطلب رصيدًا لا يقل عن $20. دون ذلك يرد getNumber بـ NO_BALANCE، وتعمل بقية الطرق.
  • الرقم لك 20 دقيقة. إن لم يصل رمز يُغلق الطلب تلقائيًا ويعود المال إلى رصيدك.
  • يمكنك الإلغاء بعد 2 دقيقة من الشراء إن لم يصل رمز. يعود المال فورًا.
  • بعد وصول أول رمز يُعدّ الطلب مدفوعًا ولا يُسترد. ما دامت المهلة مفتوحة قد تصل رموز أخرى.
  • حتى 20 طلبًا و5 عمليات شراء في الثانية لكل مفتاح؛ وحتى 50 طلبًا مفتوحًا في الوقت نفسه.
  • يُثبَّت السعر لحظة الشراء. يمنعك maxPrice من الشراء فوق حدك.
  • تسري شروط الخدمة: يُمنع السبام والاحتيال والتسجيل الجماعي لهذه الأغراض.

الطرق

كل طلب هو GET أو POST إلى عنوان واحد، والمعاملات في سلسلة الاستعلام أو في جسم النموذج. يُرسل المفتاح في api_key والإجراء في action.

getBalance

رصيد الحساب بالدولار.

api_key وaction فقط.

GET https://relysms.pro/stubs/handler_api.php?api_key=KEY&action=getBalance

الرد

ACCESS_BALANCE:25.00

getNumber

شراء رقم لخدمة في دولة. يُخصم المبلغ فورًا ويُسترد إن لم يصل رمز. الرد: ACCESS_NUMBER:رقم_الطلب:الهاتف.

المعاملإلزاميالوصف
serviceنعمرمز الخدمة (getServicesList)، مثل tg.
countryنعمرمز الدولة (getCountries).
maxPriceلاأقصى سعر بالدولار. إن كان أغلى — WRONG_MAX_PRICE مع السعر الحالي دون خصم.
GET https://relysms.pro/stubs/handler_api.php?api_key=KEY&action=getNumber&service=tg&country=187&maxPrice=0.80

الرد

ACCESS_NUMBER:1042:15550001111

أخطاء محتملة: BAD_SERVICE, BAD_COUNTRY, NO_NUMBERS, NO_BALANCE, WRONG_MAX_PRICE:0.59, LIMIT_ACTIVATIONS, RATE_LIMIT, BANNED

getNumberV2

مثل getNumber، لكن الرد بصيغة JSON مع السعر وأوقات المهلة.

المعاملإلزاميالوصف
serviceنعمرمز الخدمة.
countryنعمرمز الدولة.
maxPriceلاأقصى سعر بالدولار.
GET https://relysms.pro/stubs/handler_api.php?api_key=KEY&action=getNumberV2&service=tg&country=187&maxPrice=0.80

الرد

{
  "activationId": 1042,
  "phoneNumber": "15550001111",
  "activationCost": 0.59,
  "countryCode": "187",
  "canGetAnotherSms": true,
  "activationTime": "2026-10-27T10:00:00.000Z",
  "activationEndTime": "2026-10-27T10:20:00.000Z"
}

أخطاء محتملة: BAD_SERVICE, BAD_COUNTRY, NO_NUMBERS, NO_BALANCE, WRONG_MAX_PRICE:0.59, LIMIT_ACTIVATIONS, RATE_LIMIT

getStatus

حالة الطلب: بانتظار الرمز، وصل الرمز (مع الرمز)، أو أُلغي.

المعاملإلزاميالوصف
idنعمرقم الطلب من getNumber.
GET https://relysms.pro/stubs/handler_api.php?api_key=KEY&action=getStatus&id=1042

الرد

STATUS_OK:48213

أخطاء محتملة: NO_ACTIVATION

setStatus

إجراء على الطلب: جاهز، رمز آخر، إكمال، إلغاء (انظر «الحالات»).

المعاملإلزاميالوصف
idنعمرقم الطلب.
statusنعم1 أو 3 أو 6 أو 8.
GET https://relysms.pro/stubs/handler_api.php?api_key=KEY&action=setStatus&id=1042&status=6

الرد

ACCESS_ACTIVATION

أخطاء محتملة: NO_ACTIVATION, BAD_STATUS, EARLY_CANCEL_DENIED, ERROR_SQL

getActiveActivations

كل الطلبات المفتوحة للمفتاح: الرقم والحالة والرموز والنصوص الواردة.

api_key وaction فقط.

GET https://relysms.pro/stubs/handler_api.php?api_key=KEY&action=getActiveActivations

الرد

{
  "status": "success",
  "activeActivations": [
    {
      "activationId": 1042,
      "serviceCode": "tg",
      "phoneNumber": "15550001111",
      "activationCost": 0.59,
      "activationStatus": "2",
      "smsCode": ["48213"],
      "smsText": ["Telegram code: 48213"],
      "activationTime": "2026-10-27T10:00:00.000Z",
      "countryCode": "187"
    }
  ]
}

getPrices

أسعارنا بالدولار وعدد تقريبي للأرقام. دون معاملات — كل ما هو معروض.

المعاملإلزاميالوصف
serviceلاهذه الخدمة فقط.
countryلاهذه الدولة فقط.
GET https://relysms.pro/stubs/handler_api.php?api_key=KEY&action=getPrices&service=tg&country=187

الرد

{ "187": { "tg": { "cost": 0.59, "count": 1000 } } }

أخطاء محتملة: BAD_SERVICE, BAD_COUNTRY

getCountries

قائمة الدول برموز البروتوكول وأسمائها بالروسية والإنجليزية.

api_key وaction فقط.

GET https://relysms.pro/stubs/handler_api.php?api_key=KEY&action=getCountries

الرد

{ "187": { "id": 187, "rus": "США", "eng": "United States", "visible": 1 } }

getServicesList

قائمة الخدمات برموز البروتوكول.

api_key وaction فقط.

GET https://relysms.pro/stubs/handler_api.php?api_key=KEY&action=getServicesList

الرد

{ "status": "success", "services": [{ "code": "tg", "name": "Telegram" }] }

الحالات

قيم status في setStatus:

  • status=1 → ACCESS_READY — أُدخل الرقم في الخدمة وننتظر الرمز. لا يغيّر شيئًا؛ باقٍ للتوافق.
  • status=3 → ACCESS_RETRY_GET — اطلب رمزًا آخر على الرقم نفسه — بعد الرمز الأول وما دام الطلب مفتوحًا. مجانًا. حتى يصل يجيب getStatus بـ STATUS_WAIT_RETRY.
  • status=6 → ACCESS_ACTIVATION — إكمال الطلب بعد الرمز. لن تصل رسائل جديدة إلى الرقم.
  • status=8 → ACCESS_CANCEL — إلغاء طلب بلا رمز (ليس قبل دقيقتين). يعود المال إلى رصيدك.

ردود getStatus:

  • STATUS_WAIT_CODE — لم يصل رمز بعد — اسأل مجددًا بعد 5–10 ثوانٍ.
  • STATUS_OK:48213 — وصل الرمز؛ بعد النقطتين الرمز نفسه (أو نص الرسالة إن خلت من رمز).
  • STATUS_WAIT_RETRY:48213 — طُلب رمز آخر ولم يصل بعد؛ بعد النقطتين الرمز السابق.
  • STATUS_CANCEL — أُلغي أو أُغلق بلا رمز؛ المال عاد إلى رصيدك.

الأخطاء

تصل الأخطاء نصًا كما هو معتاد في هذا البروتوكول. كلها، عدا RATE_LIMIT، بحالة 200.

NO_KEYلم يُرسل api_key.
BAD_KEYالمفتاح خاطئ أو موقوف، أو الحساب محظور.
BAD_ACTIONإجراء غير معروف.
BAD_SERVICEلا يوجد رمز خدمة كهذا.
BAD_COUNTRYلا يوجد رمز دولة كهذا.
NO_NUMBERSلا أرقام لهذا الزوج حاليًا؛ لم يُخصم شيء.
NO_BALANCEالرصيد أقل من $20 (حد API) أو أقل من سعر الرقم.
WRONG_MAX_PRICEالسعر أعلى من maxPrice؛ بعد النقطتين السعر الحالي.
LIMIT_ACTIVATIONSطلبات مفتوحة كثيرة — أكمِل بعضها أو ألغِه.
RATE_LIMITطلبات متكررة جدًا؛ HTTP 429. أعد المحاولة بعد ثانية.
BANNEDالحساب محظور — راسل الدعم.
NO_ACTIVATIONلا يوجد طلب بهذا الرقم لهذا المفتاح.
BAD_STATUSهذا الإجراء غير متاح للطلب الآن (مثل الإكمال دون رمز).
EARLY_CANCEL_DENIEDالإلغاء متاح بعد دقيقتين من الشراء.
ERROR_SQLخطأ مؤقت من جهتنا — أعد الطلب بعد دقيقة.

رموز الخدمات والدول

الرموز هي الرموز القياسية للبروتوكول: tg — Telegram، وwa — WhatsApp، وهكذا؛ والدولة 187 — الولايات المتحدة. يعيد getServicesList وgetCountries القوائم كاملة — خذ الرموز منها لا من جداول قديمة: الخدمات والدول تتغير مع التوفر.

REST API v1

الأرقام نفسها والقواعد نفسها كما في handler_api.php، لكن بصيغة JSON: الخدمات بالاسم (telegram)، والدول برمز ISO (US)، مع حالات HTTP ورموز أخطاء يسهل على البرنامج التفرع بها. استخدمها للشيفرة الجديدة، واترك handler_api.php للبرامج التي تستخدمه أصلًا.

https://relysms.pro/api/v1

المفتاح

أرسل المفتاح في ترويسة: Authorization: Bearer <المفتاح> (أو X-Api-Key: <المفتاح>). لا تضعه في الرابط أبدًا — الروابط تُسجَّل في السجلات. الحدود وعتبة $20 والكتالوج كما في handler_api.php.

إعادة المحاولة دون شراء مزدوج

أضف ترويسة Idempotency-Key بقيمة من عندك (UUID، حتى 255 حرفًا) إلى POST /orders و/orders/batch. إن انقطع الاتصال وأعدت الطلب بالمفتاح نفسه، يصلك الرد الأول (مع الترويسة Idempotent-Replayed: true) ولا يُشترى شيء مرتين. المفتاح نفسه مع محتوى مختلف يُرفض؛ والتكرار الذي يصل بينما الأول ما زال قيد التنفيذ يتلقى idempotency_in_progress. تُحفظ الردود الناجحة 24 ساعة؛ والشراء الفاشل لم يخصم شيئًا ويمكن إعادته بالمفتاح نفسه.

عدة أرقام دفعة واحدة

يشتري POST /orders/batch حتى 20 رقمًا لخدمة ودولة واحدة في طلب واحد — وهذه طريقة الشراء بأسرع من 5 في الثانية. تتم المشتريات واحدًا تلو الآخر؛ أول شراء يفشل يوقف الدفعة، ويضم الرد ما اشتُري والسبب في stoppedBy. إن لم يُشترَ شيء فالرد هو ذلك الخطأ نفسه.

الصفحات

يعيد GET /orders الأحدث أولًا. إن لم تكن قيمة next فارغة (null)، مرّرها في before لتحصل على الصفحة التالية.

Webhooks

بدلًا من الاستعلام عن GET /orders/{id} باستمرار، حدّد عنوان HTTPS عبر PUT /webhook وسنرسل إليه طلب POST عندما يحدث شيء لطلب اشتُري عبر API. يحمل المحتوى الطلب كما هو لحظة الإرسال. أجب بأي رمز 2xx خلال 10 ثوانٍ؛ قد يولّد الطلب الواحد عدة أحداث، وقد يصل الحدث نفسه مرتين بعد إعادة المحاولة، فاعتمد على معرّف التسليم.

  • order.code_received — وصل رمز (كل رمز جديد يرسل هذا الحدث مجددًا).
  • order.finished — اكتمل الطلب — بواسطتك أو عند انتهاء وقته بعد وصول رمز.
  • order.cancelled — أُلغي بلا رمز؛ عاد المال إلى الرصيد.
  • order.expired — انتهى الوقت بلا رمز؛ عاد المال إلى الرصيد.
  • ping — اختبار من POST /webhook/test؛ قيمة order هي null.
POST /relysms-hook HTTP/1.1
Content-Type: application/json
X-RelySMS-Event: order.code_received
X-RelySMS-Delivery: cm…
X-RelySMS-Signature: t=1793095272,v1=5f2b…

{
  "id": "cm…",
  "event": "order.code_received",
  "createdAt": "2026-10-27T10:01:12.000Z",
  "order": { "id": 1042, "status": "received", "codes": [{ "code": "48213", … }], … }
}

يحمل كل طلب الترويسة X-RelySMS-Signature: t=<وقت unix>,v1=<التوقيع>. التوقيع هو HMAC-SHA256 للسلسلة "t.body" (المحتوى الخام بايتًا بايتًا) بسرّ الـ webhook، بصيغة hex. تحقق منه ومن أن t لا يتجاوز 5 دقائق قبل الوثوق بالمحتوى.

Python

import hashlib, hmac, time

def verify(secret: str, body: bytes, header: str, tolerance=300) -> bool:
    parts = dict(p.split("=", 1) for p in header.split(","))
    t, sig = parts.get("t", ""), parts.get("v1", "")
    if not t.isdigit() or abs(time.time() - int(t)) > tolerance:
        return False
    expected = hmac.new(secret.encode(), f"{t}.".encode() + body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, sig)

Node.js

import { createHmac, timingSafeEqual } from "node:crypto";

export function verify(secret, rawBody, header, tolerance = 300) {
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=", 2)));
  const t = Number(parts.t);
  if (!Number.isInteger(t) || Math.abs(Date.now() / 1000 - t) > tolerance) return false;
  const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
  return expected.length === parts.v1?.length && timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}

إن لم يُجب خادمك بـ 2xx نعيد المحاولة بعد 10 ثوانٍ ودقيقة و5 دقائق و30 دقيقة وساعتين و6 ساعات — 7 محاولات في المجموع — ثم نتوقف. يعرض GET /webhook/deliveries ما أُرسل وما فشل.

نقاط الوصول

GET /balance

الرصيد بالدولار، وهل يكفي للشراء عبر API.

curl -H "Authorization: Bearer $KEY" https://relysms.pro/api/v1/balance

الرد

{ "balance": 25, "currency": "USD", "canBuy": true, "apiMinimum": 20 }

GET /services

كل الخدمات المعروضة: معرّفنا والاسم ورمز handler_api.php.

المعاملإلزاميالوصف
lang queryلالغة الأسماء: en (افتراضي)، ru، uk، zh، es، pt، id، vi، tr، ar، fr.
curl -H "Authorization: Bearer $KEY" "https://relysms.pro/api/v1/services?lang=en"

الرد

{ "services": [{ "id": "telegram", "name": "Telegram", "protocolCode": "tg" }] }

GET /countries

كل الدول المعروضة: رمز ISO والاسم ورمز handler_api.php.

المعاملإلزاميالوصف
lang queryلالغة الأسماء: en (افتراضي)، ru، uk، zh، es، pt، id، vi، tr، ar، fr.
curl -H "Authorization: Bearer $KEY" "https://relysms.pro/api/v1/countries?lang=en"

الرد

{ "countries": [{ "id": "US", "name": "United States", "protocolCode": 187 }] }

GET /prices

أسعارنا بالدولار وعدد تقريبي للأرقام. دون معاملات — كل ما هو معروض.

المعاملإلزاميالوصف
service queryلامعرّف الخدمة من /services، مثل telegram.
country queryلارمز ISO للدولة من /countries، مثل US.
curl -H "Authorization: Bearer $KEY" "https://relysms.pro/api/v1/prices?service=telegram"

الرد

{ "prices": [{ "service": "telegram", "country": "US", "price": 0.59, "stock": 1000 }] }

أخطاء محتملة: unknown_service, unknown_country

POST /orders

شراء رقم. يُخصم المبلغ فورًا ويُسترد إن لم يصل رمز.

المعاملإلزاميالوصف
service bodyنعممعرّف الخدمة من /services، مثل telegram.
country bodyنعمرمز ISO للدولة من /countries، مثل US.
maxPrice bodyلاأقصى سعر بالدولار، رقمًا. إن تجاوزه — price_above_max مع السعر الحالي دون خصم.
curl -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -H "Idempotency-Key: 7c1f0e2a-run-1" \
  -d '{"service":"telegram","country":"US","maxPrice":0.8}' \
  https://relysms.pro/api/v1/orders

الرد

{
  "order": {
    "id": 1042,
    "service": "telegram",
    "country": "US",
    "phone": "15550001111",
    "price": 0.59,
    "status": "waiting",
    "refunded": false,
    "codes": [],
    "awaitingAnotherCode": false,
    "createdAt": "2026-10-27T10:00:00.000Z",
    "expiresAt": "2026-10-27T10:20:00.000Z",
    "cancelableAt": "2026-10-27T10:02:00.000Z"
  }
}

أخطاء محتملة: bad_request, unknown_service, unknown_country, no_numbers, insufficient_balance, below_api_minimum, price_above_max, too_many_open_orders, buying_too_fast, idempotency_key_reused, idempotency_in_progress

POST /orders/batch

شراء حتى 20 رقمًا لخدمة ودولة واحدة في طلب واحد.

المعاملإلزاميالوصف
service bodyنعممعرّف الخدمة من /services، مثل telegram.
country bodyنعمرمز ISO للدولة من /countries، مثل US.
quantity bodyنعمعدد الأرقام، من 1 إلى 20.
maxPrice bodyلاأقصى سعر بالدولار، رقمًا. إن تجاوزه — price_above_max مع السعر الحالي دون خصم.
curl -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -H "Idempotency-Key: 7c1f0e2a-batch-1" \
  -d '{"service":"telegram","country":"US","quantity":5}' \
  https://relysms.pro/api/v1/orders/batch

الرد

{
  "orders": [{ "id": 1043, "phone": "15550001112", … }, { "id": 1044, … }],
  "requested": 5,
  "placed": 2,
  "stoppedBy": { "code": "no_numbers", "message": "…" }
}

أخطاء محتملة: bad_request, unknown_service, unknown_country, no_numbers, insufficient_balance, below_api_minimum, price_above_max, too_many_open_orders, buying_too_fast, idempotency_key_reused, idempotency_in_progress

GET /orders

طلباتك، الأحدث أولًا: المفتوحة افتراضيًا، أو الكل.

المعاملإلزاميالوصف
status queryلاopen (افتراضي) — بانتظار الرمز أو وصلها رمز؛ all — كل الطلبات.
limit queryلاعدد الطلبات في الصفحة، من 1 إلى 100 (افتراضيًا 50).
before queryلاقيمة next من الصفحة السابقة.
curl -H "Authorization: Bearer $KEY" "https://relysms.pro/api/v1/orders?status=all&limit=50"

الرد

{ "orders": [{ "id": 1042, … }], "next": "1001" }

أخطاء محتملة: bad_request

GET /orders/{id}

طلب واحد مع رموزه. استعلم كل 5–10 ثوانٍ ما دامت الحالة waiting.

المعاملإلزاميالوصف
id pathنعممعرّف الطلب من رد الشراء.
curl -H "Authorization: Bearer $KEY" https://relysms.pro/api/v1/orders/1042

الرد

{
  "order": {
    "id": 1042,
    "status": "received",
    "codes": [{ "code": "48213", "text": "Telegram code: 48213", "receivedAt": "2026-10-27T10:01:12.000Z" }],
    …
  }
}

أخطاء محتملة: not_found

POST /orders/{id}/finish

إكمال طلب وصله رمز. لن يستقبل الرقم رسائل أخرى. التكرار لا يضر.

المعاملإلزاميالوصف
id pathنعممعرّف الطلب من رد الشراء.
curl -X POST -H "Authorization: Bearer $KEY" https://relysms.pro/api/v1/orders/1042/finish

الرد

{ "order": { "id": 1042, "status": "finished", … } }

أخطاء محتملة: not_found, invalid_state

POST /orders/{id}/another-code

رمز آخر على الرقم نفسه — بعد الرمز الأول وما دام الطلب مفتوحًا. مجانًا. حتى يصل يكون في الطلب awaitingAnotherCode = true.

المعاملإلزاميالوصف
id pathنعممعرّف الطلب من رد الشراء.
curl -X POST -H "Authorization: Bearer $KEY" https://relysms.pro/api/v1/orders/1042/another-code

الرد

{ "order": { "id": 1042, "status": "received", "awaitingAnotherCode": true, … } }

أخطاء محتملة: not_found, invalid_state, try_later

POST /orders/{id}/cancel

إلغاء طلب بلا رمز، بعد دقيقتين من الشراء. يعود المال فورًا.

المعاملإلزاميالوصف
id pathنعممعرّف الطلب من رد الشراء.
curl -X POST -H "Authorization: Bearer $KEY" https://relysms.pro/api/v1/orders/1042/cancel

الرد

{ "order": { "id": 1042, "status": "cancelled", "refunded": true, … } }

أخطاء محتملة: not_found, invalid_state, too_early_to_cancel

GET /webhook

عنوان الـ webhook وسرّ التوقيع، أو null.

curl -H "Authorization: Bearer $KEY" https://relysms.pro/api/v1/webhook

الرد

{ "webhook": { "url": "https://example.com/relysms-hook", "secret": "whsec_…", "createdAt": "2026-10-27T10:00:00.000Z" } }

PUT /webhook

تحديد العنوان أو تغييره. يُنشأ السر مرة واحدة ويُحفظ؛ ويُنشئ rotateSecret سرًا جديدًا.

المعاملإلزاميالوصف
url bodyنعمعنوان HTTPS لخادمك. تُرفض العناوين الخاصة والمحلية.
rotateSecret bodyلاtrue — إنشاء سرّ توقيع جديد.
curl -X PUT -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/relysms-hook"}' \
  https://relysms.pro/api/v1/webhook

الرد

{ "webhook": { "url": "https://example.com/relysms-hook", "secret": "whsec_…", "createdAt": "2026-10-27T10:00:00.000Z" } }

أخطاء محتملة: bad_request, invalid_webhook_url

DELETE /webhook

حذف الـ webhook. تُهمل الأحداث التي لم تُرسل بعد.

curl -X DELETE -H "Authorization: Bearer $KEY" https://relysms.pro/api/v1/webhook

الرد

{ "webhook": null }

POST /webhook/test

إرسال حدث ping للتحقق من العنوان والتوقيع.

curl -X POST -H "Authorization: Bearer $KEY" https://relysms.pro/api/v1/webhook/test

الرد

{ "delivery": { "id": "cm…" } }

أخطاء محتملة: not_found

GET /webhook/deliveries

آخر 20 تسليمًا: الحدث والحالة والمحاولات وآخر رد من خادمك.

curl -H "Authorization: Bearer $KEY" https://relysms.pro/api/v1/webhook/deliveries

الرد

{
  "deliveries": [{
    "id": "cm…", "event": "order.code_received", "orderId": 1042,
    "status": "pending", "attempts": 2, "lastHttpStatus": 502, "lastError": "HTTP 502",
    "createdAt": "2026-10-27T10:01:12.000Z", "deliveredAt": null, "nextAttemptAt": "2026-10-27T10:02:22.000Z"
  }]
}

حالات الطلب

حقل status في الطلب:

  • waiting — الرقم لك ولم يصل رمز بعد.
  • received — وصل رمز، وهو في codes. قد تصل رموز أخرى ما دام الطلب مفتوحًا.
  • finished — أكملت الطلب (أو انتهى وقته بعد وصول رمز).
  • cancelled — أُلغي بلا رمز؛ refunded قيمته true والمال في رصيدك.
  • expired — انتهى الوقت بلا رمز؛ عاد المال إلى رصيدك.

الأخطاء

الخطأ حالة HTTP مع JSON فيه code ليتفرع به البرنامج وmessage للبشر. بعضها يحمل حقولًا إضافية (price، cancelableAt، apiMinimum).

{ "error": { "code": "price_above_max", "message": "The price is above maxPrice.", "price": 0.59 } }
missing_key401لا يوجد مفتاح في Authorization أو X-Api-Key.
invalid_key401المفتاح خاطئ أو استُبدل، أو الحساب محظور.
bad_request400خطأ في المحتوى أو أحد المعاملات؛ يوضح message موضعه.
unknown_service400لا يوجد معرّف خدمة كهذا.
unknown_country400لا يوجد رمز دولة كهذا.
idempotency_key_invalid400Idempotency-Key فارغ أو أطول من 255 حرفًا.
invalid_webhook_url400عنوان الـ webhook ليس HTTPS أو ليس رابطًا أو يشير إلى خادم خاص أو محلي.
insufficient_balance402الرصيد أقل من السعر.
below_api_minimum402الرصيد أقل من $20 — لا تشتري API إلا من $20.
account_blocked403الحساب محظور — راسل الدعم.
not_found404لا يوجد طلب بهذا المعرّف لهذا المفتاح.
no_numbers409لا أرقام لهذا الزوج حاليًا؛ لم يُخصم شيء.
price_above_max409السعر أعلى من maxPrice؛ السعر الحالي في price.
too_many_open_orders409طلبات مفتوحة كثيرة — أكمِل بعضها أو ألغِه.
invalid_state409غير ممكن في هذه الحالة (مثل الإكمال دون رمز).
too_early_to_cancel409الإلغاء متاح من cancelableAt، بعد دقيقتين من الشراء.
idempotency_in_progress409طلب بهذا Idempotency-Key ما زال قيد التنفيذ؛ أعد المحاولة بعد لحظة.
idempotency_key_reused422استُخدم هذا Idempotency-Key لطلب آخر.
rate_limited429أكثر من 20 طلبًا في الثانية؛ يخبرك Retry-After متى تعيد المحاولة.
buying_too_fast429أكثر من 5 عمليات شراء في الثانية؛ استخدم /orders/batch.
try_later503تعذّر مؤقتًا — حاول بعد دقيقة.

أمثلة REST

شراء رقم، انتظار الرمز، إكمال الطلب.

Python

import time, uuid, requests

BASE = "https://relysms.pro/api/v1"
S = requests.Session()
S.headers["Authorization"] = "Bearer rs_your_key"

r = S.post(f"{BASE}/orders",
           json={"service": "telegram", "country": "US", "maxPrice": 0.8},
           headers={"Idempotency-Key": str(uuid.uuid4())}, timeout=30)
if r.status_code != 201:
    raise SystemExit(r.json()["error"])   # no_numbers, below_api_minimum, …
order = r.json()["order"]
print("number:", order["phone"])

while order["status"] == "waiting":       # up to 20 minutes
    time.sleep(10)
    order = S.get(f"{BASE}/orders/{order['id']}", timeout=30).json()["order"]

if order["status"] == "received":
    print("code:", order["codes"][-1]["code"])
    S.post(f"{BASE}/orders/{order['id']}/finish", timeout=30)
# "expired" or "cancelled": the money is back on the balance

Node.js

const BASE = "https://relysms.pro/api/v1";
const headers = { Authorization: "Bearer rs_your_key", "Content-Type": "application/json" };

const res = await fetch(`${BASE}/orders`, {
  method: "POST",
  headers: { ...headers, "Idempotency-Key": crypto.randomUUID() },
  body: JSON.stringify({ service: "telegram", country: "US", maxPrice: 0.8 }),
});
if (res.status !== 201) throw new Error((await res.json()).error.code);
let { order } = await res.json();
console.log("number:", order.phone);

while (order.status === "waiting") {
  await new Promise((r) => setTimeout(r, 10_000));
  ({ order } = await (await fetch(`${BASE}/orders/${order.id}`, { headers })).json());
}
if (order.status === "received") {
  console.log("code:", order.codes.at(-1).code);
  await fetch(`${BASE}/orders/${order.id}/finish`, { method: "POST", headers });
}

أمثلة

الدورة كاملة: شراء رقم، انتظار الرمز، إكمال الطلب.

curl

KEY=rs_your_key
BASE=https://relysms.pro/stubs/handler_api.php

curl "$BASE?api_key=$KEY&action=getBalance"
curl "$BASE?api_key=$KEY&action=getNumber&service=tg&country=187&maxPrice=0.80"
# → ACCESS_NUMBER:1042:15550001111
curl "$BASE?api_key=$KEY&action=getStatus&id=1042"
# → STATUS_WAIT_CODE … then STATUS_OK:48213
curl "$BASE?api_key=$KEY&action=setStatus&id=1042&status=6"

Python

import time, requests

BASE = "https://relysms.pro/stubs/handler_api.php"
KEY = "rs_your_key"

def call(action, **params):
    r = requests.get(BASE, params={"api_key": KEY, "action": action, **params}, timeout=30)
    r.raise_for_status()
    return r.text

answer = call("getNumber", service="tg", country="187", maxPrice="0.80")
if not answer.startswith("ACCESS_NUMBER"):
    raise SystemExit(answer)          # NO_NUMBERS, NO_BALANCE, …
_, order_id, phone = answer.split(":")
print("number:", phone)

for _ in range(120):                  # up to 20 minutes, every 10 s
    status = call("getStatus", id=order_id)
    if status.startswith("STATUS_OK:"):
        print("code:", status.split(":", 1)[1])
        call("setStatus", id=order_id, status=6)
        break
    if status == "STATUS_CANCEL":
        break                         # refunded automatically
    time.sleep(10)

Node.js

const BASE = "https://relysms.pro/stubs/handler_api.php";
const KEY = "rs_your_key";

async function call(action, params = {}) {
  const url = new URL(BASE);
  url.search = new URLSearchParams({ api_key: KEY, action, ...params });
  const res = await fetch(url);
  return res.text();
}

const answer = await call("getNumber", { service: "tg", country: "187", maxPrice: "0.80" });
if (!answer.startsWith("ACCESS_NUMBER")) throw new Error(answer);
const [, id, phone] = answer.split(":");
console.log("number:", phone);

for (let i = 0; i < 120; i++) {
  const status = await call("getStatus", { id });
  if (status.startsWith("STATUS_OK:")) {
    console.log("code:", status.slice("STATUS_OK:".length));
    await call("setStatus", { id, status: "6" });
    break;
  }
  if (status === "STATUS_CANCEL") break; // refunded automatically
  await new Promise((r) => setTimeout(r, 10_000));
}

أسئلة

برنامجي كان يعمل مع خدمة تفعيل أخرى. ماذا أغيّر؟

عنوان الخادم إلى https://relysms.pro/stubs/handler_api.php، والمفتاح إلى مفتاحك من الحساب. رموز الخدمات والدول تبقى كما هي.

لماذا NO_BALANCE ولديّ رصيد؟

الشراء عبر API يتطلب رصيدًا من $20 فأكثر. لا يوجد هذا الحد في الحساب ولا في Mini App.

ماذا يحدث للمال إن لم يصل الرمز؟

يعود إلى رصيدك تلقائيًا عند انتهاء المهلة، أو فورًا إن ألغيت بعد دقيقتين.

هل يمكنني تلقي رمز ثانٍ على الرقم نفسه؟

نعم ما دامت المهلة مفتوحة: setStatus=3 ثم getStatus مجددًا.

هل يوجد وضع تجريبي؟

لا: كل عمليات الشراء حقيقية. ابدأ بزوج رخيص وجرّب سير العمل على رقم واحد.

تسرّب مفتاحي. ماذا أفعل؟

الحساب ← «الرصيد» ← «API» ← «إصدار مفتاح جديد». يتوقف القديم فورًا.

لمساعدي الذكاء الاصطناعي

التوثيق الكامل نصًا واحدًا لـ ChatGPT وClaude وغيرهما في /ar/developers.md، وخريطة مختصرة في /llms.txt. أعطِ النموذج الرابط واطلب منه ربط RelySMS بشيفرتك.

اقرأ https://relysms.pro/ar/developers.md واربط RelySMS بسكربتي.

developers.md · llms.txt