diff --git a/apps/api/openapi.json b/apps/api/openapi.json index 7fff747f3..c3d6a846c 100644 --- a/apps/api/openapi.json +++ b/apps/api/openapi.json @@ -43,6 +43,7 @@ } } }, + "operationId": "health", "security": [] } }, @@ -113,6 +114,7 @@ } } }, + "operationId": "ready", "security": [] } }, @@ -536,6 +538,7 @@ } } }, + "operationId": "listCommunities", "security": [ { "apiKey": [] @@ -1080,6 +1083,7 @@ } } }, + "operationId": "createCommunity", "security": [ { "apiKey": [] @@ -1522,6 +1526,7 @@ } } }, + "operationId": "getCommunity", "security": [ { "apiKey": [] @@ -2176,6 +2181,7 @@ } } }, + "operationId": "updateCommunity", "security": [ { "apiKey": [] @@ -2387,6 +2393,7 @@ } } }, + "operationId": "deleteCommunity", "security": [ { "apiKey": [] @@ -2629,6 +2636,7 @@ } } }, + "operationId": "getSalesPage", "security": [ { "apiKey": [] @@ -3203,6 +3211,7 @@ } } }, + "operationId": "addCommunityCategory", "security": [ { "apiKey": [] @@ -3727,6 +3736,7 @@ } } }, + "operationId": "deleteCommunityCategory", "security": [ { "apiKey": [] @@ -4108,6 +4118,7 @@ } } }, + "operationId": "listCommunityMembers", "security": [ { "apiKey": [] @@ -4506,6 +4517,7 @@ } } }, + "operationId": "inviteCommunityMember", "security": [ { "apiKey": [] @@ -4909,6 +4921,7 @@ } } }, + "operationId": "updateCommunityMembership", "security": [ { "apiKey": [] @@ -5407,6 +5420,7 @@ } } }, + "operationId": "listCommunityPosts", "security": [ { "apiKey": [] @@ -5901,6 +5915,7 @@ } } }, + "operationId": "createCommunityPost", "security": [ { "apiKey": [] @@ -6396,6 +6411,7 @@ } } }, + "operationId": "updateCommunityPost", "security": [ { "apiKey": [] @@ -6607,6 +6623,7 @@ } } }, + "operationId": "deleteCommunityPost", "security": [ { "apiKey": [] @@ -7085,6 +7102,7 @@ } } }, + "operationId": "listCommunityComments", "security": [ { "apiKey": [] @@ -7543,6 +7561,7 @@ } } }, + "operationId": "createCommunityComment", "security": [ { "apiKey": [] @@ -7998,6 +8017,7 @@ } } }, + "operationId": "updateCommunityComment", "security": [ { "apiKey": [] @@ -8209,6 +8229,7 @@ } } }, + "operationId": "deleteCommunityComment", "security": [ { "apiKey": [] @@ -8526,6 +8547,7 @@ } } }, + "operationId": "toggleCommunityReaction", "security": [ { "apiKey": [] @@ -8757,6 +8779,7 @@ } } }, + "operationId": "toggleCommunityPostSubscription", "security": [ { "apiKey": [] @@ -9320,6 +9343,7 @@ } } }, + "operationId": "createCommunityReport", "security": [ { "apiKey": [] @@ -9855,6 +9879,7 @@ } } }, + "operationId": "listCommunityReports", "security": [ { "apiKey": [] @@ -10392,6 +10417,7 @@ } } }, + "operationId": "listProductDiscussionReports", "security": [ { "apiKey": [] @@ -10893,6 +10919,7 @@ } } }, + "operationId": "updateCommunityReport", "security": [ { "apiKey": [] @@ -11348,6 +11375,7 @@ } } }, + "operationId": "listLearnerCommunities", "security": [] } }, @@ -11630,6 +11658,7 @@ } } }, + "operationId": "listSpaces", "security": [ { "apiKey": [] @@ -12082,6 +12111,7 @@ } } }, + "operationId": "createSpace", "security": [ { "apiKey": [] @@ -12425,6 +12455,7 @@ } } }, + "operationId": "getSpace", "security": [ { "apiKey": [] @@ -12939,6 +12970,7 @@ } } }, + "operationId": "updateSpace", "security": [ { "apiKey": [] @@ -13222,6 +13254,7 @@ } } }, + "operationId": "deleteSpace", "security": [ { "apiKey": [] @@ -13590,6 +13623,7 @@ } } }, + "operationId": "orderSpaces", "security": [ { "apiKey": [] @@ -13823,6 +13857,7 @@ } } }, + "operationId": "listLearnerSpaces", "security": [] } }, @@ -13976,6 +14011,7 @@ } } }, + "operationId": "followLearnerSpace", "security": [] }, "delete": { @@ -14127,6 +14163,7 @@ } } }, + "operationId": "unfollowLearnerSpace", "security": [] } }, @@ -14444,6 +14481,7 @@ } } }, + "operationId": "createLearnerSpacePost", "security": [] } }, @@ -14938,6 +14976,7 @@ } } }, + "operationId": "getLearnerSpacePost", "security": [] } }, @@ -15416,6 +15455,7 @@ } } }, + "operationId": "listLearnerFeed", "security": [] } }, @@ -15851,6 +15891,7 @@ } } }, + "operationId": "getLearnerCommunity", "security": [] } }, @@ -16342,6 +16383,7 @@ } } }, + "operationId": "listLearnerCommunityPosts", "security": [] }, "post": { @@ -16829,6 +16871,7 @@ } } }, + "operationId": "createLearnerCommunityPost", "security": [] } }, @@ -17212,6 +17255,7 @@ } } }, + "operationId": "getLearnerCommunityPost", "security": [] } }, @@ -17683,6 +17727,7 @@ } } }, + "operationId": "listLearnerCommunityComments", "security": [] }, "post": { @@ -18134,6 +18179,7 @@ } } }, + "operationId": "createLearnerCommunityComment", "security": [] } }, @@ -18582,6 +18628,7 @@ } } }, + "operationId": "updateLearnerCommunityComment", "security": [] }, "delete": { @@ -18786,6 +18833,7 @@ } } }, + "operationId": "deleteLearnerCommunityComment", "security": [] } }, @@ -19063,6 +19111,7 @@ } } }, + "operationId": "authorizeLearnerCommunityMediaUpload", "security": [] } }, @@ -19395,6 +19444,7 @@ } } }, + "operationId": "finalizeLearnerCommunityMediaUpload", "security": [] }, "get": { @@ -19674,6 +19724,7 @@ } } }, + "operationId": "listLearnerCommunityMedia", "security": [] } }, @@ -19942,6 +19993,7 @@ } } }, + "operationId": "authorizeLearnerAvatarMediaUpload", "security": [] } }, @@ -20266,6 +20318,7 @@ } } }, + "operationId": "finalizeLearnerAvatarMediaUpload", "security": [] } }, @@ -20516,6 +20569,7 @@ } } }, + "operationId": "searchLearnerGifs", "security": [] } }, @@ -20826,6 +20880,7 @@ } } }, + "operationId": "toggleLearnerCommunityReaction", "security": [] } }, @@ -21050,6 +21105,7 @@ } } }, + "operationId": "toggleLearnerCommunityPostSubscription", "security": [] } }, @@ -21606,6 +21662,7 @@ } } }, + "operationId": "createLearnerCommunityReport", "security": [] } }, @@ -21808,6 +21865,7 @@ } } }, + "operationId": "listLearnerNotifications", "security": [] } }, @@ -22010,6 +22068,7 @@ } } }, + "operationId": "listAdminNotifications", "security": [] } }, @@ -22123,6 +22182,7 @@ } } }, + "operationId": "listLearnerNotificationPreferences", "security": [] } }, @@ -22321,6 +22381,7 @@ } } }, + "operationId": "updateLearnerNotificationPreference", "security": [] } }, @@ -22509,6 +22570,7 @@ } } }, + "operationId": "markLearnerNotificationRead", "security": [] } }, @@ -22606,6 +22668,7 @@ } } }, + "operationId": "markAllLearnerNotificationsRead", "security": [] } }, @@ -22794,6 +22857,7 @@ } } }, + "operationId": "markAdminNotificationRead", "security": [] } }, @@ -22891,6 +22955,7 @@ } } }, + "operationId": "markAllAdminNotificationsRead", "security": [] } }, @@ -23262,6 +23327,7 @@ } } }, + "operationId": "listLearnerProducts", "security": [] } }, @@ -23533,6 +23599,7 @@ } } }, + "operationId": "cancelLearnerProductSubscription", "security": [] } }, @@ -23751,6 +23818,7 @@ } } }, + "operationId": "leaveLearnerCommunity", "security": [] } }, @@ -24085,6 +24153,7 @@ } } }, + "operationId": "listLearnerCommunityPlans", "security": [] } }, @@ -24520,6 +24589,7 @@ } } }, + "operationId": "startLearnerCommunityCheckout", "security": [] } }, @@ -24815,6 +24885,7 @@ } } }, + "operationId": "getLearnerCommunityCheckout", "security": [] } }, @@ -25206,6 +25277,7 @@ } } }, + "operationId": "listProducts", "security": [ { "apiKey": [] @@ -25584,6 +25656,7 @@ } } }, + "operationId": "createProduct", "security": [ { "apiKey": [] @@ -25932,6 +26005,7 @@ } } }, + "operationId": "listPublicProducts", "security": [] } }, @@ -25971,6 +26045,7 @@ } } }, + "operationId": "getCaptchaConfig", "security": [] } }, @@ -26076,6 +26151,7 @@ } } }, + "operationId": "resolvePublicHost", "security": [] } }, @@ -26428,6 +26504,7 @@ } } }, + "operationId": "createCheckoutSession", "security": [] } }, @@ -26705,6 +26782,7 @@ } } }, + "operationId": "getCheckoutSession", "security": [] } }, @@ -27148,6 +27226,7 @@ } } }, + "operationId": "listPublicCommunities", "security": [] } }, @@ -27537,6 +27616,7 @@ } } }, + "operationId": "getPublicCommunity", "security": [] } }, @@ -27909,6 +27989,7 @@ } } }, + "operationId": "listPublicCommunityPlans", "security": [] } }, @@ -28150,6 +28231,7 @@ } } }, + "operationId": "getPublicSiteSettings", "security": [] } }, @@ -28490,6 +28572,7 @@ } } }, + "operationId": "getPublicSitePage", "security": [] } }, @@ -28771,6 +28854,7 @@ } } }, + "operationId": "listPublicSiteBlogs", "security": [] } }, @@ -29103,6 +29187,7 @@ } } }, + "operationId": "getPublicSiteBlog", "security": [] } }, @@ -29532,6 +29617,7 @@ } } }, + "operationId": "listContacts", "security": [ { "apiKey": [] @@ -30130,6 +30216,7 @@ } } }, + "operationId": "createContact", "security": [ { "apiKey": [] @@ -30518,6 +30605,7 @@ } } }, + "operationId": "getContact", "security": [ { "apiKey": [] @@ -31040,6 +31128,7 @@ } } }, + "operationId": "updateContact", "security": [ { "apiKey": [] @@ -31378,6 +31467,7 @@ } } }, + "operationId": "deleteContact", "security": [ { "apiKey": [] @@ -31731,6 +31821,7 @@ } } }, + "operationId": "updateContactMarketing", "security": [ { "apiKey": [] @@ -32643,6 +32734,7 @@ } } }, + "operationId": "filterPreviewContacts", "security": [ { "apiKey": [] @@ -33123,6 +33215,7 @@ } } }, + "operationId": "listContactSegments", "security": [ { "apiKey": [] @@ -33907,6 +34000,7 @@ } } }, + "operationId": "createContactSegment", "security": [ { "apiKey": [] @@ -34492,6 +34586,7 @@ } } }, + "operationId": "getContactSegment", "security": [ { "apiKey": [] @@ -35393,6 +35488,7 @@ } } }, + "operationId": "updateContactSegment", "security": [ { "apiKey": [] @@ -35675,6 +35771,7 @@ } } }, + "operationId": "deleteContactSegment", "security": [ { "apiKey": [] @@ -35895,6 +35992,7 @@ } } }, + "operationId": "listContactTags", "security": [ { "apiKey": [] @@ -36251,6 +36349,7 @@ } } }, + "operationId": "getContactTagReferences", "security": [ { "apiKey": [] @@ -36619,6 +36718,7 @@ } } }, + "operationId": "renameContactTag", "security": [ { "apiKey": [] @@ -37002,6 +37102,7 @@ } } }, + "operationId": "deleteContactTag", "security": [ { "apiKey": [] @@ -37753,6 +37854,7 @@ } } }, + "operationId": "getContactSegmentMembers", "security": [ { "apiKey": [] @@ -37949,6 +38051,7 @@ } } }, + "operationId": "subscribeNewsletter", "security": [] } }, @@ -38457,6 +38560,7 @@ } } }, + "operationId": "updateProduct", "security": [ { "apiKey": [] @@ -38724,6 +38828,7 @@ } } }, + "operationId": "deleteProduct", "security": [ { "apiKey": [] @@ -39269,6 +39374,7 @@ } } }, + "operationId": "getProduct", "security": [ { "apiKey": [] @@ -39518,6 +39624,7 @@ } } }, + "operationId": "getProductCertificateTemplate", "security": [ { "apiKey": [] @@ -39871,6 +39978,7 @@ } } }, + "operationId": "upsertProductCertificateTemplate", "security": [ { "apiKey": [] @@ -40212,6 +40320,7 @@ } } }, + "operationId": "listPlans", "security": [ { "apiKey": [] @@ -40753,6 +40862,7 @@ } } }, + "operationId": "createPlan", "security": [ { "apiKey": [] @@ -41048,6 +41158,7 @@ } } }, + "operationId": "listPublicPlans", "security": [] } }, @@ -41579,6 +41690,7 @@ } } }, + "operationId": "updatePlan", "security": [ { "apiKey": [] @@ -41977,6 +42089,7 @@ } } }, + "operationId": "setDefaultPlan", "security": [ { "apiKey": [] @@ -42319,6 +42432,7 @@ } } }, + "operationId": "archivePlan", "security": [ { "apiKey": [] @@ -42660,6 +42774,7 @@ } } }, + "operationId": "listCommunityPlans", "security": [ { "apiKey": [] @@ -43201,6 +43316,7 @@ } } }, + "operationId": "createCommunityPlan", "security": [ { "apiKey": [] @@ -43739,6 +43855,7 @@ } } }, + "operationId": "updateCommunityPlan", "security": [ { "apiKey": [] @@ -44137,6 +44254,7 @@ } } }, + "operationId": "setDefaultCommunityPlan", "security": [ { "apiKey": [] @@ -44535,6 +44653,7 @@ } } }, + "operationId": "archiveCommunityPlan", "security": [ { "apiKey": [] @@ -44925,6 +45044,7 @@ } } }, + "operationId": "getPublicProduct", "security": [] } }, @@ -45046,6 +45166,7 @@ } } }, + "operationId": "getPublicLoginMethods", "security": [] } }, @@ -45397,6 +45518,7 @@ } } }, + "operationId": "signUpForLeadMagnet", "security": [] } }, @@ -45779,6 +45901,7 @@ } } }, + "operationId": "getProductAnalytics", "security": [ { "apiKey": [] @@ -46301,6 +46424,7 @@ } } }, + "operationId": "listProductCustomers", "security": [ { "apiKey": [] @@ -46676,6 +46800,7 @@ } } }, + "operationId": "getProductCustomerProgress", "security": [ { "apiKey": [] @@ -47018,6 +47143,7 @@ } } }, + "operationId": "cancelProductCustomerSubscription", "security": [ { "apiKey": [] @@ -47380,6 +47506,7 @@ } } }, + "operationId": "removeProductCustomerAccess", "security": [ { "apiKey": [] @@ -47757,6 +47884,7 @@ } } }, + "operationId": "getSchoolOverview", "security": [ { "apiKey": [] @@ -48056,6 +48184,7 @@ } } }, + "operationId": "createPreviewGrant", "security": [ { "apiKey": [] @@ -48500,6 +48629,7 @@ } } }, + "operationId": "readPreviewProduct", "security": [ { "apiKey": [] @@ -48756,6 +48886,7 @@ } } }, + "operationId": "getPublicLessonMedia", "security": [] } }, @@ -49004,6 +49135,7 @@ } } }, + "operationId": "getPreviewLessonMedia", "security": [ { "apiKey": [] @@ -49220,6 +49352,7 @@ } } }, + "operationId": "getLearnerScormRuntime", "security": [] }, "post": { @@ -49527,6 +49660,7 @@ } } }, + "operationId": "updateLearnerScormRuntime", "security": [] } }, @@ -49847,6 +49981,7 @@ } } }, + "operationId": "processScormPackage", "security": [ { "apiKey": [] @@ -50164,6 +50299,7 @@ } } }, + "operationId": "evaluateLearnerQuiz", "security": [] } }, @@ -50577,6 +50713,7 @@ } } }, + "operationId": "createLesson", "security": [ { "apiKey": [] @@ -50889,6 +51026,7 @@ } } }, + "operationId": "listSections", "security": [ { "apiKey": [] @@ -51230,6 +51368,7 @@ } } }, + "operationId": "createSection", "security": [ { "apiKey": [] @@ -51564,6 +51703,7 @@ } } }, + "operationId": "reorderSections", "security": [ { "apiKey": [] @@ -51964,6 +52104,7 @@ } } }, + "operationId": "reorderLessons", "security": [ { "apiKey": [] @@ -52367,6 +52508,7 @@ } } }, + "operationId": "updateLesson", "security": [ { "apiKey": [] @@ -52634,6 +52776,7 @@ } } }, + "operationId": "deleteLesson", "security": [ { "apiKey": [] @@ -52974,6 +53117,7 @@ } } }, + "operationId": "updateSection", "security": [ { "apiKey": [] @@ -53241,6 +53385,7 @@ } } }, + "operationId": "deleteSection", "security": [ { "apiKey": [] @@ -53475,6 +53620,7 @@ } } }, + "operationId": "getSectionDripEmail", "security": [ { "apiKey": [] @@ -53794,6 +53940,7 @@ } } }, + "operationId": "updateSectionDripEmail", "security": [ { "apiKey": [] @@ -54096,6 +54243,7 @@ } } }, + "operationId": "authorizeMediaUpload", "security": [ { "apiKey": [] @@ -54491,6 +54639,7 @@ } } }, + "operationId": "finalizeMediaUpload", "security": [ { "apiKey": [] @@ -54845,6 +54994,7 @@ } } }, + "operationId": "listMedia", "security": [ { "apiKey": [] @@ -55089,6 +55239,7 @@ } } }, + "operationId": "searchUnsplash", "security": [ { "apiKey": [] @@ -55399,6 +55550,7 @@ } } }, + "operationId": "getMedia", "security": [ { "apiKey": [] @@ -55790,6 +55942,7 @@ } } }, + "operationId": "updateMedia", "security": [ { "apiKey": [] @@ -56047,6 +56200,7 @@ } } }, + "operationId": "deleteMedia", "security": [ { "apiKey": [] @@ -56297,6 +56451,7 @@ } } }, + "operationId": "listMediaReferences", "security": [ { "apiKey": [] @@ -56653,6 +56808,7 @@ } } }, + "operationId": "grantLearnerMembership", "security": [ { "apiKey": [] @@ -56867,6 +57023,7 @@ } } }, + "operationId": "learnerRequestEmailCode", "security": [] } }, @@ -57181,6 +57338,7 @@ } } }, + "operationId": "learnerVerifyEmailCode", "security": [] } }, @@ -57410,6 +57568,7 @@ } } }, + "operationId": "learnerStartGoogleSignIn", "security": [] } }, @@ -57695,6 +57854,7 @@ } } }, + "operationId": "learnerStartSsoSignIn", "security": [] } }, @@ -57889,6 +58049,7 @@ } } }, + "operationId": "consumeSchoolAuthTicket", "security": [] } }, @@ -57976,6 +58137,7 @@ } } }, + "operationId": "learnerSignOut", "security": [] } }, @@ -58149,6 +58311,7 @@ } } }, + "operationId": "learnerMe", "security": [] }, "patch": { @@ -58412,6 +58575,7 @@ } } }, + "operationId": "updateLearnerProfile", "security": [] } }, @@ -58750,6 +58914,7 @@ } } }, + "operationId": "createLearnerMembership", "security": [] } }, @@ -59031,6 +59196,7 @@ } } }, + "operationId": "learnerCreateDownloadLink", "security": [] } }, @@ -59559,6 +59725,7 @@ } } }, + "operationId": "learnerCheckout", "security": [] } }, @@ -60301,6 +60468,7 @@ } } }, + "operationId": "startLearnerCheckoutSession", "security": [] } }, @@ -60596,6 +60764,7 @@ } } }, + "operationId": "getLearnerCheckout", "security": [] } }, @@ -60891,6 +61060,7 @@ } } }, + "operationId": "learnerCompleteLesson", "security": [] } }, @@ -61110,6 +61280,7 @@ } } }, + "operationId": "stripeWebhook", "security": [] } }, @@ -61329,6 +61500,7 @@ } } }, + "operationId": "lemonSqueezyWebhook", "security": [] } }, @@ -61548,6 +61720,7 @@ } } }, + "operationId": "razorpayWebhook", "security": [] } }, @@ -61835,6 +62008,7 @@ } } }, + "operationId": "listLearnerProgress", "security": [] } }, @@ -62068,6 +62242,7 @@ } } }, + "operationId": "listLearnerPurchases", "security": [] } }, @@ -62253,6 +62428,7 @@ } } }, + "operationId": "listLearnerCertificates", "security": [] } }, @@ -62417,6 +62593,7 @@ } } }, + "operationId": "verifyCertificate", "security": [] } }, @@ -62592,6 +62769,7 @@ } } }, + "operationId": "listCertificateTemplates", "security": [ { "apiKey": [] @@ -62900,6 +63078,7 @@ } } }, + "operationId": "createCertificateTemplate", "security": [ { "apiKey": [] @@ -63271,6 +63450,7 @@ } } }, + "operationId": "updateCertificateTemplate", "security": [ { "apiKey": [] @@ -63472,6 +63652,7 @@ } } }, + "operationId": "getBillingCatalog", "security": [ { "oauth": [] @@ -63687,6 +63868,7 @@ } } }, + "operationId": "getEntitlement", "security": [ { "oauth": [] @@ -63953,6 +64135,7 @@ } } }, + "operationId": "listSchools", "security": [ { "oauth": [] @@ -64304,6 +64487,7 @@ } } }, + "operationId": "createSchool", "security": [] } }, @@ -64602,6 +64786,7 @@ } } }, + "operationId": "listSchoolTeam", "security": [] } }, @@ -64855,6 +65040,7 @@ } } }, + "operationId": "removeSchoolTeamMember", "security": [] }, "patch": { @@ -65250,6 +65436,7 @@ } } }, + "operationId": "updateSchoolTeamMember", "security": [] } }, @@ -65437,6 +65624,7 @@ } } }, + "operationId": "leaveSchoolTeam", "security": [] } }, @@ -65768,6 +65956,7 @@ } } }, + "operationId": "transferSchoolOwnership", "security": [] } }, @@ -66005,6 +66194,7 @@ } } }, + "operationId": "createSchoolTeamInvitation", "security": [] } }, @@ -66219,6 +66409,7 @@ } } }, + "operationId": "resendSchoolTeamInvitation", "security": [] } }, @@ -66416,6 +66607,7 @@ } } }, + "operationId": "revokeSchoolTeamInvitation", "security": [] } }, @@ -66746,6 +66938,7 @@ } } }, + "operationId": "getSchoolPaymentSettings", "security": [ { "oauth": [] @@ -67198,6 +67391,7 @@ } } }, + "operationId": "updateSchoolPaymentSettings", "security": [ { "oauth": [] @@ -67403,6 +67597,7 @@ } } }, + "operationId": "getSchoolCodeInjection", "security": [ { "apiKey": [] @@ -67686,6 +67881,7 @@ } } }, + "operationId": "updateSchoolCodeInjection", "security": [ { "oauth": [] @@ -68043,6 +68239,7 @@ } } }, + "operationId": "listSchoolWebsitePages", "security": [ { "apiKey": [] @@ -68467,6 +68664,7 @@ } } }, + "operationId": "createSchoolWebsitePage", "security": [ { "apiKey": [] @@ -69024,6 +69222,7 @@ } } }, + "operationId": "getSchoolWebsitePage", "security": [ { "apiKey": [] @@ -69710,6 +69909,7 @@ } } }, + "operationId": "updateSchoolWebsitePage", "security": [ { "apiKey": [] @@ -70024,6 +70224,7 @@ } } }, + "operationId": "deleteSchoolWebsitePage", "security": [ { "apiKey": [] @@ -70348,6 +70549,7 @@ } } }, + "operationId": "getSchoolWebsiteBranding", "security": [ { "apiKey": [] @@ -70805,6 +71007,7 @@ } } }, + "operationId": "updateSchoolWebsiteBranding", "security": [ { "apiKey": [] @@ -71097,6 +71300,7 @@ } } }, + "operationId": "listSchoolWebsiteBrandingThemes", "security": [ { "apiKey": [] @@ -71459,6 +71663,7 @@ } } }, + "operationId": "createSchoolWebsiteBrandingTheme", "security": [ { "apiKey": [] @@ -71885,6 +72090,7 @@ } } }, + "operationId": "updateSchoolWebsiteBrandingTheme", "security": [ { "apiKey": [] @@ -72300,6 +72506,7 @@ } } }, + "operationId": "publishSchoolWebsitePage", "security": [ { "apiKey": [] @@ -72857,6 +73064,7 @@ } } }, + "operationId": "discardSchoolWebsitePage", "security": [ { "apiKey": [] @@ -73272,6 +73480,7 @@ } } }, + "operationId": "publishSchoolWebsiteBlog", "security": [ { "apiKey": [] @@ -73632,6 +73841,7 @@ } } }, + "operationId": "listSchoolWebsiteBlogs", "security": [ { "apiKey": [] @@ -74056,6 +74266,7 @@ } } }, + "operationId": "createSchoolWebsiteBlog", "security": [ { "apiKey": [] @@ -74575,6 +74786,7 @@ } } }, + "operationId": "getSchoolWebsiteBlog", "security": [ { "apiKey": [] @@ -75237,6 +75449,7 @@ } } }, + "operationId": "updateSchoolWebsiteBlog", "security": [ { "apiKey": [] @@ -75551,6 +75764,7 @@ } } }, + "operationId": "deleteSchoolWebsiteBlog", "security": [ { "apiKey": [] @@ -76014,6 +76228,7 @@ } } }, + "operationId": "unpublishSchoolWebsiteBlog", "security": [ { "apiKey": [] @@ -76533,6 +76748,7 @@ } } }, + "operationId": "discardSchoolWebsiteBlog", "security": [ { "apiKey": [] @@ -76991,6 +77207,7 @@ } } }, + "operationId": "updateSchool", "security": [ { "apiKey": [] @@ -77217,6 +77434,7 @@ } } }, + "operationId": "listSchoolHosts", "security": [ { "apiKey": [] @@ -77589,6 +77807,7 @@ } } }, + "operationId": "createSchoolHost", "security": [ { "apiKey": [] @@ -77990,6 +78209,7 @@ } } }, + "operationId": "verifySchoolHost", "security": [ { "apiKey": [] @@ -78250,6 +78470,7 @@ } } }, + "operationId": "deleteSchoolHost", "security": [ { "apiKey": [] @@ -78564,6 +78785,7 @@ } } }, + "operationId": "listSsoConnections", "security": [ { "apiKey": [] @@ -79046,6 +79268,7 @@ } } }, + "operationId": "createSsoConnection", "security": [] } }, @@ -79409,6 +79632,7 @@ } } }, + "operationId": "getSsoConnection", "security": [ { "apiKey": [] @@ -79893,6 +80117,7 @@ } } }, + "operationId": "updateSsoConnection", "security": [] }, "delete": { @@ -80090,6 +80315,7 @@ } } }, + "operationId": "deleteSsoConnection", "security": [] } }, @@ -80473,6 +80699,7 @@ } } }, + "operationId": "addSsoDomain", "security": [] } }, @@ -80856,6 +81083,7 @@ } } }, + "operationId": "verifySsoDomain", "security": [] } }, @@ -81064,6 +81292,7 @@ } } }, + "operationId": "deleteSsoDomain", "security": [] } }, @@ -81351,6 +81580,7 @@ } } }, + "operationId": "startSsoConnectionTest", "security": [] } }, @@ -81613,6 +81843,7 @@ } } }, + "operationId": "getSsoConnectionTestResult", "security": [] } }, @@ -82100,6 +82331,7 @@ } } }, + "operationId": "activateSsoConnection", "security": [] } }, @@ -82475,6 +82707,7 @@ } } }, + "operationId": "disableSsoConnection", "security": [] } }, @@ -82673,6 +82906,7 @@ } } }, + "operationId": "unlinkSsoIdentity", "security": [] } }, @@ -82859,6 +83093,7 @@ } } }, + "operationId": "getSchoolLoginMethods", "security": [ { "apiKey": [] @@ -83133,6 +83368,7 @@ } } }, + "operationId": "updateSchoolLoginMethods", "security": [ { "apiKey": [] @@ -83256,6 +83492,7 @@ } } }, + "operationId": "checkSchoolSubdomain", "security": [] } }, @@ -83546,6 +83783,7 @@ } } }, + "operationId": "startSchoolBillingCheckout", "security": [] } }, @@ -83756,6 +83994,7 @@ } } }, + "operationId": "getSchoolBillingPlan", "security": [] } }, @@ -84098,6 +84337,7 @@ } } }, + "operationId": "cancelSchoolBillingPlan", "security": [] } }, @@ -84440,6 +84680,7 @@ } } }, + "operationId": "resumeSchoolBillingPlan", "security": [] } }, @@ -84665,6 +84906,7 @@ } } }, + "operationId": "getSchoolOnboarding", "security": [] }, "patch": { @@ -85006,6 +85248,7 @@ } } }, + "operationId": "updateSchoolOnboarding", "security": [] } }, @@ -85120,6 +85363,7 @@ } } }, + "operationId": "listAiConnections", "security": [] } }, @@ -85262,6 +85506,7 @@ } } }, + "operationId": "disconnectAiConnection", "security": [] } }, @@ -85468,6 +85713,7 @@ } } }, + "operationId": "selectSchool", "security": [] } }, @@ -85706,6 +85952,7 @@ } } }, + "operationId": "listApiKeys", "security": [] }, "post": { @@ -86115,6 +86362,7 @@ } } }, + "operationId": "createApiKey", "security": [] } }, @@ -86312,6 +86560,7 @@ } } }, + "operationId": "revokeApiKey", "security": [] } }, @@ -86545,6 +86794,7 @@ } } }, + "operationId": "createInvitation", "security": [] } }, @@ -86846,6 +87096,7 @@ } } }, + "operationId": "previewTeamInvitation", "security": [] } }, @@ -87130,6 +87381,7 @@ } } }, + "operationId": "acceptTeamInvitation", "security": [] } }, @@ -87397,6 +87649,7 @@ } } }, + "operationId": "rejectTeamInvitation", "security": [] } }, @@ -87681,6 +87934,7 @@ } } }, + "operationId": "acceptInvitation", "security": [] } }, @@ -87877,6 +88131,7 @@ } } }, + "operationId": "revokeInvitation", "security": [] } }, @@ -88304,6 +88559,7 @@ } } }, + "operationId": "getSchoolCommunity", "security": [ { "apiKey": [] @@ -88481,6 +88737,7 @@ } } }, + "operationId": "listStaffNotificationPreferences", "security": [] } }, @@ -88783,6 +89040,7 @@ } } }, + "operationId": "updateStaffNotificationPreference", "security": [] } }, @@ -88931,6 +89189,7 @@ } } }, + "operationId": "getMailingSettings", "security": [ { "apiKey": [] @@ -89161,6 +89420,7 @@ } } }, + "operationId": "updateMailingSettings", "security": [ { "apiKey": [] @@ -89319,6 +89579,7 @@ } } }, + "operationId": "getSchoolEmailDelivery", "security": [ { "apiKey": [] @@ -89513,6 +89774,7 @@ } } }, + "operationId": "listMailSequences", "security": [ { "apiKey": [] @@ -89743,6 +90005,7 @@ } } }, + "operationId": "createMailSequence", "security": [ { "apiKey": [] @@ -89951,6 +90214,7 @@ } } }, + "operationId": "getMailSequence", "security": [ { "apiKey": [] @@ -90256,6 +90520,7 @@ } } }, + "operationId": "updateMailSequence", "security": [ { "apiKey": [] @@ -90458,6 +90723,7 @@ } } }, + "operationId": "deleteMailSequence", "security": [ { "apiKey": [] @@ -90666,6 +90932,7 @@ } } }, + "operationId": "getMailSequenceStats", "security": [ { "apiKey": [] @@ -90974,6 +91241,7 @@ } } }, + "operationId": "listMailSequenceSubscribers", "security": [ { "apiKey": [] @@ -91250,6 +91518,7 @@ } } }, + "operationId": "startMailSequence", "security": [ { "oauth": [] @@ -91523,6 +91792,7 @@ } } }, + "operationId": "pauseMailSequence", "security": [ { "apiKey": [] @@ -91817,6 +92087,7 @@ } } }, + "operationId": "createMailSequenceEmail", "security": [ { "apiKey": [] @@ -92124,6 +92395,7 @@ } } }, + "operationId": "updateMailSequenceEmail", "security": [ { "apiKey": [] @@ -92334,6 +92606,7 @@ } } }, + "operationId": "deleteMailSequenceEmail", "security": [ { "apiKey": [] @@ -92627,6 +92900,7 @@ } } }, + "operationId": "sendMailSequenceTestEmail", "security": [ { "oauth": [] @@ -92783,6 +93057,7 @@ } } }, + "operationId": "listSystemMailTemplates", "security": [ { "apiKey": [] @@ -92959,6 +93234,7 @@ } } }, + "operationId": "listMailTemplates", "security": [ { "apiKey": [] @@ -93207,6 +93483,7 @@ } } }, + "operationId": "createMailTemplate", "security": [ { "apiKey": [] @@ -93427,6 +93704,7 @@ } } }, + "operationId": "duplicateMailTemplate", "security": [ { "apiKey": [] @@ -93635,6 +93913,7 @@ } } }, + "operationId": "getMailTemplate", "security": [ { "apiKey": [] @@ -93948,6 +94227,7 @@ } } }, + "operationId": "updateMailTemplate", "security": [ { "apiKey": [] @@ -94150,6 +94430,7 @@ } } }, + "operationId": "deleteMailTemplate", "security": [ { "apiKey": [] diff --git a/apps/api/src/openapi.test.ts b/apps/api/src/openapi.test.ts index b5440d03e..41d890411 100644 --- a/apps/api/src/openapi.test.ts +++ b/apps/api/src/openapi.test.ts @@ -1,4 +1,5 @@ import { describe, expect, it } from "bun:test"; +import { contract } from "@courselit/api-contract"; import { createOpenApiDocument } from "./openapi.js"; describe("CourseLit OpenAPI tags", () => { @@ -27,9 +28,9 @@ describe("CourseLit OpenAPI tags", () => { expect(document.paths["/v1/learner/auth/email-code/verify"]?.post?.tags).toEqual([ "Learners", ]); - expect(document.paths["/v1/public/{schoolId}/checkout-sessions"]?.post?.tags).toEqual([ - "Storefront & Payments", - ]); + expect( + document.paths["/v1/public/{schoolId}/checkout-sessions"]?.post?.tags, + ).toEqual(["Storefront & Payments"]); expect(document.paths["/v1/public/{schoolId}/site/pages"]?.get?.tags).toEqual([ "Public Website", ]); @@ -102,3 +103,30 @@ describe("CourseLit OpenAPI tags", () => { } }); }); + +describe("CourseLit OpenAPI operation ids", () => { + const document = createOpenApiDocument("https://api.example.test"); + const operations = Object.values(document.paths).flatMap((item) => + ["get", "post", "put", "patch", "delete"].flatMap((method) => { + const operation = (item as Record)[ + method + ]; + return operation ? [operation] : []; + }), + ); + + it("names every operation after its contract key, once", () => { + const ids = operations.map((operation) => operation.operationId); + expect(ids.every((id) => typeof id === "string" && id.length > 0)).toBe(true); + expect(new Set(ids).size).toBe(ids.length); + expect(new Set(ids)).toEqual(new Set(Object.keys(contract))); + }); + + it("uses the contract key for representative routes", () => { + expect(document.paths["/v1/products"]?.get?.operationId).toBe( + Object.entries(contract).find( + ([, route]) => route.method === "GET" && route.path === "/v1/products", + )?.[0], + ); + }); +}); diff --git a/apps/api/src/openapi.ts b/apps/api/src/openapi.ts index e6c6c51f0..47662c9bf 100644 --- a/apps/api/src/openapi.ts +++ b/apps/api/src/openapi.ts @@ -222,8 +222,13 @@ export function createOpenApiDocument(publicApiUrl: string) { { operationMapper: (operation, route) => { const security = securityFor(route); + const operationId = operationIdByRoute.get(route); + if (!operationId) throw new Error("OpenAPI route is missing from the contract"); return { ...operation, + // The contract key, so tools such as the docs API reference get + // stable, readable operation URLs (and MCP tool names match). + operationId, tags: [tagForPath((route as { path?: string }).path)], ...(security ? { security } : {}), }; diff --git a/frontlit/docs/_sections.json b/frontlit/docs/_sections.json index aa7f7f005..4c7787fbf 100644 --- a/frontlit/docs/_sections.json +++ b/frontlit/docs/_sections.json @@ -6,6 +6,11 @@ "name": "Getting started", "order": 10 }, + { + "folder": "migrate", + "name": "Migrate to CourseLit", + "order": 15 + }, { "folder": "products", "name": "Courses and downloads", diff --git a/frontlit/docs/developers/index.md b/frontlit/docs/developers/index.md index 4ed9f1e02..1e72ecb8d 100644 --- a/frontlit/docs/developers/index.md +++ b/frontlit/docs/developers/index.md @@ -8,7 +8,7 @@ CourseLit has two programmatic interfaces to a school: a **REST API** for your o ## What you can build -Use the API to create and publish courses and downloads, manage sections, lessons and payment plans, grant learners access, read learner progress and sales figures, manage contacts and segments, work with the media library, and edit the school website. The API reference lists every operation with its parameters and example responses. +Use the API to create and publish courses and downloads, manage sections, lessons and payment plans, grant learners access, read learner progress and sales figures, manage contacts and segments, work with the media library, and edit the school website. The [API reference](/docs/api) lists every operation with its parameters and example responses. ## Base URL and versioning diff --git a/frontlit/docs/getting-started/cloud-vs-self-hosted.md b/frontlit/docs/getting-started/cloud-vs-self-hosted.md new file mode 100644 index 000000000..9e2ed0133 --- /dev/null +++ b/frontlit/docs/getting-started/cloud-vs-self-hosted.md @@ -0,0 +1,45 @@ +--- +title: Cloud or self-hosted +description: Compare CourseLit's hosted cloud with running CourseLit on your own servers, and pick the one that suits your school. +nav_order: 15 +--- + +You can use CourseLit in two ways. **CourseLit Cloud** at courselit.app is run for you. **Self-hosted CourseLit** is the same open-source software, running on servers you manage. Both have the same features and the same admin dashboard, and your learners can't tell them apart. + +## Side by side + +| | CourseLit Cloud | Self-hosted | +| --- | --- | --- | +| Price | Pro $29 a month or Business $79 a month, after a 14-day free trial | Free. You pay for your own servers and services | +| Features | Pro covers most schools. SCORM lessons, learner single sign-on and the audit log need Business | Every feature, with no licence key | +| Setup | Sign up and start building | Deploy the API, worker, admin and storefront yourself | +| Hosting and updates | Done for you | Done by you | +| Storage and email | Included, within your plan's limits | Connect your own media storage and email services | +| Fee on your sales | None | None | +| Support | Email on Pro, priority on Business | Community support on Discord | + +On both, learners pay through your own Stripe, Lemon Squeezy or Razorpay account, and CourseLit takes no cut of your sales. + +## Choose CourseLit Cloud if + +- You want to teach and sell, not run servers. +- You want updates, backups and email delivery handled for you. +- You'd like to start today: create a school in a few minutes, with no card needed for the trial. + +See [Plans and limits](/docs/getting-started/plans-and-limits) for what each plan includes, then [create your school](/docs/getting-started/create-a-school). + +## Choose self-hosting if + +- You need your data on your own infrastructure. +- You are comfortable running containers, PostgreSQL and a reverse proxy. +- You want every feature without a subscription. + + + +CourseLit 1.0 is in pre-release. There is no one-command installer, and details can change between pre-releases. Read [Self-hosting](/docs/self-hosting) before you start. + + + +## Switching later + +Your school's content is reachable through the [REST API](/docs/developers) on both, so you are not locked in to either choice. There is no one-click move between the cloud and a self-hosted deployment yet. diff --git a/frontlit/docs/getting-started/index.md b/frontlit/docs/getting-started/index.md index 1adab9525..c3b784343 100644 --- a/frontlit/docs/getting-started/index.md +++ b/frontlit/docs/getting-started/index.md @@ -45,6 +45,18 @@ Publish a free course and give a learner access in a few minutes. + + +Compare CourseLit Cloud with running CourseLit on your own servers. + + + + + +What the free trial, Pro and Business include. + + + Use the Onboarding checklist to get ready to sell and bring people in. diff --git a/frontlit/docs/getting-started/plans-and-limits.md b/frontlit/docs/getting-started/plans-and-limits.md new file mode 100644 index 000000000..09a2459c3 --- /dev/null +++ b/frontlit/docs/getting-started/plans-and-limits.md @@ -0,0 +1,53 @@ +--- +title: Plans and limits +description: What the CourseLit Cloud free trial, Pro and Business plans include, their email and storage limits, and what happens when a trial or plan ends. +nav_order: 16 +--- + +CourseLit Cloud has two paid plans, **Pro** and **Business**, and every new school starts with a free trial. Self-hosted CourseLit has every feature and no limits. See [Cloud or self-hosted](/docs/getting-started/cloud-vs-self-hosted). + +None of the plans charge a fee on your sales. Learners pay through your own payment provider account, and only that provider's fees apply. See [Set up payments](/docs/settings/payments). + +## Plans + +| | Pro | Business | +| --- | --- | --- | +| Price | $29 a month or $290 a year | $79 a month or $790 a year | +| Courses, downloads and learners | Unlimited | Unlimited | +| Team members | Unlimited | Unlimited | +| Community, website, blog and custom domain | Included | Included | +| Email marketing (broadcasts, sequences, drip emails) | 10,000 emails a month | 50,000 emails a month | +| Storage | 20 GB | 200 GB | +| Remove CourseLit branding | Yes | Yes | +| Code injection | Yes | Yes | +| REST API, API keys and MCP server | Yes | Yes | +| SCORM lessons | No | Yes | +| Learner single sign-on (SAML) | No | Yes | +| Audit log | No | Yes | +| Support | Email | Priority | + +Paying yearly costs the same as ten months. + +The email limit counts marketing email only. Sign-in codes, receipts, access emails and other messages your learners need always go out and never count towards it. + +## Free trial + +Every account gets one 14-day free trial, with no card needed. + +- The trial includes every Business feature, except removing CourseLit branding. +- Code you add with code injection runs only for you, the school owner, not for visitors. +- Marketing emails don't send during the trial. Learners still get sign-in codes, receipts and access emails. +- You have 500 MB of storage. +- A custom domain works, but emails CourseLit sends to learners link to your school's courselit.app address until you choose a plan. + +To keep your school, choose a plan from [Billing and plan](/docs/settings/billing-and-plan) before the trial ends. + +## When a trial or plan ends + +If a trial ends without a plan, or a subscription ends, your school becomes read-only for 15 days. You can still sign in and choose a plan in that time. After 15 days, the school and all its data are deleted, including its files and contacts. + + + +Choose a plan within the 15 days if you want to keep your school. + + diff --git a/frontlit/docs/migrate/from-courselit-v0.md b/frontlit/docs/migrate/from-courselit-v0.md new file mode 100644 index 000000000..252dd915c --- /dev/null +++ b/frontlit/docs/migrate/from-courselit-v0.md @@ -0,0 +1,18 @@ +--- +title: Move from CourseLit v0 +description: CourseLit 1.0 moves from MongoDB to PostgreSQL. A guide to moving your school from CourseLit v0 is on the way. +nav_title: From CourseLit v0 +nav_order: 10 +--- + +CourseLit 1.0 is a rewrite. Among other changes, it stores your school in **PostgreSQL** instead of **MongoDB**, so a school can't be upgraded in place from CourseLit v0 (0.x). + +We are working on a guide to moving your courses, downloads, community, learners and contacts from v0 to 1.0. This page will hold it. + + + +- Keep running your school on CourseLit v0. The [v0 docs](/docs/legacy/introduction) still apply to it. +- If you self-host v0, don't point a 1.0 deployment at your existing MongoDB database. 1.0 needs its own PostgreSQL database. +- Questions? Ask in the [CourseLit community on Discord](https://discord.com/invite/GR4bQsN). + +