پرش به محتوا
مستندات API · نسخه 1.0.0

مرجع API

همه مسیرها زیر https://YOUR-DOMAIN/api/v1 هستند، JSON می‌گیرند و JSON برمی‌گردانند. در هر بخش می‌توانید با کلید خودتان درخواست واقعی بفرستید.

احراز هویت

کلید API را از پنل → توسعه‌دهندگان بسازید و در هدر Authorization: Bearer <key> بفرستید. کلید فقط یک بار نمایش داده می‌شود؛ آن را در سمت سرور نگه دارید و هرگز در مرورگر یا اپ موبایل قرار ندهید. دسترسی API به پکیج حساب بستگی دارد.

bash
export OCP_API_KEY="ocp_xxxxxxxx_yyyyyyyyyyyyyyyy"
curl https://YOUR-DOMAIN/api/v1/rooms -H "Authorization: Bearer $OCP_API_KEY"

خطاها، تکرار امن و صفحه‌بندی

  • • API عمومی پلتفرم کلاس آنلاین. احراز هویت با هدر Authorization: Bearer <api_key>.
  • • خطاها قالب یکسان دارند: { "error": { "code", "message", "message_fa", "details" } }.
  • • عملیات ساخت از هدر Idempotency-Key پشتیبانی می‌کنند.
  • • فهرست‌ها با limit و cursor صفحه‌بندی می‌شوند؛ nextCursor را برای صفحه بعد بفرستید.
  • • کدهای مهم: 401 کلید نامعتبر، 402 محدودیت پکیج، 404 یافت نشد، 409 تکراری، 429 درخواست زیاد؛ کمی بعد دوباره تلاش کنید.
error response
{
  "error": {
    "code": "quota_exceeded",
    "message": "plan limit reached",
    "message_fa": "حداکثر ۳ کلاس هم‌زمان در پکیج شما مجاز است."
  }
}

Webhook

رویدادها با POST و بدنه { id, type, createdAt, data } ارسال می‌شوند. امضا در هدر X-OCP-Signature: t=<unix>,v1=<hex> برابر HMAC-SHA256 رشته "<t>.<body>" با کلید امضاست. پاسخ غیر 2xx تا ۵ بار (۱ دقیقه، ۵ دقیقه، ۳۰ دقیقه، ۲ ساعت، ۱۲ ساعت) تکرار می‌شود و X-OCP-Delivery در تکرارها ثابت است.

رویدادزمان ارسال
room.startedاولین نفر وارد کلاس شد و جلسه شروع شد
room.endedجلسه تمام شد (همراه با نفر-دقیقه و اوج حضور)
participant.joinedهر ورود به کلاس
participant.leftهر خروج از کلاس
attendance.readyگزارش حضور جلسه نهایی شد
recording.readyفایل ضبط آماده پخش است
payment.succeededپرداخت پکیج تأیید شد
quota.exhaustedسهمیه دقیقه‌های دوره تمام شد

کتابخانه‌ها (SDK)

کتابخانه رسمی برای Node.js (با تایپ‌های TypeScript) و PHP؛ هر دو تکرار امن درخواست‌ها، تلاش دوباره در خطاهای موقت و بررسی امضای Webhook را خودشان انجام می‌دهند. کد منبع در پوشه sdk/ مخزن است.

Node.js — npm i @ocp/sdk
import { Ocp, verifyWebhook } from '@ocp/sdk';

const ocp = new Ocp({ baseUrl: 'https://YOUR-DOMAIN', apiKey: process.env.OCP_API_KEY });

const room = await ocp.rooms.create({ title: 'Math 101', slug: 'math-101' });
const link = await ocp.rooms.joinLink(room.id, {
  role: 'participant', name: 'Sara Ahmadi', externalUserId: 'lms-42', maxUses: 1,
});

// webhook endpoint (raw body!)
const event = verifyWebhook(process.env.OCP_WEBHOOK_SECRET, req.headers['x-ocp-signature'], rawBody);
if (event.type === 'attendance.ready') { /* … */ }
PHP — composer require ocp/sdk
<?php
use Ocp\Client;
use Ocp\Webhook;

$ocp = new Client('https://YOUR-DOMAIN', getenv('OCP_API_KEY'));

