{"openapi":"3.1.0","info":{"title":"Learnmersive Partner API","version":"1.6.0","description":"Public contract for Learnmersive partner integrations. Experience and Live Lesson catalogue endpoints are separately scoped by resource, while the supplied API key selects the Partner. Both support a paged initial snapshot followed by cursor-based incremental synchronisation. Teacher launch URLs require the live-lessons:teach scope and are issued only to Partner backends."},"servers":[{"url":"https://api.learnmersive.com/api/partner/v1","description":"Partner API v1"}],"tags":[{"name":"Experiences","description":"Published Experience catalogue endpoints."},{"name":"Live Lessons","description":"Active Live Lesson catalogue and external teacher launch endpoints."}],"components":{"securitySchemes":{"PartnerApiKey":{"type":"http","scheme":"bearer","bearerFormat":"API key","description":"Partner API keys are issued separately and must be sent as a Bearer token. No credentials are issued through this documentation site."}},"schemas":{"PartnerApiError":{"type":"object","properties":{"error":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Stable machine-readable error code."}},"required":["error","code"]},"PartnerExperienceCatalogueEntry":{"type":"object","properties":{"id":{"type":"string","description":"Stable Partner-facing catalogue entry identifier for a published Learnmersive Experience. Never an internal ID."},"title":{"type":"string"},"description":{"type":["string","null"]},"thumbnailUrl":{"type":["string","null"],"format":"uri"},"subject":{"type":"string"},"ageRange":{"type":"object","properties":{"min":{"type":"integer"},"max":{"type":"integer"}},"required":["min","max"]},"curriculumTags":{"type":"array","items":{"type":"string"}},"metadata":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}]},"description":"Partner-specific metadata. Available fields are defined by the Partner integration guide."},"updatedAt":{"type":"string","format":"date-time"},"playerCode":{"type":"string","description":"Short Player route code. Combine it with the Player URL from the integration guide."}},"required":["id","title","description","thumbnailUrl","subject","ageRange","curriculumTags","updatedAt","playerCode"]},"PartnerLiveLessonCatalogueEntry":{"type":"object","properties":{"id":{"type":"string","description":"Stable Partner-facing catalogue entry identifier for an active Learnmersive Live Lesson. Never an internal ID."},"title":{"type":"string"},"description":{"type":["string","null"]},"thumbnailUrl":{"type":["string","null"],"format":"uri"},"subject":{"type":"string"},"ageRange":{"type":"object","properties":{"min":{"type":"integer"},"max":{"type":"integer"}},"required":["min","max"]},"curriculumTags":{"type":"array","items":{"type":"string"}},"metadata":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"array","items":{"type":"string"}}]},"description":"Partner-specific metadata. Available fields are defined by the Partner integration guide."},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","title","description","thumbnailUrl","subject","ageRange","curriculumTags","updatedAt"]},"PartnerExperienceCatalogueListResponse":{"type":"object","properties":{"experiences":{"type":"array","items":{"$ref":"#/components/schemas/PartnerExperienceCatalogueEntry"},"description":"Catalogue entries. Each entry represents a published Learnmersive Experience."},"withdrawn":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["withdrawn"]},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","status","updatedAt"]}},"meta":{"type":"object","properties":{"count":{"type":"integer","minimum":0},"withdrawnCount":{"type":"integer","minimum":0},"nextCursor":{"type":["string","null"]},"syncCursor":{"type":["string","null"]}},"required":["count","withdrawnCount","nextCursor","syncCursor"]}},"required":["experiences","withdrawn","meta"]},"PartnerExperienceCatalogueDetailResponse":{"type":"object","properties":{"experience":{"$ref":"#/components/schemas/PartnerExperienceCatalogueEntry"}},"required":["experience"]},"PartnerLiveLessonCatalogueListResponse":{"type":"object","properties":{"liveLessons":{"type":"array","items":{"$ref":"#/components/schemas/PartnerLiveLessonCatalogueEntry"},"description":"Catalogue entries. Each entry represents an active Learnmersive Live Lesson."},"withdrawn":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["withdrawn"]},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","status","updatedAt"]}},"meta":{"type":"object","properties":{"count":{"type":"integer","minimum":0},"withdrawnCount":{"type":"integer","minimum":0},"nextCursor":{"type":["string","null"]},"syncCursor":{"type":["string","null"]}},"required":["count","withdrawnCount","nextCursor","syncCursor"]}},"required":["liveLessons","withdrawn","meta"]},"PartnerLiveLessonCatalogueDetailResponse":{"type":"object","properties":{"liveLesson":{"$ref":"#/components/schemas/PartnerLiveLessonCatalogueEntry"}},"required":["liveLesson"]},"PartnerTeacherLaunchRequest":{"type":"object","properties":{"teacherDisplayName":{"type":"string","minLength":2,"maxLength":120,"description":"Name displayed in the Live Lesson classroom for this launch."}},"required":["teacherDisplayName"]},"PartnerTeacherLaunchResponse":{"type":"object","properties":{"launchUrl":{"type":"string","format":"uri","description":"One-time Player URL. Open it top-level or set it as an iframe source; iframe parents must be allowed by the Partner embed-origin policy. Never expose the API key."},"expiresAt":{"type":"string","format":"date-time","description":"When the unused launch URL expires (five minutes after issue)."}},"required":["launchUrl","expiresAt"]}},"parameters":{}},"paths":{"/catalogue/experiences":{"get":{"tags":["Experiences"],"summary":"List Experience catalogue entries","description":"Returns catalogue entries associated with the supplied API key. Each entry represents a published Learnmersive Experience. The first sync is a paged full snapshot. Save meta.syncCursor once meta.nextCursor is null, then supply it later to receive incremental published changes and withdrawn tombstones.","security":[{"PartnerApiKey":[]}],"parameters":[{"schema":{"type":"string"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Partner catalogue entry snapshot.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerExperienceCatalogueListResponse"}}}},"400":{"description":"The cursor or page limit is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerApiError"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerApiError"}}}},"403":{"description":"API key lacks the required scope or partner configuration.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerApiError"}}}}}}},"/live-lessons/{externalId}/teacher-launch":{"post":{"tags":["Live Lessons"],"summary":"Create a one-time Live Lesson teacher launch URL","description":"Requires the live-lessons:teach scope. The Partner API client, Partner publication, classroom status, and organization binding are checked when the launch URL is issued and again for every teacher session request. The URL can be consumed once within five minutes; its resulting tab session lasts at most eight hours. It may be used top-level or as an iframe source. When the Partner configures embed origins, the browser only permits those exact frame ancestors.","security":[{"PartnerApiKey":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"example":"partner-live-lesson-catalogue-id"},"required":true,"name":"externalId","in":"path"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerTeacherLaunchRequest"}}}},"responses":{"200":{"description":"One-time teacher launch URL.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerTeacherLaunchResponse"}}}},"400":{"description":"The external ID or teacher display name is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerApiError"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerApiError"}}}},"403":{"description":"API key lacks live-lessons:teach or is no longer active.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerApiError"}}}},"404":{"description":"The Live Lesson is not actively published for this Partner, is ended, or is outside the Partner organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerApiError"}}}},"500":{"description":"Unable to create the teacher launch.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerApiError"}}}}}}},"/catalogue/experiences/{externalId}":{"get":{"tags":["Experiences"],"summary":"Get an Experience catalogue entry","security":[{"PartnerApiKey":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"example":"partner-catalogue-id"},"required":true,"name":"externalId","in":"path"}],"responses":{"200":{"description":"Catalogue entry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerExperienceCatalogueDetailResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerApiError"}}}},"403":{"description":"API key lacks the required scope or partner configuration.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerApiError"}}}},"404":{"description":"The catalogue entry is not available in the current catalogue.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerApiError"}}}}}}},"/catalogue/live-lessons":{"get":{"tags":["Live Lessons"],"summary":"List Live Lesson catalogue entries","description":"Returns active Live Lesson catalogue entries associated with the supplied API key. The first sync is a paged full snapshot. Save meta.syncCursor once meta.nextCursor is null, then supply it later to receive incremental changes and withdrawn tombstones. Live Lesson cursors cannot be used for Experience endpoints.","security":[{"PartnerApiKey":[]}],"parameters":[{"schema":{"type":"string"},"required":false,"name":"cursor","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100},"required":false,"name":"limit","in":"query"}],"responses":{"200":{"description":"Partner Live Lesson catalogue entry snapshot.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerLiveLessonCatalogueListResponse"}}}},"400":{"description":"The cursor or page limit is invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerApiError"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerApiError"}}}},"403":{"description":"API key lacks the required scope or partner configuration.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerApiError"}}}}}}},"/catalogue/live-lessons/{externalId}":{"get":{"tags":["Live Lessons"],"summary":"Get a Live Lesson catalogue entry","security":[{"PartnerApiKey":[]}],"parameters":[{"schema":{"type":"string","minLength":1,"example":"partner-live-lesson-catalogue-id"},"required":true,"name":"externalId","in":"path"}],"responses":{"200":{"description":"Live Lesson catalogue entry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerLiveLessonCatalogueDetailResponse"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerApiError"}}}},"403":{"description":"API key lacks the required scope or partner configuration.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerApiError"}}}},"404":{"description":"The Live Lesson catalogue entry is not available.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerApiError"}}}}}}}},"webhooks":{}}