ForHosting KIT

كل ما يفعله KIT، في مكان واحد

‏ForHosting KIT كتالوج من 7447 مهمة جاهزة — حوّل مستندًا، اقرأ فاتورة، فرّغ صوتًا إلى نص، تحقّق من رقم IBAN، أنشئ رمز QR — موزّعة على 14 فئة. نفّذها هنا على الويب، أو استدعِها من شيفرتك بطلب POST واحد موثّق. هذه الصفحة هي مرجع الـAPI كاملًا: الـendpoints، والنموذج غير المتزامن، وعقد الـwebhook، والأخطاء، والأسعار.

استخدمها من الويبAPIالبريدTelegramالتطبيق قريبًا

ما هو KIT

كتالوج مهام، لا نموذج

كل قدرة هنا مهمة: ترسل مدخلًا فتستلم نتيجة. لا tokens ولا نوافذ سياق ولا هندسة موجّهات. ولكل مهمة سعر معلن ووحدة موثّقة وشكل ثابت.

أربع طرق لتنفيذها. الويب — لكل قدرة صفحتها، وتعمل داخل المتصفح؛ والمجانية منها لا تغادر جهازك أبدًا. الـAPI — طلب POST واحد موثّق، كما هو موضّح أدناه. البريد وTelegram — أرسل المهمة إلى عنوان KIT. الـAPI قناة من القنوات، لا المنتج نفسه.

البداية السريعة

من الصفر إلى نتيجة في ثلاثة طلبات

أنشئ حسابًا، واحصل على مفتاحك، ونفّذ مهمة. لا مكالمة مبيعات ولا قائمة انتظار.

1

احصل على مفتاح API

POST /signup ببريدك يعيد مفتاحًا يبدأ بـkit_live_. يُعرض مرة واحدة فقط. لا نخزّن منه إلا بصمة SHA-256، فإن ضاع منك تعذّر علينا استرجاعه — ونصدر لك مفتاحًا جديدًا.

2

اختر قدرة

GET /catalog يسرد القدرات الـ7447 كلها بسعرها الحيّ ووحدتها. أو تصفّح الكتالوج أسفل هذه الصفحة.

3

نفّذها

أرسل POST إلى endpoint القدرة. تستلم task_id في اللحظة نفسها، وتصلك النتيجة عبر الـwebhook عندك.

المصادقة

رمز Bearer، يُعرض مرة واحدة

كل طلب API يحمل Authorization: Bearer kit_live_…. والمفاتيح 48 خانة ست عشرية بعد البادئة.

لا نخزّن إلا بصمة SHA-256 لمفتاحك. وهذا قرار مقصود: تسريب قاعدة البيانات لا يسلّم أحدًا بيانات اعتمادك — غير أنّه يعني كذلك أننا فعلًا لا نستطيع أن نعيد إليك مفتاحك بالبريد. أضعته؟ نُلغيه ونُصدر غيره.

المفتاح الخاطئ يعيد 401 دائمًا، ولا يقول لماذا. الملغى، والمكتوب خطأً، والذي لم يوجد قط — لا نفرّق بينها عمدًا: أن نخبرك أيّها كان يعني أن نخبر المهاجم أيضًا.

النموذج غير المتزامن

كل مهمة غير متزامنة. بلا استثناء.

1

ترسل المهمة

يعيد 202 مع task_id وحالة queued، ومعها ما ستكلّفه. المبلغ يُحجز ولا يُخصم.

2

تعمل على الحافة

أقل من ثانية لمهام الحوسبة؛ وثوانٍ معدودة لمهام الذكاء الاصطناعي والوسائط.

3

النتيجة تجدك

تُرسل بطلب POST إلى webhook_url إن أعطيتنا واحدًا. وإلا فـGET /tasks/{id}/result. وتُحفظ النتائج بحسب حجمها: 168 ساعة للصغيرة (حتى 1 ميغابايت) ونزولًا إلى 6 ساعات للكبيرة جدًا.

4

الفشل لا يكلّفك شيئًا