$room = $ocp->rooms->create(['title' => 'Math 101', 'slug' => 'math-101']);
$link = $ocp->rooms->joinLink($room['id'], [
    'role' => 'participant', 'name' => 'Sara Ahmadi', 'externalUserId' => 'lms-42',
]);

// webhook endpoint
$event = Webhook::verify(getenv('OCP_WEBHOOK_SECRET'),
    $_SERVER['HTTP_X_OCP_SIGNATURE'] ?? '', file_get_contents('php://input'));

کلاس‌ها

ساخت، ویرایش، سیاست ورود و دسترسی کلاس‌ها.

GET/api/v1/rooms

لیست اتاق‌ها

پارامترها

  • cursorstring
    کوئری
  • limitinteger= 20
    کوئری
  • profile"class" | "meeting" | "webinar"
    کوئری
200
درخواست
curl -X GET "https://YOUR-DOMAIN/api/v1/rooms" \
  -H "Authorization: Bearer $OCP_API_KEY"
پاسخ 200
{
  "data": [
    {
      "title": "Math 101",
      "slug": "math-101",
      "profile": "class",
      "settings": {
        "exitUrl": "https://class.example.ir/r/school/math-101"
      }
    }
  ],
  "nextCursor": null
}
POST/api/v1/rooms

ساخت اتاق

بدنه درخواست

  • titlestringrequired
  • slugstring
  • profile"class" | "meeting" | "webinar"
  • settingsobject
    تنظیمات اختصاصی کلاس روی قالب. `exitUrl` (آدرس http/https) جایی است که «خروج از کلاس» به آن برمی‌گردد؛ برای کلاس‌هایی که سامانهٔ دیگری (مثلاً LMS) می‌سازد.
  • settings.exitUrlstring (uri)
  • entryPolicyobject
  • entryPolicy.visibility"public" | "protected" | "private" | "mixed"
  • entryPolicy.guestobject
  • entryPolicy.guest.enabledboolean= true
  • entryPolicy.guest.capinteger | null
  • entryPolicy.guest.role"participant" | "viewer"= "participant"
  • entryPolicy.guest.lobbyboolean= false
  • entryPolicy.guest.requireOtpboolean= false
  • entryPolicy.passwordobject
  • entryPolicy.password.participantstring | null
  • entryPolicy.password.presenterstring | null
  • entryPolicy.membersboolean= true
    ورود کاربران تعریف‌شده
  • entryPolicy.earlyJoinMinutesinteger= 10
  • entryPolicy.waitForPresenterboolean= true
  • scheduleobject
  • schedule.startsAtstring (date-time)
  • schedule.endsAtstring (date-time)
  • schedule.rrulestring
  • autoRecordboolean

با هدر Idempotency-Key (یک UUID) می‌توانید درخواست را بدون نگرانی از ساخت دوباره، تکرار کنید.

201400402
درخواست
curl -X POST "https://YOUR-DOMAIN/api/v1/rooms" \
  -H "Authorization: Bearer $OCP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"Math 101","slug":"math-101","profile":"class","settings":{"exitUrl":"https://class.example.ir/r/school/math-101"}}'
پاسخ 201
{
  "title": "Math 101",
  "slug": "math-101",
  "profile": "class",
  "settings": {
    "exitUrl": "https://class.example.ir/r/school/math-101"
  }
}
GET/api/v1/rooms/{id}

جزئیات

پارامترها

  • idstring (uuid)required
    مسیر
200404
درخواست
curl -X GET "https://YOUR-DOMAIN/api/v1/rooms/{id}" \
  -H "Authorization: Bearer $OCP_API_KEY"
پاسخ 200
{
  "title": "Math 101",
  "slug": "math-101",
  "profile": "class",
  "settings": {
    "exitUrl": "https://class.example.ir/r/school/math-101"
  }
}
PATCH/api/v1/rooms/{id}

ویرایش

پارامترها

  • idstring (uuid)required
    مسیر

