تتبع كل الأخطاء RFC 7807. جسم الاستجابة بصيغة application/problem+json يحوي الحقول type وtitle وstatus وdetail وrequest_id واختيارياً reason أو errors[].
{
"type": "https://www.kernelhost.com/en/reseller-api/errors/payment_required",
"title": "Payment required",
"status": 402,
"detail": "The order could not be paid.",
"request_id": "01HX7Z3K8Q...",
"reason": "insufficient_credit_and_no_card"
}
| HTTP | type | المعنى |
|---|---|---|
| 400 | validation_failed | فشل التحقق من المدخلات. راجع errors[] لتفاصيل كل حقل. |
| 401 | auth_failed | فشلت المصادقة. يوضح reason السبب: missing_headers، bad_key، bad_timestamp، timestamp_out_of_window، bad_nonce، bad_signature، signature_mismatch، replay_detected، unknown_or_locked_key، ip_not_allowed. |
| 402 | payment_required | مطلوب الدفع. راجع reason أدناه. |
| 403 | forbidden_scope | الإذن مفقود. reason: missing_scope. |
| 404 | not_found | المورد غير موجود أو غير مرئي لهذا المفتاح (يمنع تعداد المستأجرين). |
| 409 | idempotency_conflict | Idempotency-Key مُستخدَم من قبل بجسم مختلف. |
| 429 | rate_limited | تم تجاوز حد المعدل. التزم بترويسة Retry-After. |
| 500 | internal_error | خطأ داخلي في الخادم. قدّم request_id للربط مع سجل التدقيق عند التواصل مع الدعم. |
أسباب الطلب الدفعي (HTTP 402)
حين يتعذّر دفع الطلبية، تُعيد الواجهة HTTP 402 مع reason قابل للقراءة آلياً في جسم JSON.
insufficient_credit_and_no_card(الرصيد غير كافٍ ولا توجد بطاقة محفوظة. الحل: شحن الرصيد أو إضافة بطاقة في بوابة العملاء.)card_declined(رُفضت البطاقة من قِبل البنك أو البوابة. الحل: تجربة بطاقة أخرى أو التواصل مع البنك.)card_expired(البطاقة منتهية الصلاحية. الحل: إضافة بطاقة جديدة في بوابة العملاء.)client_not_found(معرّف الحساب غير موجود (لا يحدث عملياً تقريباً، تواصل مع الدعم).)

