هل يمكن تأجيل استدعاء webhook لوقت لاحق؟
تستدعي هذه الأداة عنوان webhook الذي تحدده بعد مهلة زمنية تضبطها أنت — دقائق أو ساعات أو أيام — فتنفّذ استدعاءً واحدًا مؤجَّلًا دون أن تبني طابور مهام أو تشغّل عملية خلفية تنتظر الوقت المناسب بنفسها. تناسب حالات لا تحتاج جدولة متكررة بل تأخيرًا واحدًا محسوبًا بدقة قبل تنفيذ خطوة تالية في مسار العمل.
الفرق بينها وبين الجدولة الدورية
بخلاف جدولة Cron التي تكرر الاستدعاء في مواعيد ثابتة، تنفّذ هذه الأداة استدعاءً واحدًا فقط بعد مهلة تحددها لكل طلب — ثلاثون ثانية، ساعتان، يوم كامل. هذا يناسب حالات مثل إرسال تذكير بعد تسجيل حجز بيوم، أو إعادة محاولة عملية فشلت بعد خمس دقائق، حين لا تحتاج تكرارًا بل مهلة واحدة قبل تنفيذ محدد. هذا الفارق الجوهري يجعلها أداة تكميلية لا بديلة عن جدولة Cron، فكل منهما يخدم حالة استخدام مختلفة تمامًا عن الأخرى.
كيف تضبط المهلة والوجهة؟
تمرّر إلى الـAPI عنوان الـwebhook والمدة المطلوب الانتظار قبل استدعائه، وتحتفظ الأداة بالطلب حتى تنقضي المهلة، ثم تستدعي العنوان مرة واحدة وتسجّل نتيجة الاستدعاء. لا حاجة لبناء جدول قاعدة بيانات مخصص لمهامك المؤجَّلة ولا لتشغيل عملية تفحص الوقت كل دقيقة؛ الانتظار كله يجري على جانبنا. يمكن أيضًا تحديد أكثر من استدعاء مؤجَّل لنفس الحدث بمهل مختلفة، كتذكير أول بعد ساعة وتذكير ثانٍ بعد يوم كامل، دون بناء منطق جدولة معقّد بنفسك.
استخدامات شائعة
تستخدمها متاجر إلكترونية لإرسال تذكير بسلة متروكة بعد ساعة من مغادرة الزائر، وتستخدمها فرق الدعم لإعادة محاولة استدعاء فشل بعد دقيقتين بدل الفشل النهائي الفوري. كلا الاستخدامين يحتاج تأخيرًا واحدًا محسوبًا بدقة، لا جدولة متكررة. يفيد أيضًا نظام حجوزات يريد إرسال رسالة تأكيد بعد نصف ساعة من الحجز فقط إن لم يُلغِه العميل خلال تلك المهلة، وهو سيناريو شائع في التجارة الإلكترونية.
حالات الاستخدام
تذكير بسلة متروكة
يضبط متجر تابع لشركة الواحة للتجارة المحدودة استدعاء مؤجَّلًا بعد ساعة من مغادرة الزائر دون إتمام الشراء، لإرسال تذكير بريدي تلقائي.
إعادة محاولة بعد فشل
يعيد فريق دعم تقني في شركة الخليج الرقمية محاولة استدعاء عملية فشلت بعد دقيقتين بدل اعتبارها فاشلة نهائيًا من أول محاولة.
تذكير موعد بعد يوم
يضبط عبدالله المنصوري تذكيرًا يصل قبل موعد استشارة بيوم واحد بالضبط، عبر استدعاء webhook مؤجَّل من نظامه الداخلي.
الأسئلة الشائعة
ما أقصى مهلة تأجيل ممكنة؟
يمكن ضبط المهلة من ثوانٍ قليلة حتى عدة أيام حسب الحاجة؛ حدد المدة المطلوبة عند إنشاء الطلب.
كم السعر؟
$0.002 لكل استدعاء مؤجَّل، بلا اشتراك شهري.
ماذا لو أردت إلغاء استدعاء مؤجَّل قبل تنفيذه؟
يمكن إلغاؤه عبر استدعاء واحد إلى الـAPI قبل انقضاء المهلة، ولن تُحتسب حينها أي رسوم.
هل تُحفظ محتويات الطلب طوال فترة الانتظار؟
يُحفظ عنوان webhook والمهلة فقط حتى موعد التنفيذ، ثم يُحذفان بعد الاستدعاء.
هل تعمل هذه الأداة من المتصفح مجانًا؟
لا، التأجيل يحتاج تشغيلًا على خوادمنا طوال فترة الانتظار، فهي خدمة عبر الـAPI بسعر معلن، بلا نسخة مجانية.
هل تضمنون تنفيذ الاستدعاء في اللحظة نفسها بالضبط؟
التنفيذ يجري خلال ثوانٍ من انقضاء المهلة المحددة، لا في اللحظة الحسابية نفسها تمامًا، وهو فارق ضئيل لا يؤثر عمليًا.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/dev/delay \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"input":"…"}'const res = await fetch("https://api.kit.forhosting.com/dev/delay", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"input": "…"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/delay",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"input": "…"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/delay", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"input":"…"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"input":"…"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/delay", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"input": "…"
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.delay",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |