واجهة inboxsink البرمجية

صناديق مؤقّتة تُدار بالشيفرة، لاختبار مسارات التسجيل دون الاعتماد على صندوق بريد حقيقي. خمسة مسارات، وقاعدة واحدة على https://inboxsink.com، بصيغة JSON.

المسار الذي يغيّر المعادلة هو wait: يحجب حتى تصل الرسالة. بدونه يلجأ اختبار الطرف إلى الطرف إلى التخمين عبر sleep، ويصبح هشّاً بمجرّد تأخّر طابور الإرسال.

مفتاح API مجّاني

ألف نداء شهرياً، بلا بطاقة. ما يكفي لوصله بمجموعة اختباراتك ومعرفة إن كان يصمد.

ثم حين تبدأ اختباراتك بالرفض: نطاقك الخاصّ لا يُنشَر في أيّ مكان، فلا يقع في أيّ قائمة حجب — 29 € شهرياً.

عميل JavaScript

حزمة بلا أيّ اعتماديات، لـ Node 18 فما فوق. الشيفرة على GitHub.

npm i inboxsink
import { InboxSink } from 'inboxsink';
const sink = new InboxSink(process.env.INBOXSINK_API_KEY);

const inbox = await sink.createInbox();
const code = await sink.waitForOtp(inbox.id);   // '204815'

يرمي waitForOtp خطأً بدل إعادة null حين لا يصل أيّ رمز: يجب أن يفشل الاختبار بصوت عالٍ، لا أن يملأ حقلاً فارغاً بصمت.

المصادقة

ترويسة Authorization مع كلّ نداء. تُنشأ المفاتيح من لوحة التحكّم وتبدأ بـ ibsk_.

curl -H "Authorization: Bearer ibsk_…" \
  https://inboxsink.com/v1/domains

لا يُعرَض المفتاح بصيغته الصريحة إلا لحظة إنشائه. بعدها تبقى بادئته وحدها ظاهرة — ونحن لا نحفظ سوى بصمته.

إنشاء صندوق

POST /v1/inboxes

كلّ المعاملات اختيارية: domain (افتراضياً نطاق عشوائي من المجموعة)، وprefix (افتراضياً عشوائي)، وttl_seconds (من 60 ثانية إلى 30 يوماً).

curl -X POST https://inboxsink.com/v1/inboxes \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"ttl_seconds": 900}'

→ 201
{ "id": "42", "address": "9f2c1a@mailhusk.com", "expires_at": "2026-09-01T15:12:00Z" }

الصندوق المُنشأ عبر الواجهة خاصّ: لا يقرؤه إلا المفتاح الذي أنشأه.

انتظار رسالة

GET /v1/inboxes/:id/wait

يحجب حتى تصل رسالة، ثم يُجيب فوراً. timeout بالملّي ثانية (30 000 افتراضياً، و120 000 حدّاً أقصى)، وsince لاستقبال الرسائل اللاحقة لمعرّف بعينه فقط.

يُجيب بـ 204 بلا محتوى إذا انقضت المهلة دون رسالة — وهذا ليس خطأً، بل الجواب الطبيعي على «لم يصل شيء».

curl -H "Authorization: Bearer $KEY" \
  "https://inboxsink.com/v1/inboxes/42/wait?timeout=45000"

→ 200
{ "message": { "id": "913", "from": "no-reply@acme.com", "subject": "…",
               "otp": "204815", "link": "https://acme.com/confirm/9f3a" } }

يُستخرَج otp وlink نيابةً عنك. ولا يُبلَّغ عن رمز إلا إذا أعلنته الرسالة فعلاً («رمز»، «تحقّق»، «تسجيل دخول»…) — فلن يُخلَط مبلغ فاتورة أو سنة برمز أبداً.

سرد الرسائل

GET /v1/inboxes/:id/messages

يقبل since وlimit (50 افتراضياً، و200 حدّاً أقصى). يُعيد ملخّصات بلا متن الرسائل.

قراءة رسالة

GET /v1/messages/:id

الرسالة كاملة: text وhtml وheaders وقائمة المرفقات.

حذف صندوق

DELETE /v1/inboxes/:id

يمحو الصندوق ورسائله فوراً. ويُجيب بـ 204.

الأخطاء

204بلا محتوى — في wait، انقضت المهلة دون رسالة
400معامل غير صالح
401المفتاح مفقود أو مجهول أو مُلغى
403هذا الصندوق يخصّ مفتاحاً آخر
404الصندوق أو الرسالة غير موجود، أو انتهت صلاحيته
429نداءات كثيرة أكثر من اللازم

الحدود ومدّة البقاء

صناديق المجموعة العامّة تعيش ساعة واحدة؛ أمّا المُنشأة عبر الواجهة فتتبع ttl_seconds الخاصّ بها، حتى ثلاثين يوماً. وبعد انقضاء المدّة يُحذف الصندوق ورسائله — ولا أرشيف يُسترجَع منه شيء لاحقاً.

تُرفَض الرسائل التي تتجاوز عشرة ميغابايت عند الاستقبال. وتُرفَض العناوين على نطاق مجهول أثناء جلسة SMTP نفسها، دون توليد رسالة ارتداد.

لا تستطيع هذه الصناديق إرسال البريد، وهذا مقصود: رسالة مُرسَلة من نطاق مؤقّت لن تصل إلى أيّ مكان.