بدنه درخواست (اختیاری)

  • titlestringrequired
  • slugstring
  • profile"class" | "meeting" | "webinar"
  • settingsobject
    تنظیمات اختصاصی کلاس روی قالب. `exitUrl` (آدرس http/https) جایی است که «خروج از کلاس» به آن برمی‌گردد؛ برای کلاس‌هایی که سامانهٔ دیگری (مثلاً LMS) می‌سازد.
  • settings.exitUrlstring (uri)
  • entryPolicyobject
  • entryPolicy.visibility"public" | "protected" | "private" | "mixed"
  • entryPolicy.guestobject
  • entryPolicy.guest.enabledboolean= true
  • entryPolicy.guest.capinteger | null
  • entryPolicy.guest.role"participant" | "viewer"= "participant"
  • entryPolicy.guest.lobbyboolean= false
  • entryPolicy.guest.requireOtpboolean= false
  • entryPolicy.passwordobject
  • entryPolicy.password.participantstring | null
  • entryPolicy.password.presenterstring | null
  • entryPolicy.membersboolean= true
    ورود کاربران تعریف‌شده
  • entryPolicy.earlyJoinMinutesinteger= 10
  • entryPolicy.waitForPresenterboolean= true
  • scheduleobject
  • schedule.startsAtstring (date-time)
  • schedule.endsAtstring (date-time)
  • schedule.rrulestring
  • autoRecordboolean
200
درخواست
curl -X PATCH "https://YOUR-DOMAIN/api/v1/rooms/{id}" \
  -H "Authorization: Bearer $OCP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"Math 101","slug":"math-101","profile":"class","settings":{"exitUrl":"https://class.example.ir/r/school/math-101"}}'
پاسخ 200
{
  "title": "Math 101",
  "slug": "math-101",
  "profile": "class",
  "settings": {
    "exitUrl": "https://class.example.ir/r/school/math-101"
  }
}
DELETE/api/v1/rooms/{id}

حذف

پارامترها

  • idstring (uuid)required
    مسیر
204
درخواست
curl -X DELETE "https://YOUR-DOMAIN/api/v1/rooms/{id}" \
  -H "Authorization: Bearer $OCP_API_KEY"
PATCH/api/v1/rooms/{id}/entry-policy

روش‌های ورود

پارامترها

  • idstring (uuid)required
    مسیر

بدنه درخواست (اختیاری)

  • visibility"public" | "protected" | "private" | "mixed"
  • guestobject
  • guest.enabledboolean= true
  • guest.capinteger | null
  • guest.role"participant" | "viewer"= "participant"
  • guest.lobbyboolean= false
  • guest.requireOtpboolean= false
  • passwordobject
  • password.participantstring | null
  • password.presenterstring | null
  • membersboolean= true
    ورود کاربران تعریف‌شده
  • earlyJoinMinutesinteger= 10
  • waitForPresenterboolean= true
200
درخواست
curl -X PATCH "https://YOUR-DOMAIN/api/v1/rooms/{id}/entry-policy" \
  -H "Authorization: Bearer $OCP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"visibility":"public","guest":{"enabled":true,"cap":null,"role":"participant","lobby":false},"password":"class-pass","members":true}'
پاسخ 200
{
  "visibility": "public",
  "guest": {
    "enabled": true,
    "cap": null,
    "role": "participant",
    "lobby": false
  },
  "password": "class-pass",
  "members": true
}
PUT/api/v1/rooms/{id}/access

تعیین دسترسی کاربران و گروه‌ها

پارامترها

  • idstring (uuid)required
    مسیر

بدنه درخواست (اختیاری)

  • entriesobject[]
200
درخواست
curl -X PUT "https://YOUR-DOMAIN/api/v1/rooms/{id}/access" \
  -H "Authorization: Bearer $OCP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"entries":[{"userId":"userId","groupId":"groupId","role":"host"}]}'
GET/api/v1/rooms/{id}/bans

افراد مسدودشده از کلاس

کسانی که میزبان آن‌ها را اخراج و مسدود کرده است. تا رفع مسدودیت نمی‌توانند دوباره وارد شوند.

پارامترها

  • idstring (uuid)required
    مسیر
200
درخواست
curl -X GET "https://YOUR-DOMAIN/api/v1/rooms/{id}/bans" \
  -H "Authorization: Bearer $OCP_API_KEY"
