مستندات API محفل آنلاین

وب‌سرویس REST برای ساخت اتاق و رویداد، صدور لینک ورود مستقیم، گزارش حضور، فهرست ضبط‌ها و دریافت رویدادها با وب‌هوک — نسخهٔ v1.

شروع و احراز هویت

همهٔ درخواست‌ها به آدرس پایهٔ https://mahfel-online.ir/api/v1 فرستاده می‌شوند و با کلید API احراز هویت می‌شوند. کلید را مدیر سامانه در صفحهٔ «توسعه‌دهندگان» صادر می‌کند. کلید را در یکی از دو هدر زیر بفرستید:

X-Api-Key: YOUR_API_KEY

# یا
Authorization: Bearer YOUR_API_KEY

نمونهٔ فراخوان با curl:

curl -H "X-Api-Key: YOUR_API_KEY" \
     https://mahfel-online.ir/api/v1/ping
محدودیت نرخ: هر کلید حداکثر ۱۲۰ درخواست در دقیقه می‌تواند بفرستد؛ بیشتر از آن پاسخ ۴۰۱ می‌گیرید. کلید را فقط سمت سرور نگه دارید و هرگز در کد کلاینت/مرورگر قرار ندهید.

قالب پاسخ

پاسخ موفق JSON است و معمولاً فیلد ok: true دارد. در خطا، وضعیت HTTP مناسب با این بدنه برمی‌گردد:

{ "ok": false, "error": { "code": "unauthorized", "message": "..." } }

اتاق‌ها و رویدادها

GET/api/v1/ping

بررسی اعتبار کلید و سلامت سرویس.

{ "ok": true, "key": { "name": "my-app", "prefix": "mk_a1b2" }, "now": "..." }
POST/api/v1/rooms

ساخت رویداد و اتاق در یک فراخوان؛ لینک ورود سخنران هم در پاسخ می‌آید.

بدنهٔ درخواست

فیلدنوعتوضیح
titlestring *عنوان رویداد (الزامی)
descriptionstringتوضیح رویداد
slugstringاسلاگ صفحهٔ ثبت‌نام /e/{slug}
roomCodestringکد اتاق دلخواه (حروف/عدد/ـ/_)
startsAt / endsAtdatetimeزمان شروع/پایان (پیش‌فرض: الان تا ۲ ساعت بعد)
capacityintظرفیت ثبت‌نام (۰ = نامحدود)
admissionMinutesintبازهٔ پذیرش قبل از شروع — دقیقه (۰ تا ۱۲۰، پیش‌فرض ۳۰)
presenterNamestringنام سخنران برای لینک ورود
POST /api/v1/rooms
{ "title": "وبینار معرفی محصول", "startsAt": "2026-10-20T18:00:00",
  "endsAt": "2026-10-20T20:00:00", "capacity": 200 }
{ "ok": true, "room": "r-abc123", "eventId": "...", "slug": "...",
  "registrationUrl": "https://mahfel-online.ir/e/...",
  "presenterJoinUrl": "https://mahfel-online.ir/room/...?jt=...",
  "startsAt": "...", "endsAt": "..." }
GET/api/v1/rooms

فهرست همهٔ اتاق‌ها/رویدادها؛ برای اتاق‌های زنده، تعداد شرکت‌کنندگان هم می‌آید (live).

GET/api/v1/rooms/{room}

جزئیات یک اتاق: اطلاعات رویداد متصل و فهرست شرکت‌کنندگان زنده.

DELETE/api/v1/rooms/{room}

پایان فوری جلسهٔ زنده (معادل end در سرویس‌های مشابه) و ارسال وب‌هوک room.ended.

GET/api/v1/rooms/{room}/participants

شرکت‌کنندگانِ زندهٔ اتاق با نام و زمان ورود.

گزارش حضور

GET/api/v1/rooms/{room}/attendance

گزارش حضور همهٔ نشست‌ها: زمان ورود/خروج، مدت حضور، تعداد پیام چت و دست بالا.

{ "ok": true, "room": "r-abc123", "attendance": [
  { "identity": "u-42", "name": "...", "role": "participant",
    "joinedAt": "...", "leftAt": "...", "minutes": 58,
    "chatMessages": 3, "raiseHands": 1 } ] }

