الأخطاء ورموز حالة HTTP
تستخدم أخطاء التطبيق application/problem+json (RFC 9457). ابنِ منطقك على الحقلين الثابتين code وaction، لا على النص المقروء في detail. في أخطاء التحقق، يحتوي errors على مؤشرات JSON Pointer للحقول المعنية. اذكر request_id عند التواصل مع فريق الدعم. عند أعطال الوكيل أو النقل قد يختلف جسم الاستجابة، لذا تحقّق من Content-Type قبل تحليل JSON.
يوضّح مثال 422 التالي، المُعدّ للتوضيح، صيغة بريد إلكتروني غير صالحة اكتُشفت قبل الخصم. يسرد فهرس الأخطاء العام جميع الرموز والحالات والشروح والإجراءات المقترحة.
| حالة HTTP | المعنى المعتاد | الخطوة التالية |
|---|---|---|
| 400 / 413 / 415 | JSON غير صالح، أو جسم كبير جدًا، أو نوع وسائط غير مدعوم. | صحّح الطلب. |
| 401 / 403 | رُفض الوصول، أو قيد على الحساب، أو أرصدة غير كافية. | افحص code؛ ثم صحّح الوصول، أو اشحن الأرصدة، أو انتظر تجديد التجربة حسب عنوان IP. |
| 422 | مُدخل غير صالح أو خيارات غير متوافقة. | صحّح الحقول المذكورة في errors. |
| 404 / 405 | مسار غير معروف أو طريقة HTTP غير مدعومة. | تحقّق من مسار نقطة النهاية ومن ترويسة الاستجابة Allow. |
| 429 | حد لمعدل الطلبات أو للعمليات المتزامنة. | انتظر المدة المحددة في Retry-After قبل إرسال طلب آخر. |
| 500 | عطل غير متوقع في الخادم. | تواصل مع فريق الدعم مع ذكر request_id؛ وتحقّق من الخصم قبل إعادة المحاولة. |
| 502 / 503 / 504 | عطل لدى مزوّد الخدمة أو في إحدى التبعيات أو في الخصم، أو انتهاء المهلة. | افحص code وaction وbilling_status قبل إعادة المحاولة. |
{
"type": "urn:genderapi:problem:validation_error",
"title": "validation error",
"status": 422,
"detail": "A valid email address is required.",
"instance": "urn:uuid:11111111-1111-4111-8111-111111111111",
"code": "validation_error",
"request_id": "11111111-1111-4111-8111-111111111111",
"documentation": "https://api.genderapi.io/api/v2/errors",
"action": "correct_request",
"errors": [
{
"pointer": "/value",
"message": "Invalid email address."
}
],
"meta": {
"request_id": "11111111-1111-4111-8111-111111111111",
"duration_ms": 12,
"access": {
"mode": "ip_trial",
"reason": "api_key_missing"
},
"usage": {
"charged_credits": 0,
"remaining_credits": null,
"billing_status": "not_charged",
"resets_at": "2026-09-26T12:00:00.000Z",
"limit": 10,
"period_seconds": 86400
}
}
}حقول استجابة الخطأ
| الحقل | النوع | يمكن أن يكون null | مثال | الوصف |
|---|---|---|---|---|
type | string | لا | "urn:genderapi:problem:validation_error" | URI يحدد نوع المشكلة. |
title | string | لا | "validation error" | عنوان قصير للخطأ يسهل على الإنسان قراءته. |
status | integer | لا | 422 | رمز حالة HTTP. |
detail | string | لا | "The request does not match the schema." | شرح لهذا الخطأ تحديدًا. |
instance | string | لا | "urn:uuid:550e8400-e29b-41d4-a716-446655440000" | معرّف الطلب الفاشل. |
code | string | لا | "validation_error" | رمز خطأ ثابت قابل للقراءة آليًا. |
request_id | string | لا | "550e8400-e29b-41d4-a716-446655440000" | معرّف فريد لمحاولة HTTP هذه؛ ويُرسل أيضًا في X-Request-ID. |
documentation | string | لا | "https://api.genderapi.io/api/v2/errors" | رابط إلى فهرس الأخطاء، إن وُجد. |
action | string | لا | "correct_request" | إجراء التصحيح المقترح، إن كان محددًا في فهرس الأخطاء. |
errors | array<object> | لا | [{"pointer":"/value","message":"must NOT have fewer than 1 characters"}] | مشكلات التحقق، إن توفرت. يحتوي كل عنصر على pointer وmessage. |
errors[].pointer | string | لا | "/value" | JSON Pointer يحدد المُدخل غير الصالح. |
errors[].message | string | لا | "must NOT have fewer than 1 characters" | شرح لمشكلة التحقق. |
البيانات الوصفية للوصول والخصم والطلب
| الحقل | النوع | يمكن أن يكون null | مثال | الوصف |
|---|---|---|---|---|
meta.request_id | string | لا | "550e8400-e29b-41d4-a716-446655440000" | معرّف فريد لمحاولة HTTP هذه؛ ويُرسل أيضًا في X-Request-ID. |
meta.duration_ms | integer | لا | 42 | مدة معالجة الطلب بالمللي ثانية. |
meta.access.mode | string | لا | "api_key" | api_key أو ip_trial أو unauthenticated. عند استخدام حساب مدفوع، تحقّق من ظهور api_key. |
meta.access.reason | string | نعم | null | سبب الانتقال إلى التجربة حسب عنوان IP: api_key_missing أو api_key_invalid أو api_key_not_found؛ وإلا null. |
meta.usage.charged_credits | integer | نعم | 1 | صافي الأرصدة المخصومة. صفر قبل الخصم أو بعد استرداد كامل مؤكد؛ وnull إذا لم يُؤكَّد الخصم. |
meta.usage.remaining_credits | integer | نعم | 99 | الرصيد عند اكتمال العملية. قد يكون سالبًا؛ وnull إذا لم يتوفر أو لم يُؤكَّد الخصم. |
meta.usage.billing_status | string | لا | "confirmed" | not_charged أو confirmed أو unconfirmed. تحقّق منه قبل إعادة محاولة تقدير فاشل. |
meta.usage.resets_at | string | نعم | "2026-09-27T12:00:00.000Z" | موعد تجديد التجربة حسب عنوان IP بتوقيت UTC (ISO 8601)؛ وnull لحسابات مفاتيح API أو إذا كان غير معروف. |
meta.usage.limit | integer | نعم | 10 | حصة التجربة حسب عنوان IP؛ وnull لحسابات مفاتيح API. |
meta.usage.period_seconds | integer | نعم | 86400 | مدة فترة التجربة حسب عنوان IP بالثواني؛ وnull لحسابات مفاتيح API. |
إعادة المحاولة والخصم
كل طلب تقدير عملية جديدة، حتى عند إعادة إرسال طلب مطابق. تنطبق قواعد الأرصدة المعتادة على كل طلب. لا توجد حماية من الطلبات المكررة، لذا تجنّب إعادة المحاولة التلقائية بعد انقطاع الاتصال أو عندما لا تُعرف نتيجة العملية.
عند استجابة 429، انتظر المدة المحددة في Retry-After قبل إرسال طلب آخر. عند فشل التقديرات، افحص أولًا code وaction وmeta.usage.billing_status. عند billing_reconciliation_required أو الخصم غير المؤكد، تواصل مع فريق الدعم مع ذكر request_id قبل إعادة المحاولة.
قد يعيد الطلب المجمّع الناجح جزئيًا HTTP 200. افحص كل عنصر، وبعد تأكيد الخصم أعد إرسال العناصر الفاشلة فقط؛ إذ ستُخصم أرصدة العناصر الناجحة مرة أخرى إذا أُعيد إرسالها.
يعرّف X-Request-ID وmeta.request_id محاولة HTTP الحالية. اقرأ الرصيد الحالي عبر /usage. لا يبدأ HEAD تقديرًا مدفوعًا. لا تُخزَّن استجابات التقدير والحساب مؤقتًا.
يجب أن تتقبّل برامج العميل حقول الاستجابة الإضافية، وأن تحتفظ بقيم null عندما لا تتوفر المعلومة.
حدود الطلبات
تعامل مع HTTP 429 وRetry-After بدلًا من افتراض أن الطلبات ستُقبل دائمًا حتى هذه الحدود القصوى. سعة الخدمة مشتركة. القيم المعروضة هي الإعدادات الافتراضية الحالية للخدمة. تتضمن استجابات تحديد المعدل X-RateLimit-Limit وX-RateLimit-Remaining وX-RateLimit-Reset (بثواني Unix). وقيمة Retry-After مدة انتظار بالثواني. تصف هذه الترويسات حدود الطلبات، لا الأرصدة المتبقية. حتى قراءة /usage المجانية تُحتسب ضمن حدود معدل الطلبات.
| الحد | القيمة |
|---|---|
| جسم طلب JSON | 64 KiB كحد أقصى |
| قيمة التقدير | 1–254 حرفًا |
| الطلب المجمّع | 50 عنصرًا مع مفتاح API؛ و10 عناصر في التجربة حسب عنوان IP |
| المعدل لكل حساب | 120 طلبًا في الدقيقة |
| المعدل لكل عنوان IP | 600 طلب في الدقيقة |
| العمليات المتزامنة | 2 لكل حساب؛ و16 على مستوى الخدمة كلها |