تُنفَّذ المهمة 3 مرات كحدٍّ أقصى إجمالًا، مع تباعد تدريجي بين المحاولات. فإن فشلت بعدها، يُحرَّر الحجز ولا تُحاسَب عليها. أبدًا.

مرجع الـAPI

كل endpoint يجيب عليه KIT

المسارات بلا بادئة إصدار. لا يزال /v1/* يعمل للعملاء القدامى، غير أنّه ليس الشكل المعتمد ولا ينبغي أن تستخدمه شيفرة جديدة.

POSThttps://api.kit.forhosting.com/tasks

الرابط الأساسي: 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"
  }
}
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));
}

الأخطاء

‏HTTP قياسي، وslug يقرؤه الحاسوب

كل خطأ يحمل في محتواه error بـslug ثابت. طابِق على الـslug لا على الرسالة: الرسائل مترجمة وقد تتغير.

HTTPالخطأالمعنى
400flow_depthتداخلت قدرة مركّبة أعمق مما هو مسموح. سطِّح الخطوات.
400invalid_amountالمبلغ ناقص، أو ليس رقمًا، أو خارج المدى المسموح.
400invalid_emailعنوان البريد مفقود أو غير صالح.
400invalid_inputالمدخل ينقصه حقل مطلوب أو ليس بالشكل الذي تتوقعه هذه المهمة.
400invalid_jsonمحتوى الطلب ليس JSON صالحًا.
400missing_typeحقل 'type' مفقود من الطلب. راجع GET /catalog.
400unknown_opعملية غير معروفة لهذه القدرة. راجع اسمها في الكتالوج.
400unsafe_urlالرابط يشير إلى موضع لن نجلب منه: عنوان داخلي أو غير علني.
401auth_requiredتحتاج هذه الخطوة إلى حساب محدَّد الهوية، والطلب لا يحمل واحدًا.
401no_keyالطلب لا يحمل مفتاح واجهة، أو لا يوجد للحساب مفتاح فعّال.
401unauthorizedمفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك.
402account_suspendedحسابك موقوف، غالبًا بسبب حدّ الإنفاق. راسلنا لإعادة تفعيله.
402insufficient_balanceرصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة.
402max_cost_exceededتجاوزت تكلفة المهمة قيمة max_cost_usd التي حددتها — لم يتم تحصيل أي مبلغ.
403forbiddenبيانات الاعتماد صحيحة، لكنها لا تملك صلاحية هذا.
404input_not_foundمرجع kit:// هذا غير موجود — أعد رفع الملف عبر POST /uploads.
404not_foundلا توجد مهمة ولا مورد في هذا المسار.
404unknown_typeنوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب.
409alias_takenاسم البريد الوارد ذاك يخصّ شخصًا آخر. اختر غيره.
409already_acceptedاستُخدمت تلك الموافقة من قبل. كل موافقة تصلح مرة واحدة فقط.
409email_takenيوجد حساب مسجَّل بهذا البريد بالفعل.
409need_leaseعاملٌ آخر ينفّذ هذه المهمة بالفعل. انتظر حتى ينتهي.
409not_cancellableلم تعد المهمة في الطابور، فلا يمكن إلغاؤها. لا يُلغى إلا ما كان في الطابور.
409not_readyلم تنتهِ المهمة بعد؛ استعلم عن حالتها أو انتظر الـwebhook.
409not_retryableلا يُعاد إلا ما فشل من المهام. وهذه في حالة أخرى.
410expiredانتهت مدة حفظ النتيجة ولم تعد مخزّنة.
410input_expiredانتهت صلاحية مرجع kit:// هذا. الملفات المرفوعة تبقى 24 ساعة — أعد رفع الملف.
410quote_expiredانقضت مدة صلاحية التسعيرة. اطلب واحدة جديدة.
413input_too_largeحجم المدخلات يتجاوز الحد المسموح لهذه المهمة — قسّم الملف أو صغّره.
413resolution_too_highالصورة أو الفيديو يتجاوزان الدقة التي تقبلها هذه القدرة.
422conversion_failedتعذّر تحويل الملف. غالبًا صيغة تالفة أو غير متوقّعة.
422engine_errorفشل المحرّك في كل المحاولات. حُرِّر الحجز، ولم تُحاسَب على شيء.
422needs_reworkلم تجتز النتيجة فحص جودتها، فلم تُسلَّم. ولم تُحاسَب عليها.
429rate_limitedتجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة.
500lease_errorتعذّر التقاط المهمة للتنفيذ. تعود إلى الطابور.
500ledger_errorتعذّر حجز الرصيد أو تسويته. أعد المحاولة.
500no_holdلا حجز للمهمة كي يُسوّى. لا يُفترض أن يحدث هذا؛ فإن حدث فأخبرنا.
500no_resultانتهت المهمة دون أن تُنتج نتيجة.
501coming_soonهذه القدرة لم تُفتح بعد — ستتوفر قريبًا ضمن المرحلة القادمة.
501mail_not_configuredهذه القدرة ترسل بريدًا، وللحساب لم يُضبط مُرسِل بعد.
501not_implementedهذا الـendpoint أو هذه القدرة غير متاحة بعد.
501tickets_not_configuredتكامل التذاكر غير مُهيّأ لهذا الحساب.
501unsupportedهذه العملية غير مدعومة بعد (مثلًا، لا يمكن تسعير الـflows).
502model_output_invalidأعاد النموذج شيئًا لا يطابق المُخرَج المعلن. ولم تُحاسَب عليه.
502tickets_unreachableلم يستجب نظام التذاكر. لم يُحسب عليك شيء؛ أعد المحاولة.
503all_busyكل العاملين على هذه القدرة مشغولون. أعد المحاولة بعد قليل.

الأسعار

معلنة، لكل مهمة، بلا نقاط

ادفع مقابل ما تستخدمه فقط. اشحن رصيد حسابك (ابتداءً من $10.00) — ولا تنتهي صلاحيته أبدًا — وكل مهمة تُخصم منه بسعرها المعلن لكل مهمة. دولارات حقيقية، لا نقاط.

لكل مهمة سعر أساس وسعر لكل وحدة، وكلاهما معلن في صفحة القدرة نفسها وفي الكتالوج أدناه — ابتداءً من $0.002 للاستدعاء الواحد. POST /estimate يسعّر لك المهمة دون تنفيذها، وmax_cost_usd في المهمة يرفضها إن كانت ستكلّف أكثر مما حدّدت.

المهام الفاشلة لا تُحاسَب أبدًا. والقدرات المجانية تعمل داخل متصفحك ولا تكلّف شيئًا البتة.

أدوات مجانية
$0.00
لكل مهمة
$0.002
الدفع حسب الاستخدام
الرصيد
$10.00

الحدود

ما الذي تفرضه الخدمة

ثلاثة حدود، ولكلٍّ منها طريقة عدّ مختلفة. لكل حساب: 600 طلب في الدقيقة إجمالًا، و60 عملية رفع في الدقيقة. لكل مهمة: 10 قراءات للحالة كل 10 ثوانٍ — وتجاوُز أيٍّ منها يعيد 429 مع Retry-After: 1. استخدم الـwebhook بدل الاستعلام المتكرر: تكلفته أقل ويصلك أسرع. وتُحفظ النتائج بحسب حجمها: 168 ساعة حتى 1 ميغابايت، ونزولًا إلى 6 ساعات للكبيرة جدًا. GET /tasks يعيد 25 عنصرًا افتراضيًا، و100 حدًا أقصى. والتسجيل محدود بـ10 حسابات في الساعة لكل عنوان IP.

كتالوج القدرات

الـ7447 كلها، مرتّبة حسب الفئة

لكل قدرة صفحتها الخاصة، حيث تنفّذها وترى مثالًا حقيقيًا والسعر المعلن — وهو نفسه الذي تحاسب به هذه الواجهة البرمجية. افتح الكتالوج كاملًا، أو انتقل مباشرة إلى فئة.

فهرس الأدوات حسب الفئة →