ضبط‌ها

GET/api/v1/recordings

فهرست همهٔ ضبط‌ها؛ با پارامتر ?room={room} فقط ضبط‌های یک اتاق.

GET/api/v1/rooms/{room}/recordings

فهرست ضبط‌های یک اتاق خاص. برای هر ضبط: id، title، recordedBy، createdAt، durationSeconds، sizeBytes، inProgress، views، allowDownload و shareUrl (لینک اشتراک عمومی /r/{shareId} اگر فعال شده باشد).

لینک‌های ورود امضاشده کاربر را بدون فرم و با نقش مشخص وارد اتاق می‌کنند. توکن با HMAC-SHA256 و راز اختصاصی هر کلید امضا می‌شود و تا انقضایش معتبر است.

POST/api/v1/rooms/{room}/access

صدور لینک ورود برای یک کاربر؛ اگر اتاق به رویداد وصل باشد و mobile معتبر بدهید، ثبت‌نام رویداد هم انجام می‌شود.

فیلدنوعتوضیح
namestring *نام کاربر (الزامی، حداقل ۲ نویسه)
mobilestringموبایل — برای ثبت‌نام رویداد
rolestringpresenter | moderator | speaker | participant | audience
ttlMinutesintاعتبار لینک — دقیقه (۵ تا ۴۳۲۰۰، پیش‌فرض ۱۴۴۰)
ticketId / discountCodestringبرای ثبت‌نام رویداد
{ "ok": true, "room": "r-abc123", "name": "...", "role": "participant",
  "joinUrl": "https://mahfel-online.ir/room/...?jt=...",
  "expiresAt": "...", "registered": true, "registrationId": "..." }
POST/api/v1/join-links

صدور لینک ورود بدون ثبت‌نام — فقط room، name و اختیاری role و ttlMinutes.

وب‌هوک

با ثبت یک آدرس HTTPS، رویدادهای سامانه به‌صورت POST به شما می‌رسند.

GET/api/v1/webhooks

فهرست اشتراک‌ها + knownEvents (رویدادهای موجود).

POST/api/v1/webhooks

ساخت اشتراک: { "url": "https://…", "events": ["room.ended"] } — اگر events خالی باشد همهٔ رویدادها ارسال می‌شوند. در پاسخ secret اشتراک برمی‌گردد؛ آن را نگه دارید.

DELETE/api/v1/webhooks/{id}  POST/api/v1/webhooks/{id}/test

حذف اشتراک و ارسال رویداد آزمایشی.

رویدادها

participant.joined · participant.left · event.created · event.registration · join_link.created · room.ended

امضای تحویل

بدنهٔ هر تحویل پاکت JSON است و با دو هدر می‌آید: X-Mahfel-Event (نوع رویداد) و X-Mahfel-Signature به شکل sha256={hex} — مقدار آن HMAC-SHA256 بدنهٔ خام با secret اشتراک است:

// C#
var sig = Convert.ToHexString(
    HMACSHA256.HashData(Encoding.UTF8.GetBytes(secret), rawBody)).ToLower();
// مقایسه با مقدار بعد از "sha256=" در هدر X-Mahfel-Signature
// بدنهٔ نمونه
{ "id": "evt_...", "type": "event.registration",
  "created_at": 1760600400,
  "data": { "event": "...", "room": "...", "name": "...", "mobile": "..." } }

کدهای خطا

HTTPcodeعلت
400bad_requestفیلد الزامی ناقص یا نامعتبر
401unauthorizedکلید نامعتبر/منقضی یا عبور از سقف نرخ
404not_foundاتاق/وب‌هوک یافت نشد
502media_errorخطای سرویس رسانهٔ زنده
برای صدور کلید API با مدیر سامانه تماس بگیرید و راهنمای کاربری سامانه را در مرکز راهنما ببینید.

در حال اتصال مجدد به سرور…

اتصال برقرار نشد… تلاش دوباره تا ثانیه دیگر

اتصال مجدد ناموفق بود.

جلسه توسط سرور موقتاً متوقف شده است.

ادامه جلسه ممکن نشد.
لطفاً صفحه را دوباره بارگذاری کنید.