پاسخ 200
{
  "data": [
    {
      "id": "id",
      "name": "Sara Ahmadi",
      "createdAt": "2026-11-20T09:00:00Z"
    }
  ]
}
DELETE/api/v1/rooms/{id}/bans/{banId}

رفع مسدودیت

پارامترها

  • idstring (uuid)required
    مسیر
  • banIdstringrequired
    مسیر
204
درخواست
curl -X DELETE "https://YOUR-DOMAIN/api/v1/rooms/{id}/bans/{banId}" \
  -H "Authorization: Bearer $OCP_API_KEY"
POST/api/v1/rooms/{id}/end

پایان جلسه

پارامترها

  • idstring (uuid)required
    مسیر
200
درخواست
curl -X POST "https://YOUR-DOMAIN/api/v1/rooms/{id}/end" \
  -H "Authorization: Bearer $OCP_API_KEY"
GET/api/v1/rooms/{id}/live

وضعیت زنده

پارامترها

  • idstring (uuid)required
    مسیر
200
درخواست
curl -X GET "https://YOUR-DOMAIN/api/v1/rooms/{id}/live" \
  -H "Authorization: Bearer $OCP_API_KEY"
پاسخ 200
{
  "live": true,
  "sessionId": "sessionId",
  "participants": [
    {
      "identity": "identity",
      "name": "Sara Ahmadi",
      "role": "host",
      "joinedAt": "2026-11-20T09:00:00Z"
    }
  ]
}
POST/api/v1/files

آپلود اسلاید

201
درخواست
curl -X POST "https://YOUR-DOMAIN/api/v1/files" \
  -H "Authorization: Bearer $OCP_API_KEY"

حضور و غیاب

جلسه‌های برگزارشده و گزارش دقیق حضور هر نفر.

GET/api/v1/rooms/{id}/sessions

جلسه‌های برگزارشده این کلاس

هر بار که کلاس شروع و تمام می‌شود یک جلسه (session) ثبت می‌شود؛ شناسه آن برای گرفتن گزارش حضور لازم است.

پارامترها

  • idstring (uuid)required
    مسیر
200
درخواست
curl -X GET "https://YOUR-DOMAIN/api/v1/rooms/{id}/sessions" \
  -H "Authorization: Bearer $OCP_API_KEY"
GET/api/v1/sessions/{id}/polls

نظرسنجی‌ها و آزمون‌های سر کلاس

هر پرسش با شمار پاسخ هر گزینه، پاسخ درست (در حالت آزمون) و پاسخ هر نفر (جز نظرسنجی ناشناس). رویداد Webhook poll.closed هم همین را می‌فرستد.

پارامترها

  • idstring (uuid)required
    مسیر
  • format"json" | "csv"= "json"
    کوئری
200
درخواست
curl -X GET "https://YOUR-DOMAIN/api/v1/sessions/{id}/polls" \
  -H "Authorization: Bearer $OCP_API_KEY"
GET/api/v1/sessions/{id}/attendance

گزارش حضور و غیاب

پارامترها

  • idstring (uuid)required
    مسیر
  • format"json" | "csv" | "xlsx"= "json"
    کوئری
200
درخواست
curl -X GET "https://YOUR-DOMAIN/api/v1/sessions/{id}/attendance" \
  -H "Authorization: Bearer $OCP_API_KEY"
پاسخ 200
{
  "data": [
    {
      "identity": "identity",
      "name": "Sara Ahmadi",
      "externalUserId": "lms-42",
      "isGuest": true
    }
  ]
}

ضبط

شروع و توقف ضبط، لینک پخش و دانلود و اشتراک‌گذاری.

POST/api/v1/rooms/{id}/recordings/start

شروع ضبط

پارامترها

  • idstring (uuid)required
    مسیر
201
درخواست
curl -X POST "https://YOUR-DOMAIN/api/v1/rooms/{id}/recordings/start" \
  -H "Authorization: Bearer $OCP_API_KEY"
پاسخ 201
{
  "id": "id",
  "status": "recording",
  "playUrl": "playUrl",
  "downloadUrl": "downloadUrl"
}
POST/api/v1/rooms/{id}/recordings/stop

توقف ضبط

پارامترها

  • idstring (uuid)required
    مسیر
200
درخواست
curl -X POST "https://YOUR-DOMAIN/api/v1/rooms/{id}/recordings/stop" \
  -H "Authorization: Bearer $OCP_API_KEY"
GET/api/v1/recordings

لیست ضبط‌ها

پارامترها

  • cursorstring
    کوئری
  • limitinteger= 20
    کوئری
  • roomIdstring
    کوئری
200
درخواست
curl -X GET "https://YOUR-DOMAIN/api/v1/recordings" \
  -H "Authorization: Bearer $OCP_API_KEY"
GET/api/v1/recordings/{id}

لینک پخش و دانلود

لینک‌های پخش و دانلود امضاشده و کوتاه‌مدت‌اند؛ هر بار از همین مسیر بگیرید.

پارامترها

  • idstring (uuid)required
    مسیر
200
درخواست
curl -X GET "https://YOUR-DOMAIN/api/v1/recordings/{id}" \
  -H "Authorization: Bearer $OCP_API_KEY"
پاسخ 200
{
  "id": "id",
  "status": "recording",
  "playUrl": "playUrl",
  "downloadUrl": "downloadUrl"
}
DELETE/api/v1/recordings/{id}

حذف ضبط

پارامترها

  • idstring (uuid)required
    مسیر
204
درخواست
curl -X DELETE "https://YOUR-DOMAIN/api/v1/recordings/{id}" \
  -H "Authorization: Bearer $OCP_API_KEY"
POST/api/v1/recordings/{id}/share

ساخت یا ابطال لینک اشتراک

لینک عمومی پخش بدون نیاز به ورود. با enabled=false لینک قبلی باطل می‌شود.

پارامترها

  • idstring (uuid)required
    مسیر

بدنه درخواست (اختیاری)

  • enabledbooleanrequired
200
درخواست
curl -X POST "https://YOUR-DOMAIN/api/v1/recordings/{id}/share" \
  -H "Authorization: Bearer $OCP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"enabled":true}'

مصرف

دقیقه‌های مصرف و فضای ضبط حساب.

GET/api/v1/usage

مصرف حساب

200
درخواست
curl -X GET "https://YOUR-DOMAIN/api/v1/usage" \
  -H "Authorization: Bearer $OCP_API_KEY"
GET/api/v1/usage/daily

مصرف روزانه

پارامترها

  • daysinteger= 30
    کوئری
200
درخواست
curl -X GET "https://YOUR-DOMAIN/api/v1/usage/daily" \
  -H "Authorization: Bearer $OCP_API_KEY"

کاربران و گروه‌ها

دانش‌آموزان و استادان سازمان، ورود گروهی و گروه‌بندی.

GET/api/v1/users

کاربران سازمان

200
درخواست
curl -X GET "https://YOUR-DOMAIN/api/v1/users" \
  -H "Authorization: Bearer $OCP_API_KEY"
POST/api/v1/users

ساخت کاربر

بدنه درخواست (اختیاری)

  • displayNamestringrequired
  • usernamestring
  • mobilestring
  • passwordstring
  • externalIdstring
  • groupsstring[]
201
درخواست
curl -X POST "https://YOUR-DOMAIN/api/v1/users" \
  -H "Authorization: Bearer $OCP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"displayName":"سارا احمدی","username":"sara.ahmadi","mobile":"09120000000","password":"class-pass"}'
PATCH/api/v1/users/{id}

ویرایش

پارامترها

  • idstring (uuid)required
    مسیر
200
درخواست
curl -X PATCH "https://YOUR-DOMAIN/api/v1/users/{id}" \
  -H "Authorization: Bearer $OCP_API_KEY"
DELETE/api/v1/users/{id}

حذف

پارامترها

  • idstring (uuid)required
    مسیر
204
درخواست
curl -X DELETE "https://YOUR-DOMAIN/api/v1/users/{id}" \
  -H "Authorization: Bearer $OCP_API_KEY"
POST/api/v1/users/import

ورود گروهی (xlsx/csv)

202
درخواست
curl -X POST "https://YOUR-DOMAIN/api/v1/users/import" \
  -H "Authorization: Bearer $OCP_API_KEY"
GET/api/v1/groups

گروه‌ها

200
درخواست
curl -X GET "https://YOUR-DOMAIN/api/v1/groups" \
  -H "Authorization: Bearer $OCP_API_KEY"
