كل ما يفعله KIT، في مكان واحد
ForHosting KIT كتالوج من 7447 مهمة جاهزة — حوّل مستندًا، اقرأ فاتورة، فرّغ صوتًا إلى نص، تحقّق من رقم IBAN، أنشئ رمز QR — موزّعة على 14 فئة. نفّذها هنا على الويب، أو استدعِها من شيفرتك بطلب POST واحد موثّق. هذه الصفحة هي مرجع الـAPI كاملًا: الـendpoints، والنموذج غير المتزامن، وعقد الـwebhook، والأخطاء، والأسعار.
ما هو KIT
كتالوج مهام، لا نموذج
كل قدرة هنا مهمة: ترسل مدخلًا فتستلم نتيجة. لا tokens ولا نوافذ سياق ولا هندسة موجّهات. ولكل مهمة سعر معلن ووحدة موثّقة وشكل ثابت.
أربع طرق لتنفيذها. الويب — لكل قدرة صفحتها، وتعمل داخل المتصفح؛ والمجانية منها لا تغادر جهازك أبدًا. الـAPI — طلب POST واحد موثّق، كما هو موضّح أدناه. البريد وTelegram — أرسل المهمة إلى عنوان KIT. الـAPI قناة من القنوات، لا المنتج نفسه.
البداية السريعة
من الصفر إلى نتيجة في ثلاثة طلبات
أنشئ حسابًا، واحصل على مفتاحك، ونفّذ مهمة. لا مكالمة مبيعات ولا قائمة انتظار.
احصل على مفتاح API
POST /signup ببريدك يعيد مفتاحًا يبدأ بـkit_live_. يُعرض مرة واحدة فقط. لا نخزّن منه إلا بصمة SHA-256، فإن ضاع منك تعذّر علينا استرجاعه — ونصدر لك مفتاحًا جديدًا.
اختر قدرة
GET /catalog يسرد القدرات الـ7447 كلها بسعرها الحيّ ووحدتها. أو تصفّح الكتالوج أسفل هذه الصفحة.
نفّذها
أرسل POST إلى endpoint القدرة. تستلم task_id في اللحظة نفسها، وتصلك النتيجة عبر الـwebhook عندك.
المصادقة
رمز Bearer، يُعرض مرة واحدة
كل طلب API يحمل Authorization: Bearer kit_live_…. والمفاتيح 48 خانة ست عشرية بعد البادئة.
لا نخزّن إلا بصمة SHA-256 لمفتاحك. وهذا قرار مقصود: تسريب قاعدة البيانات لا يسلّم أحدًا بيانات اعتمادك — غير أنّه يعني كذلك أننا فعلًا لا نستطيع أن نعيد إليك مفتاحك بالبريد. أضعته؟ نُلغيه ونُصدر غيره.
المفتاح الخاطئ يعيد 401 دائمًا، ولا يقول لماذا. الملغى، والمكتوب خطأً، والذي لم يوجد قط — لا نفرّق بينها عمدًا: أن نخبرك أيّها كان يعني أن نخبر المهاجم أيضًا.
النموذج غير المتزامن
كل مهمة غير متزامنة. بلا استثناء.
ترسل المهمة
يعيد 202 مع task_id وحالة queued، ومعها ما ستكلّفه. المبلغ يُحجز ولا يُخصم.
تعمل على الحافة
أقل من ثانية لمهام الحوسبة؛ وثوانٍ معدودة لمهام الذكاء الاصطناعي والوسائط.
النتيجة تجدك
تُرسل بطلب POST إلى webhook_url إن أعطيتنا واحدًا. وإلا فـGET /tasks/{id}/result. وتُحفظ النتائج بحسب حجمها: 168 ساعة للصغيرة (حتى 1 ميغابايت) ونزولًا إلى 6 ساعات للكبيرة جدًا.
الفشل لا يكلّفك شيئًا
تُنفَّذ المهمة 3 مرات كحدٍّ أقصى إجمالًا، مع تباعد تدريجي بين المحاولات. فإن فشلت بعدها، يُحرَّر الحجز ولا تُحاسَب عليها. أبدًا.
مرجع الـAPI
كل endpoint يجيب عليه KIT
المسارات بلا بادئة إصدار. لا يزال /v1/* يعمل للعملاء القدامى، غير أنّه ليس الشكل المعتمد ولا ينبغي أن تستخدمه شيفرة جديدة.
الرابط الأساسي: https://api.kit.forhosting.com
| الطريقة | المسار | المصادقة | الوظيفة |
|---|---|---|---|
ANY |
/ |
عامة | فهرس الخدمة: الإصدار وعدد القدرات وقائمة النقاط التي تعلنها الواجهة عن نفسها. بلا مفتاح، وتستجيب لأي طريقة طلب. |
POST |
/{alias} |
مفتاح API | اختصار لكل قدرة عن POST /tasks مع تثبيت type — مثل POST /ocr/invoice. وهو الشكل الذي تعرضه صفحة كل قدرة. |
GET |
/account |
مفتاح API | رصيد الحساب: available_usd هو رصيد محفظتك الفعلي، يضاف إليه held_usd. وحين تدير المحفظةَ منطقةُ العميل، تكون balance.source بقيمة "portal" ويشير balance_endpoint إلى الرقم الحيّ. |
POST |
/agent/ask |
مفتاح API قريبًا | غير مُنفَّذ — يعيد 501 مع المفتاح و401 بدونه. المساعد الحواري يُبنى في مكان آخر؛ وللعثور على قدرة استخدم POST /catalog/search. |
GET |
/catalog |
عامة | كل القدرات بسعرها ووحدتها الحيّة. ?lang=en|es، و?q= للتصفية، و?limit=، و?schema=1 لمخطط الإدخال، و?channel= لتحصل على السعر معدَّلًا لتلك القناة — اطلب القناة التي ستحاسب عليها، وإلا عرضت رقمًا وحاسبت بغيره. |
POST |
/catalog/search |
عامة | {query} → القدرات المطابقة، كلٌّ بسعرها مصاغًا بالفعل. بلا مفتاح. تُحتسب النتيجة بتغطية الكلمة الكاملة مع عتبة، فالاستعلام الذي لا تفهمه يعيد لا شيء بدل أن يخمّن — وهذا مقصود. |
POST |
/estimate |
مفتاح API | {type, input} → الوحدات والسعر والتفصيل. يسعّر دون تنفيذ. وحين يتعذّر معرفة الكمية الحقيقية مسبقًا (عدد صفحات ملف PDF خلف رابط)، يقول الردّ estimated: true. |
GET |
/mobile/bootstrap |
عامة | ما يحتاجه تطبيق الجوال ليبدأ: الفئات والتسميات والأسعار نفسها معدَّلة للقناة. بلا مفتاح. وهي أيضًا ليست جزءًا من العقد العلني، للسبب نفسه. |
GET |
/mobile/catalog |
عامة | إسقاط للكتالوج من أجل تطبيق الجوال، بأسعار معدَّلة لقناة التطبيق. بلا مفتاح. ليست جزءًا من العقد العلني: شكلها يتبع التطبيق وقد يتغير دون إشعار — ابنِ على GET /catalog. |
GET |
/plans |
عامة | مبالغ الشحن: currency وtopup (sku وdefault_amount وmin_amount). لا شيء غير ذلك — لا توجد خطط للاشتراك فيها. |
POST |
/signup |
عامة | {email} → 201 مع api_key الخاص بك، يُعرض مرة واحدة فقط. و409 إن كان البريد موجودًا، و429 فوق 10 في الساعة لكل عنوان IP. |
GET |
/tasks |
مفتاح API | مهامك. ?status= و?limit= (25 افتراضيًا و100 حدًا أقصى). |
POST |
/tasks |
مفتاح API | {type, input, webhook_url?, max_cost_usd?} → 202. تُحاسَب على الوحدة الحقيقية للمهمة — صفحات أو دقائق أو صور — مقيسةً أثناء التنفيذ، لا على التقدير المسبق. وmax_cost_usd سقف صارم: إن تجاوزته الكلفة الحقيقية فشلت المهمة ولم يُحسب عليك شيء. أرسل Idempotency-Key ليكون تكرار الطلب آمنًا: الإعادة تُرجع المهمة الأصلية مع idempotent: true. |
DELETE |
/tasks/{id} |
مفتاح API | يلغي مهمة في الطابور ويحرّر حجزها. |
GET |
/tasks/{id} |
مفتاح API | حالة المهمة. 10 قراءات كل 10 ثوانٍ لكل مهمة؛ وما زاد يعيد 429 مع Retry-After: 1. والأفضل استخدام الـwebhook. |
GET |
/tasks/{id}/events |
مفتاح API قريبًا | غير مُنفَّذ — يعيد 501. سيأتي الـSSE لاحقًا؛ استخدم الـwebhook. |
GET |
/tasks/{id}/result |
مفتاح API | نتيجة JSON، أو الملف كمرفق. 409 إن لم تكن جاهزة، و410 إن انتهت صلاحيتها، و422 إن فشلت. ومدة الحفظ تتبع حجم النتيجة: 168 ساعة للصغيرة، ونزولًا إلى 6 ساعات للكبيرة جدًا. |
POST |
/tasks/{id}/retry |
مفتاح API | يعيد مهمة فاشلة إلى الطابور. |
POST |
/uploads |
مفتاح API | أرسل ملفًا محليًا: جسم ثنائي خام مع Content-Type الخاص بالملف. → 201 مع ref: "kit://upl_…"، تضعه بعدها في موضع الرابط: {"input": {"pdf": "kit://upl_…"}}. ورفعة واحدة تكفي لعدة مهام. تعيش المراجع 24 ساعة، والحدّ 100 MiB (104.9 MB) للرفعة الواحدة، ولكل قدرة حدّها الخاص فوق ذلك. |
الـWebhooks
تسليم موقّع، وكيف تتحقق منه
حدّد webhook_url عند إنشاء المهمة، فنرسل النتيجة إليه بطلب POST فور جاهزيتها. وهذا هو المسار الموصى به: أقل كلفة من الاستعلام المتكرر وأسرع وصولًا.
تحقّق من التوقيع قبل أن تثق بالمحتوى. كل تسليم يحمل KIT-Signature: v1=<hex> وKIT-Timestamp: <unix seconds>. والتوقيع HMAC-SHA256 على النص <timestamp>.<raw body> — الطابع الزمني والنقطة جزء من الحمولة الموقّعة، لا زينة. وقّع البايتات الخام كما وصلتك، لا كائنًا أعدت تسلسله.
نحاول التسليم حتى 5 مرات بتراجع أُسّي. وأي 4xx من طرفك يوقف المحاولات فورًا — نقرؤه على أنه «معالجك خطأ»، لا «حاول لاحقًا». ولا يعيد المحاولة إلا 5xx وأخطاء الشبكة. وبعدها يُنقل التسليم إلى قائمة الرسائل الميتة.
ما الذي نرسله
{
"event": "task.completed",
"created_at": "2026-07-16T10:31:04.120Z",
"data": {
"task_id": "tsk_a1b2c3d4e5f6",
"type": "ocr.invoice",
"status": "done",
"units": 1,
"price_usd": 0.021,
"result_url": "https://api.kit.forhosting.com/tasks/tsk_a1b2c3d4e5f6/result"
}
}{
"event": "task.failed",
"created_at": "2026-07-16T10:31:04.120Z",
"data": {
"task_id": "tsk_a1b2c3d4e5f6",
"type": "ocr.invoice",
"status": "failed",
"error": {
"code": "engine_error",
"message": "Upstream timed out after 3 attempts."
},
"charged": false
}
}التحقق من التوقيع
const crypto = require("crypto");
// req.body tiene que ser el cuerpo CRUDO, no un objeto re-serializado.
function verify(rawBody, headers, secret) {
const sig = (headers["kit-signature"] || "").replace(/^v1=/, "");
const ts = headers["kit-timestamp"];
const mine = crypto.createHmac("sha256", secret)
.update(ts + "." + rawBody) // el timestamp va firmado
.digest("hex");
return crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(mine));
}import hmac, hashlib
def verify(raw_body: bytes, headers, secret: str) -> bool:
sig = headers["KIT-Signature"].removeprefix("v1=")
ts = headers["KIT-Timestamp"]
mine = hmac.new(secret.encode(),
f"{ts}.".encode() + raw_body, # el timestamp va firmado
hashlib.sha256).hexdigest()
return hmac.compare_digest(sig, mine)الأخطاء
HTTP قياسي، وslug يقرؤه الحاسوب
كل خطأ يحمل في محتواه error بـslug ثابت. طابِق على الـslug لا على الرسالة: الرسائل مترجمة وقد تتغير.
| HTTP | الخطأ | المعنى |
|---|---|---|
400 | flow_depth | تداخلت قدرة مركّبة أعمق مما هو مسموح. سطِّح الخطوات. |
400 | invalid_amount | المبلغ ناقص، أو ليس رقمًا، أو خارج المدى المسموح. |
400 | invalid_email | عنوان البريد مفقود أو غير صالح. |
400 | invalid_input | المدخل ينقصه حقل مطلوب أو ليس بالشكل الذي تتوقعه هذه المهمة. |
400 | invalid_json | محتوى الطلب ليس JSON صالحًا. |
400 | missing_type | حقل 'type' مفقود من الطلب. راجع GET /catalog. |
400 | unknown_op | عملية غير معروفة لهذه القدرة. راجع اسمها في الكتالوج. |
400 | unsafe_url | الرابط يشير إلى موضع لن نجلب منه: عنوان داخلي أو غير علني. |
401 | auth_required | تحتاج هذه الخطوة إلى حساب محدَّد الهوية، والطلب لا يحمل واحدًا. |
401 | no_key | الطلب لا يحمل مفتاح واجهة، أو لا يوجد للحساب مفتاح فعّال. |
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | account_suspended | حسابك موقوف، غالبًا بسبب حدّ الإنفاق. راسلنا لإعادة تفعيله. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
402 | max_cost_exceeded | تجاوزت تكلفة المهمة قيمة max_cost_usd التي حددتها — لم يتم تحصيل أي مبلغ. |
403 | forbidden | بيانات الاعتماد صحيحة، لكنها لا تملك صلاحية هذا. |
404 | input_not_found | مرجع kit:// هذا غير موجود — أعد رفع الملف عبر POST /uploads. |
404 | not_found | لا توجد مهمة ولا مورد في هذا المسار. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
409 | alias_taken | اسم البريد الوارد ذاك يخصّ شخصًا آخر. اختر غيره. |
409 | already_accepted | استُخدمت تلك الموافقة من قبل. كل موافقة تصلح مرة واحدة فقط. |
409 | email_taken | يوجد حساب مسجَّل بهذا البريد بالفعل. |
409 | need_lease | عاملٌ آخر ينفّذ هذه المهمة بالفعل. انتظر حتى ينتهي. |
409 | not_cancellable | لم تعد المهمة في الطابور، فلا يمكن إلغاؤها. لا يُلغى إلا ما كان في الطابور. |
409 | not_ready | لم تنتهِ المهمة بعد؛ استعلم عن حالتها أو انتظر الـwebhook. |
409 | not_retryable | لا يُعاد إلا ما فشل من المهام. وهذه في حالة أخرى. |
410 | expired | انتهت مدة حفظ النتيجة ولم تعد مخزّنة. |
410 | input_expired | انتهت صلاحية مرجع kit:// هذا. الملفات المرفوعة تبقى 24 ساعة — أعد رفع الملف. |
410 | quote_expired | انقضت مدة صلاحية التسعيرة. اطلب واحدة جديدة. |
413 | input_too_large | حجم المدخلات يتجاوز الحد المسموح لهذه المهمة — قسّم الملف أو صغّره. |
413 | resolution_too_high | الصورة أو الفيديو يتجاوزان الدقة التي تقبلها هذه القدرة. |
422 | conversion_failed | تعذّر تحويل الملف. غالبًا صيغة تالفة أو غير متوقّعة. |
422 | engine_error | فشل المحرّك في كل المحاولات. حُرِّر الحجز، ولم تُحاسَب على شيء. |
422 | needs_rework | لم تجتز النتيجة فحص جودتها، فلم تُسلَّم. ولم تُحاسَب عليها. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |
500 | lease_error | تعذّر التقاط المهمة للتنفيذ. تعود إلى الطابور. |
500 | ledger_error | تعذّر حجز الرصيد أو تسويته. أعد المحاولة. |
500 | no_hold | لا حجز للمهمة كي يُسوّى. لا يُفترض أن يحدث هذا؛ فإن حدث فأخبرنا. |
500 | no_result | انتهت المهمة دون أن تُنتج نتيجة. |
501 | coming_soon | هذه القدرة لم تُفتح بعد — ستتوفر قريبًا ضمن المرحلة القادمة. |
501 | mail_not_configured | هذه القدرة ترسل بريدًا، وللحساب لم يُضبط مُرسِل بعد. |
501 | not_implemented | هذا الـendpoint أو هذه القدرة غير متاحة بعد. |
501 | tickets_not_configured | تكامل التذاكر غير مُهيّأ لهذا الحساب. |
501 | unsupported | هذه العملية غير مدعومة بعد (مثلًا، لا يمكن تسعير الـflows). |
502 | model_output_invalid | أعاد النموذج شيئًا لا يطابق المُخرَج المعلن. ولم تُحاسَب عليه. |
502 | tickets_unreachable | لم يستجب نظام التذاكر. لم يُحسب عليك شيء؛ أعد المحاولة. |
503 | all_busy | كل العاملين على هذه القدرة مشغولون. أعد المحاولة بعد قليل. |
الأسعار
معلنة، لكل مهمة، بلا نقاط
ادفع مقابل ما تستخدمه فقط. اشحن رصيد حسابك (ابتداءً من $10.00) — ولا تنتهي صلاحيته أبدًا — وكل مهمة تُخصم منه بسعرها المعلن لكل مهمة. دولارات حقيقية، لا نقاط.
لكل مهمة سعر أساس وسعر لكل وحدة، وكلاهما معلن في صفحة القدرة نفسها وفي الكتالوج أدناه — ابتداءً من $0.002 للاستدعاء الواحد. POST /estimate يسعّر لك المهمة دون تنفيذها، وmax_cost_usd في المهمة يرفضها إن كانت ستكلّف أكثر مما حدّدت.
المهام الفاشلة لا تُحاسَب أبدًا. والقدرات المجانية تعمل داخل متصفحك ولا تكلّف شيئًا البتة.
الحدود
ما الذي تفرضه الخدمة
ثلاثة حدود، ولكلٍّ منها طريقة عدّ مختلفة. لكل حساب: 600 طلب في الدقيقة إجمالًا، و60 عملية رفع في الدقيقة. لكل مهمة: 10 قراءات للحالة كل 10 ثوانٍ — وتجاوُز أيٍّ منها يعيد 429 مع Retry-After: 1. استخدم الـwebhook بدل الاستعلام المتكرر: تكلفته أقل ويصلك أسرع. وتُحفظ النتائج بحسب حجمها: 168 ساعة حتى 1 ميغابايت، ونزولًا إلى 6 ساعات للكبيرة جدًا. GET /tasks يعيد 25 عنصرًا افتراضيًا، و100 حدًا أقصى. والتسجيل محدود بـ10 حسابات في الساعة لكل عنوان IP.
كتالوج القدرات
الـ7447 كلها، مرتّبة حسب الفئة
لكل قدرة صفحتها الخاصة، حيث تنفّذها وترى مثالًا حقيقيًا والسعر المعلن — وهو نفسه الذي تحاسب به هذه الواجهة البرمجية. افتح الكتالوج كاملًا، أو انتقل مباشرة إلى فئة.
بلا ضمان
ما الذي لا نعد به
يُقدَّم KIT «كما هو»: بلا ضمان، وبلا التزام بزمن تشغيل، وبلا SLA (البنية التحتية المخصصة باتفاقية مستوى خدمة إضافة مدفوعة)، وبلا دعم مضمون. راجع الشروط للاطلاع على بند KIT كاملًا.