ف فواترا

جدول الأخطاء

كل خطأ يعود بنفس الشكل، مع error.type ثابت يمكن لنظامك الاعتماد عليه برمجيًا:

{
  "error": {
    "type": "quota_exceeded",
    "message": "رسالة عربية صالحة للعرض للمستخدم النهائي",
    "...": "حقول إضافية حسب نوع الخطأ"
  }
}
اعتمد على error.type في منطق الكود، واستخدم error.message للعرض فقط — قد نحسّن صياغة الرسائل دون إشعار، أما الأنواع فمستقرّة داخل الإصدار v1.

401 — المصادقة

typeالسببالحل
missing_api_keyترويسة Authorization غائبة.أضف Bearer <KEY>.
invalid_api_keyالمفتاح غير معروف.تحقّق من النسخ ومن البيئة الصحيحة.
revoked_api_keyأُبطل المفتاح.أنشئ مفتاحًا جديدًا.
expired_api_keyانتهت صلاحيته.أنشئ مفتاحًا جديدًا.
account_not_foundالحساب المرتبط محذوف.تواصل مع الدعم.

402 — الاشتراك والحصة

typeالسببحقول إضافية
quota_exceededنفاد حصة الفواتير الشهرية.plan, quota, used, period, upgrade_url
subscription_inactiveالاشتراك متأخّر أو انتهى أمده — الإرسال على البيئة الحقيقية موقوف حتى تأكيد دفع فاتورة الاشتراك. بيئة الاختبار تبقى عاملة.plan, billing_url, period_end

403 — الصلاحيات

typeالسببحقول إضافية
insufficient_scopeالمفتاح لا يملك الصلاحية.required_scope, granted_scopes
plan_limitالميزة غير متاحة في خطتك (مثل الـ Webhooks).upgrade_url
account_suspendedإيقاف إداري للحساب.—

404 — غير موجود

typeالسبب
invoice_not_foundلا فاتورة بهذا المعرّف في حسابك. تذكّر أن الفواتير معزولة بين الوضعين.
webhook_not_foundنقطة الـ Webhook غير موجودة.
qr_unavailableالفاتورة لم تُقبل بعد، فلا رمز QR لها.
not_foundالمسار غير صحيح — راجع العنوان الأساسي /v1/….

409 — تعارض

typeالسببحقول إضافية
duplicate_invoice_numberرقم الفاتورة مُستخدم في الوضع نفسه.existing_invoice_id
jofotara_credentials_missingمفتاح live دون ضبط Client-Id/Secret-Key.invoice_id
already_acceptedretry على فاتورة مقبولة.—
too_many_attemptsتجاوز 10 محاولات إرسال للفاتورة.—
already_paidفاتورة اشتراك مدفوعة مسبقًا.—

422 — التحقّق

الحقل error.fields خريطة: مسار الحقل ← قائمة رسائل. مسارات البنود بالشكل lines.0.unit_price.

{
  "error": {
    "type": "validation_error",
    "message": "بيانات الطلب غير صحيحة.",
    "fields": {
      "invoice_number": ["هذا الحقل مطلوب."],
      "customer.name": ["اسم المشتري مطلوب."],
      "lines.1.quantity": ["الكمية يجب أن تكون رقمًا أكبر من صفر."],
      "lines.2.discount": ["الخصم أكبر من قيمة البند."]
    }
  }
}

429 — حدّ الطلبات

rate_limited مع ترويسة Retry-After. راجع حدود الاستخدام.

أخطاء البوابة

هذه لا تأتي كرمز HTTP من طرفنا، بل في الحقل data.error مع status يساوي rejected أو error ورمز 202:

typeالمعنىالإجراء
jofotara_rejectedرفضت البوابة المستند؛ الرسالة تحمل تفاصيلها الحرفية.صحّح البيانات وأصدر فاتورة برقم جديد.
jofotara_unauthorizedالبوابة رفضت Client-Id/Secret-Key.حدّث بيانات الاعتماد من الإعدادات.
jofotara_unreachableانقطاع شبكة أو تعطّل مؤقّت للبوابة.retry بعد فترة.

500 / 503

typeالإجراء
internal_errorأعد المحاولة بتدرّج أُسّي بنفس Idempotency-Key. إن تكرّر، راسل الدعم بالوقت والمسار.