POST/api/v1/groups

ساخت گروه

201
درخواست
curl -X POST "https://YOUR-DOMAIN/api/v1/groups" \
  -H "Authorization: Bearer $OCP_API_KEY"
PATCH/api/v1/groups/{id}

ویرایش و اعضا

پارامترها

  • idstring (uuid)required
    مسیر
200
درخواست
curl -X PATCH "https://YOUR-DOMAIN/api/v1/groups/{id}" \
  -H "Authorization: Bearer $OCP_API_KEY"
DELETE/api/v1/groups/{id}

حذف

پارامترها

  • idstring (uuid)required
    مسیر
204
درخواست
curl -X DELETE "https://YOUR-DOMAIN/api/v1/groups/{id}" \
  -H "Authorization: Bearer $OCP_API_KEY"

Webhook

دریافت لحظه‌ای رویدادها روی سرور شما.

GET/api/v1/webhooks

لیست

200
درخواست
curl -X GET "https://YOUR-DOMAIN/api/v1/webhooks" \
  -H "Authorization: Bearer $OCP_API_KEY"
POST/api/v1/webhooks

تعریف Webhook

بدنه درخواست (اختیاری)

  • urlstring (uri)required
  • events"room.started" | "room.ended" | "participant.joined" | "participant.left" | "recording.ready" | "attendance.ready" | "poll.closed" | "payment.succeeded" | "quota.exhausted"[]required
201
درخواست
curl -X POST "https://YOUR-DOMAIN/api/v1/webhooks" \
  -H "Authorization: Bearer $OCP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://lms.example.ir/hooks/ocp","events":["room.ended","attendance.ready"]}'
PATCH/api/v1/webhooks/{id}

ویرایش (نشانی، رویدادها، فعال/غیرفعال)

پارامترها

  • idstring (uuid)required
    مسیر
200
درخواست
curl -X PATCH "https://YOUR-DOMAIN/api/v1/webhooks/{id}" \
  -H "Authorization: Bearer $OCP_API_KEY"
DELETE/api/v1/webhooks/{id}

حذف

پارامترها

  • idstring (uuid)required
    مسیر
204
درخواست
curl -X DELETE "https://YOUR-DOMAIN/api/v1/webhooks/{id}" \
  -H "Authorization: Bearer $OCP_API_KEY"
POST/api/v1/webhooks/{id}/test

ارسال رویداد آزمایشی webhook.test

پارامترها

  • idstring (uuid)required
    مسیر
202
درخواست
curl -X POST "https://YOUR-DOMAIN/api/v1/webhooks/{id}/test" \
  -H "Authorization: Bearer $OCP_API_KEY"
POST/api/v1/webhooks/{id}/rotate-secret

تولید secret جدید

پارامترها

  • idstring (uuid)required
    مسیر
200
درخواست
curl -X POST "https://YOUR-DOMAIN/api/v1/webhooks/{id}/rotate-secret" \
  -H "Authorization: Bearer $OCP_API_KEY"
GET/api/v1/webhooks/{id}/deliveries

گزارش ارسال‌ها (۱۰۰ مورد آخر)

پارامترها

  • idstring (uuid)required
    مسیر
200
درخواست
curl -X GET "https://YOUR-DOMAIN/api/v1/webhooks/{id}/deliveries" \
  -H "Authorization: Bearer $OCP_API_KEY"
POST/api/v1/webhooks/{id}/deliveries/{deliveryId}/redeliver

ارسال دوباره یک رویداد

همان بدنه و همان X-OCP-Delivery دوباره ارسال می‌شود (با امضای کلید فعلی).

پارامترها

  • idstring (uuid)required
    مسیر
  • deliveryIdstring (uuid)required
    مسیر
202
درخواست
curl -X POST "https://YOUR-DOMAIN/api/v1/webhooks/{id}/deliveries/{deliveryId}/redeliver" \
  -H "Authorization: Bearer $OCP_API_KEY"
GET/api/v1/webhooks/events

فهرست رویدادهای قابل اشتراک

200
درخواست
curl -X GET "https://YOUR-DOMAIN/api/v1/webhooks/events" \
  -H "Authorization: Bearer $OCP_API_KEY"