ویدیورایان
خانه / API
REST Control API · v1

مرجع API ویدیورایان

یک صفحهٔ کنترل کوچک، دو سطح: API عمومیِ باز برای اتاق‌های لینک‌محور و API اجاره‌ای برای محصولاتی که اتاق‌ها مال خودشان است. JSON ورودی، JSON خروجی. قرارداد ماشین‌خوانِ زنده هم توسط خودِ API در /api/v1/openapi.yaml سرو می‌شود. همهٔ خروجی‌های این صفحه روی تولید تست شده‌اند.

نکات پایه

Base URLs، احراز هویت و محدودیت‌ها

آدرس‌های پایه

  • API تولیدی: https://api.videorayan.ir/v1
  • همان‌مبدأ (روی پرتال‌های ما): /api/v1/*
  • سیگنالینگ رسانه: wss://rtc.videorayan.ir
  • رابط اتاق میزبانی‌شده: https://videorayan.ir/r/{roomId}

قواعد کلی

  • همهٔ بدنه‌ها JSON هستند با Content-Type: application/json؛ فیلدهای ناشناخته رد می‌شوند.
  • مسیرهای اجاره‌ای هدر Authorization: Bearer <key> می‌خواهند (کلیدها شبیه rtck_…اند).
  • مسیرهای عمومی و مهمان بدون کلید کار می‌کنند — لینک اتاق همان اعتبارنامه است.
  • محدودیت نرخ: ۱۲۰ درخواست در دقیقه به‌ازای هر IP (سطح عمومی). عبور از آن ← 429.
  • دسترسی بین‌اجاره‌ای ← 404 (ضد-کاوش).
از مرورگر روی دامنه‌های videorayan.ir صدا می‌زنید؟ مسیر همان‌مبدأ /api/v1/… را استفاده کنید — روی هر هاستِ *.videorayan.ir این مسیر به API پروکسی می‌شود؛ بدون CORS و بدون preflight.
API عمومی — بدون کلید

اتاق‌های رایگان: بساز، resolve کن، وارد شو

نام اتاق دستگیرهٔ عمومی آن است: ساخت دوباره با نام موجود، همان اتاق را برمی‌گرداند — برای لینک‌های همیشگی مثل community عالی است. خروجی‌های زیر عیناً از تولید است (۲۰۲۶-۱۰-۲۷).

POST /v1/public/rooms 201 Created

ساخت (یا واکشی) اتاق رایگان

اتاق مرورگریِ رایگان بسازید؛ اگر نام وجود داشته باشد همان اتاق برمی‌گردد (idempotent). محدودیت نرخ به‌ازای هر IP اعمال می‌شود.

فیلدنوعالزامیتوضیح
namestringبله۱ تا ۶۴ نویسه؛ دستگیرهٔ عمومی اتاق. ساخت با نام موجود ← همان اتاق.
passwordstringخیر۱ تا ۶۴ نویسه؛ اگر ست شود، مهمان‌ها باید برای ورود ارائه‌اش کنند (بررسی سمت سرور).
application/json — 201
curl -s -X POST https://api.videorayan.ir/v1/public/rooms \
  -H "Content-Type: application/json" -d '{"name":"community"}'

{"roomId":"4843ba3a-e800-475a-b78c-7ae60c9d33d7","name":"community"}

خطاها: 400 اعتبارسنجی ({"error":"invalid_input"}) · 429 محدودیت نرخ

GET /v1/public/rooms/{ref} 200 OK

Resolve اتاق با UUID یا نام

قبل از ورود، اتاق را با UUID یا نام resolve کنید تا roomId رسمی، نام نمایشی و اینکه رمز لازم دارد یا نه را بدانید — دقیقاً کاری که صفحهٔ پیوستن می‌کند.

application/json — 200
curl -s https://api.videorayan.ir/v1/public/rooms/community

{"roomId":"4843ba3a-e800-475a-b78c-7ae60c9d33d7","name":"community","needsPassword":false}

خطاها: 404 {"error":"room_not_found"} — مرجع ناشناخته یا منقضی‌شده.

POST /v1/guest/rooms/{ref}/tokens 201 Created

صدور توکن ورود مهمان

{ref} می‌تواند UUID اتاق یا نام اتاق عمومی باشد. سقف شرکت‌کنندگان و انقضای اتاق سمت سرور اعمال می‌شود و هر صدور ثبت حسابرسی می‌شود. انسان‌ها با لینک https://videorayan.ir/r/{roomId} وارد می‌شوند.

فیلدنوعالزامیتوضیح
identitystringبله۱ تا ۴۰ نویسه؛ به بقیهٔ شرکت‌کنندگان نشان داده می‌شود و در اتاق باید یکتا باشد.
passwordstringاگر اتاق خصوصی است۱ تا ۶۴ نویسه؛ وقتی اتاق با رمز ساخته شده لازم است.
application/json — 201
curl -s -X POST https://api.videorayan.ir/v1/guest/rooms/community/tokens \
  -H "Content-Type: application/json" -d '{"identity":"SaraDev"}'

{
  "token": "eyJhbGciOiJIUzI1NiJ9.…",          // LiveKit JWT, single-room scope
  "identity": "SaraDev",
  "roomName": "community",
  "expiresAt": "2026-10-27T14:03:34.433Z"    // ~10 min TTL
}

خطاها: 403 {"error":"wrong_password"} · 404 اتاق پیدا نشد · 409 اتاق پر یا پایان‌یافته · 429 محدودیت نرخ

API اجاره‌ای — کلید Bearer

اتاق‌های متعلق به شما، برای محصولات تولیدی

هر اتاق متعلق به یک اجاره‌کننده است. با شناسهٔ همبستهٔ خودتان اتاق بسازید، توکن host/guest ضرب کنید، شرکت‌کنندگان زنده را ببینید و اتاق را سمت سرور پایان دهید. کلیدها (rtck_…) توسط اپراتور صادر می‌شوند و فقط در بک‌اند شما زندگی می‌کنند.

header — on every tenant call
Authorization: Bearer rtck_live_9f2…   # never ship this to a front-end
POST /v1/rooms 201 Created

ساخت اتاق اجاره‌ای (idempotent)

هدر Idempotency-Key بفرستید (رشتهٔ یکتا، تا ۱۲۸ نویسه) — تلاش مجدد با همان کلید، به‌جای ساخت نسخهٔ تکراری، همان اتاق اصلی را برمی‌گرداند.

فیلدنوعالزامیتوضیح
externalIdstring ≤128خیرمرجع خودتان (مثل appointment-123)؛ در هر پاسخ اتاق برمی‌گردد.
maxParticipantsintegerخیرپیش‌فرض ۳ (سقف فعلی سمت سرور).
expiresInSecondsintegerخیرپیش‌فرض 7200 (۲ ساعت)؛ حداکثر تا ۲۴ ساعت (86400). بعد از انقضا، اتاق جمع می‌شود و توکن‌های کهنه کار نمی‌کنند.
metadatastring ≤512خیرحبابِ opaque برای دفترداری خودتان — کوچک نگهش دارید.
Room — application/json
{
  "roomId": "b21b2f50-7a1d-4f6e-9c8f-3d2a1b4c5d6e",
  "tenantId": "t_9a8b7c6d",
  "externalId": "appointment-123",
  "status": "active",
  "maxParticipants": 3,
  "createdAt": "2026-10-26T10:00:00.000Z",
  "expiresAt": "2026-10-26T12:00:00.000Z"
}

خطاها: 401 کلید ناموجود/نامعتبر · 429 محدودیت نرخ

POST /v1/rooms/{roomId}/tokens 201 Created

ضرب توکن برای یک شرکت‌کننده

از بک‌اند، به‌ازای هر کاربر و درست قبل از ورودش صدایش بزنید. نقش host یا guest سمت سرور به دسترسی‌ها نگاشت می‌شود.

فیلدنوعالزامیتوضیح
identitystring ≤128بلهیکتا در اتاق؛ به بقیه نشان داده می‌شود.
namestring ≤128خیرنام نمایشی خوانا برای انسان‌ها.
rolehost | guestخیرپیش‌فرض guest.
ttlSecondsintegerخیرپیش‌فرض 600 (۱۰ دقیقه). توکن‌ها قابل تمدید نیستند — بعد از انقضا دوباره ضرب کنید.
application/json — 201
{
  "token": "eyJhbGciOiJIUzI1NiJ9.…",
  "wsUrl": "wss://rtc.videorayan.ir",
  "identity": "host-1",
  "expiresAt": "2026-10-27T14:07:29.974Z"
}

خطاها: 401 احراز هویت · 403 اتاق مال شما نیست · 404 اتاق ناشناخته · 409 اتاق پر یا پایان‌یافته

GET /v1/whoami

بررسی کلید، بدون عوارض جانبی

نام اجاره‌کنندهٔ پشت کلید شما را برمی‌گرداند (401 اگر نامعتبر باشد).

200
{"tenant":"acme"}
GET /v1/rooms/{id}/participants

فهرست زندهٔ حاضران

همهٔ کسانی که الان متصل‌اند (فقط اجاره‌کنندهٔ مالک). خطا: 403 اتاق مال شما نیست.

200
{"participants":[]}
DELETE /v1/rooms/{id}

پایان دادن به اتاق

اتاق بسته می‌شود، همه قطع می‌شوند، توکن‌های جدید رد و ورود مجدد مسدود می‌شود. وضعیت: ended (یا expired توسط sweeper).

204 No Content
# empty body — the room is gone
خطاها و محدودیت‌ها

کدهایی که باید مدیریت‌شان کنید

بدنه‌های خطا قطعی‌اند و شکل‌های زیر عیناً از تولید ثبت شده‌اند. خطای اعتبارسنجی همیشه با کد 400 و برچسب invalid_input می‌آید.

وضعیتبدنهٔ واقعیمعنیاقدام کلاینت
400{"error":"invalid_input"}اعتبارسنجی بدنه رد شد (طول فیلدها، فیلد ناشناخته)بدنه را طبق مستندات اصلاح کنید
401—کلید اجاره‌ای ناموجود یا نامعتبرهدر Authorization را بررسی و کلید را بچرخانید
403{"error":"wrong_password"}رمز اتاق اشتباه/ناموجود، یا اتاق مال شما نیسترمز را دوباره بپرسید / مالکیت را بررسی کنید
404{"error":"room_not_found"}پیدا نشد — شامل کاوشِ بین‌اجاره‌ای (ضد-کاوش)لینک را تازه کنید؛ کورکورانه retry نکنید
409—اتاق پر است یا پایان‌یافته/منقضی«پر/تمام‌شده» را به کاربر نشان دهید
429—محدودیت نرخ (۱۲۰ در دقیقه به‌ازای هر IP یا کلید)بک‌آف نمایی؛ به Retry-After احترام بگذارید

عمر توکن

پیش‌فرض حدود ۱۰ دقیقه (در پاسخ با expiresAt). مثل اعتبارنامه با آن رفتار کنید و به‌ازای هر جلسه تازه ضرب کنید.

عمر اتاق

اتاق‌های رایگان ۱۲ ساعت زنده می‌مانند؛ اتاق‌های اجاره‌ای تا ۲۴ ساعت. اتاق‌های منقضی هر ۶۰ ثانیه جمع‌آوری می‌شوند.

نرخ درخواست

۱۲۰ درخواست در دقیقه به‌ازای هر IP (سطح عمومی) یا کلید. برای بودجهٔ بزرگ‌تر، درخواست منابع بدهید.

سلامت سرویس و قرارداد

Health و قرارداد ماشینی

GET /v1/health

سرویس زنده است. بدون احراز هویت و بدون اطلاعات حساس — مانیتورهایتان را همین‌جا ببندید. پاسخ: {"status":"ok"}

GET /v1/openapi.yaml

قرارداد زندهٔ OpenAPI 3.0، سرو‌شده توسط خودِ API کنترل. وارد Postman یا Insomnia کنید یا کلاینت تولید کنید.

openapi.json ایستا

نسخهٔ JSON ایستا که هر دو سطح عمومی و اجاره‌ای را پوشش می‌دهد: en.videorayan.ir/openapi.json

healthcheck.sh — re-verify in one line
curl -fsS https://api.videorayan.ir/v1/health \
  && curl -fsS https://videorayan.ir/api/v1/health \
  && curl -fsS https://api.videorayan.ir/v1/openapi.yaml -o /dev/null -w "openapi: %{http_code}\n"
# {"status":"ok"} {"status":"ok"} openapi: 200
مسیر دوم همان /api/v1/* روی دامنهٔ اصلی است — روی *.videorayan.ir به API پروکسی می‌شود و مرورگرها اصلاً با CORS درگیر نمی‌شوند.
جامعه و بازخورد

زنده حرف بزنیم — و مسیر را با هم بسازیم

اندپوینتی کم دارد یا پاسخی غافلگیرکننده دیدید؟ در اتاق اجتماعی زنده بگویید یا خط بازخورد را بنویسید — هر گزارش مستقیم به اپراتور می‌رسد و قرارداد را با هم بهتر می‌کنیم.

آمادهٔ ساختن هستید؟

با API عمومیِ رایگان شروع کنید و وقتی مالکیت و نقش خواستید، به اتاق‌های اجاره‌ای برسید — کد کلاینت در هر دو یکی است.