completeAssetUpload
ChatGPTAfter the user’s application or upload client has successfully uploaded the bytes using the URL from createAssetUpload, verify the stored object, create or update its asset record, and associate it with the course. ScormStack reads the object's actual MIME type and size from storage before accepting it. This request is safe to retry with the same key. REST: POST /api/v1/assets/uploads/complete
createAssetUpload
ChatGPTCreate a short-lived pre-signed URL for uploading an asset directly to storage without sending the file through the ScormStack API function. The user’s application or an HTTP-capable upload client must send the exact file bytes to data.upload_url with an HTTP PUT, including every header returned in data.headers. This MCP connector cannot upload the bytes itself. Only after that upload succeeds, call completeAssetUpload with the returned key and the same course_id. Do not call completion or claim the asset is uploaded just because a URL was created. The pre-signed URL expires after five minutes. REST: POST /api/v1/assets/uploads
createBlock
ChatGPTREAD FIRST: Before authoring or changing course content or layout, read the ScormStack authoring guidelines provided at initialization, or call readAuthoringGuidelines if they are not already in context. Apply them as defaults; explicit user instructions and user-provided course or organization guidelines take precedence. For a targeted edit, preserve unrelated content and design. Creates a new content block and adds it to the slide. The content structure varies by block type. See the examples below or use GET /blocks/defaults to get templates for each block type. REST: POST /api/v1/courses/{courseId}/slides/{slideId}/blocks
createCourse
ChatGPTREAD FIRST: Before authoring or changing course content or layout, read the ScormStack authoring guidelines provided at initialization, or call readAuthoringGuidelines if they are not already in context. Apply them as defaults; explicit user instructions and user-provided course or organization guidelines take precedence. For a targeted edit, preserve unrelated content and design. Creates a new course in the connected space. Personal OAuth creates a personal course owned by the connected user and cannot assign another owner. For a workspace connection, by default it is owned by the token user; optionally provide owner_email (or owner_id) to assign an existing workspace member. Use one selector only. Requires courses:create (or api:*). Set the course language and theme 1. Call GET /themes with courses:read and select a theme ID. 2. Call POST /courses with courses:create: ``json { "title": "Ma formation", "default_locale": "fr", "theme_id": "a1b2c3d4-e5f6-4789-abcd-ef1234567890", "theme_config": { "colors": { "primary": "#1d4ed8" } } } ` Replace the example UUID with an ID from the list. default_locale initializes the course language and built-in learner labels; it does not translate authored content. theme_config is optional and applies only to this course. To change the theme later, send theme_id and/or theme_config to PUT /courses/{courseId} with courses:update. Only supplied fields change. theme_config replaces the full override object; use null to clear it. Changing theme_id alone keeps existing overrides; send theme_config: null to use the selected theme without course overrides. An inaccessible theme returns 403 REFERENCE_FORBIDDEN before the course is written. The same theme fields are supported under course in POST /courses/import`. REST: POST /api/v1/courses
createSection
ChatGPTREAD FIRST: Before authoring or changing course content or layout, read the ScormStack authoring guidelines provided at initialization, or call readAuthoringGuidelines if they are not already in context. Apply them as defaults; explicit user instructions and user-provided course or organization guidelines take precedence. For a targeted edit, preserve unrelated content and design. Creates a new section in the course. REST: POST /api/v1/courses/{courseId}/sections
createSlide
ChatGPTREAD FIRST: Before authoring or changing course content or layout, read the ScormStack authoring guidelines provided at initialization, or call readAuthoringGuidelines if they are not already in context. Apply them as defaults; explicit user instructions and user-provided course or organization guidelines take precedence. For a targeted edit, preserve unrelated content and design. Creates a new slide in the course. REST: POST /api/v1/courses/{courseId}/slides
decideCourseAction
ChatGPTOnly the ScormStack confirmation card may call this tool after the user clicks Confirm or Cancel. Confirm executes the exact reviewed action once.
deleteAsset
ChatGPTPermanently deletes an asset from storage and database. REST: DELETE /api/v1/assets/{assetId}
deleteBlock
ChatGPTREAD FIRST: Before authoring or changing course content or layout, read the ScormStack authoring guidelines provided at initialization, or call readAuthoringGuidelines if they are not already in context. Apply them as defaults; explicit user instructions and user-provided course or organization guidelines take precedence. For a targeted edit, preserve unrelated content and design. Removes a block from the slide. REST: DELETE /api/v1/courses/{courseId}/slides/{slideId}/blocks/{blockId}
deleteCourse
ChatGPTPermanently deletes a course and all its contents (sections, slides, blocks). There is no undo. Through MCP, the user must approve the exact request in the in-chat confirmation card or the ScormStack approval page before it can execute. For course deletion, learner analytics deletion, or public-link publication/update, this tool returns CONFIRMATION_REQUIRED and an in-chat confirmation card. The user must click Confirm (executes once) or Cancel. Do not retry after in-chat confirmation. If UI is unavailable, use approval_url for browser approval, then retry identical arguments plus confirmation_id. Never approve on the user's behalf or retry while waiting. Package exports do not require this approval. REST: DELETE /api/v1/courses/{courseId}
deleteCourseLearnerAnalytics
ChatGPTPermanently deletes up to 1,000 selected learners and their course sessions and interactions. There is no undo. Through MCP, the user must approve the exact course and learner IDs in the in-chat confirmation card or the ScormStack approval page before it can execute. For course deletion, learner analytics deletion, or public-link publication/update, this tool returns CONFIRMATION_REQUIRED and an in-chat confirmation card. The user must click Confirm (executes once) or Cancel. Do not retry after in-chat confirmation. If UI is unavailable, use approval_url for browser approval, then retry identical arguments plus confirmation_id. Never approve on the user's behalf or retry while waiting. Package exports do not require this approval. REST: DELETE /api/v1/courses/{courseId}/analytics/learners
deleteSection
ChatGPTREAD FIRST: Before authoring or changing course content or layout, read the ScormStack authoring guidelines provided at initialization, or call readAuthoringGuidelines if they are not already in context. Apply them as defaults; explicit user instructions and user-provided course or organization guidelines take precedence. For a targeted edit, preserve unrelated content and design. Deletes a section. Slides in this section will be moved out of the section. REST: DELETE /api/v1/courses/{courseId}/sections/{sectionId}
deleteSlide
ChatGPTREAD FIRST: Before authoring or changing course content or layout, read the ScormStack authoring guidelines provided at initialization, or call readAuthoringGuidelines if they are not already in context. Apply them as defaults; explicit user instructions and user-provided course or organization guidelines take precedence. For a targeted edit, preserve unrelated content and design. Permanently deletes a slide and all its blocks. REST: DELETE /api/v1/courses/{courseId}/slides/{slideId}
exportTranslations
ChatGPTExports course translations in XLIFF format for use with external translation tools (Lokalise, Phrase, Crowdin, memoQ, etc.). Query Parameters: - locale (required): The target language code (e.g., 'fr', 'de', 'es') - type: Type of content to export - 'all' (default), 'system_labels', 'content', or 'general' - version: XLIFF version - '1.2', '2.0' (default), or '2.1' - format: Response format - 'xml' (default) or 'json' Response: With format=xml, returns the XLIFF file directly with Content-Type: application/xliff+xml. With format=json, returns { success, data: { xliff, filename, metadata } }. The XLIFF version is selected independently with version (for example, format=json&version=2.1). REST: GET /api/v1/locales/courses/{courseId}/export
getAsset
ChatGPTRetrieves details of a specific asset by ID. REST: GET /api/v1/assets/{assetId}
getBlock
ChatGPTRetrieves details of a specific block. REST: GET /api/v1/courses/{courseId}/slides/{slideId}/blocks/{blockId}
getBlockDefaults
ChatGPTREAD FIRST: Before authoring or changing course content or layout, read the ScormStack authoring guidelines provided at initialization, or call readAuthoringGuidelines if they are not already in context. Apply them as defaults; explicit user instructions and user-provided course or organization guidelines take precedence. For a targeted edit, preserve unrelated content and design. Retrieves default content templates for all block types. Use this endpoint to discover available block types and their content structures. Returns real examples you can copy and modify when creating blocks. REST: GET /api/v1/blocks/defaults
getCourse
ChatGPTRetrieves details of a specific course by ID. REST: GET /api/v1/courses/{courseId}
getFullCourse
ChatGPTRetrieves an import-compatible full course payload including course settings, default locale, sections, variants, slides, blocks, and checkpoints. The response data object can be edited externally and posted to POST /courses/import to create a new copy. REST: GET /api/v1/courses/{courseId}/full
getPublishStatus
ChatGPTRetrieves the status, saved settings, dates, and result URL for a publication request. The requestId path parameter accepts the export_id returned by creation or the exports list. REST: GET /api/v1/courses/{courseId}/publish/{requestId}
getSection
ChatGPTRetrieves details of a specific section. REST: GET /api/v1/courses/{courseId}/sections/{sectionId}
getSlide
ChatGPTRetrieves details of a specific slide. REST: GET /api/v1/courses/{courseId}/slides/{slideId}
importCourse
ChatGPTREAD FIRST: Before authoring or changing course content or layout, read the ScormStack authoring guidelines provided at initialization, or call readAuthoringGuidelines if they are not already in context. Apply them as defaults; explicit user instructions and user-provided course or organization guidelines take precedence. For a targeted edit, preserve unrelated content and design. Creates a complete course tree (course, optional sections, variants, slides, blocks, and checkpoints) from a single payload. Courses stay personal for personal OAuth, or are attached to the token workspace for workspace connections. Personal access cannot assign another owner. Optional course.owner_email (or course.owner_id) assigns ownership to an existing workspace member; provide one selector only. Otherwise the token user owns the course. REST: POST /api/v1/courses/import
importTranslations
ChatGPTREAD FIRST: Before authoring or changing course content or layout, read the ScormStack authoring guidelines provided at initialization, or call readAuthoringGuidelines if they are not already in context. Apply them as defaults; explicit user instructions and user-provided course or organization guidelines take precedence. For a targeted edit, preserve unrelated content and design. Imports translations from an XLIFF file. Supports files from external translation tools like Lokalise, Phrase, Crowdin, memoQ, etc. Request Options: - Option A: Send raw XML body with Content-Type: application/xliff+xml - Option B: Send multipart form with a 'file' field containing the XLIFF file MCP: Call importTranslations with the XLIFF XML string in body. The connector sends it as raw XML with the correct content type; do not JSON-encode the string yourself. Keep the file and unit identifiers from the export. Imports update locale targets, and omitted content and general fields keep their existing values. Invalid XML or files with no non-empty targets return an error. For linked library blocks, imports save overrides in this course's locale. They never modify the shared library translation. Course overrides take priority field by field, with library translations as fallback, in the localization panel, XLIFF exports and course exports. Import counts: Each non-empty recognized unit is counted only in its own group (systemLabels, content, or general). added means no previous target existed; modified means an existing target changed; unchanged means it stayed the same. For system labels, existing targets include built-in translations shown by export, with saved overrides taking priority. Section titles are counted individually. content.skipped reports units referencing blocks not found in this course; they are not counted as added or modified. Query Parameters: - locale (required): Target language code (e.g., 'fr', 'de', 'es') If the locale doesn't exist, it will be created automatically. REST: POST /api/v1/locales/courses/{courseId}/import
listAssets
ChatGPTRetrieves a paginated list of assets (images, videos, audio, PDFs) owned by the authenticated user. REST: GET /api/v1/assets
listBlocks
ChatGPTRetrieves all blocks on a slide, in display order. REST: GET /api/v1/courses/{courseId}/slides/{slideId}/blocks
listCourseExports
ChatGPTLists completed exports created through the app or API, newest creation first (ID breaks ties). Includes saved settings, dates, public links, and dynamic package export_id values usable as target_export_id. Requires courses:read, courses:update, or legacy courses:publish and access to the connected workspace's course. This is the current state of each export, not a revision history: dynamic refresh updates the same record. Pending, failed, and deleted exports are excluded. Multiple records can refer to the same hosted embed ID. REST: GET /api/v1/courses/{courseId}/exports
listCourseLearnerAnalytics
ChatGPTReturns the same learner rows and summary metrics shown in Courses Analytics → Learners. Search applies to learner ID, email, name, and nickname. REST: GET /api/v1/courses/{courseId}/analytics/learners
listCourseLocales
ChatGPTRetrieves all locales (languages) configured for a course, including translation progress. REST: GET /api/v1/locales/courses/{courseId}
listCourses
ChatGPTRetrieves courses in the connected space. Personal OAuth returns only courses owned by the connected user with no workspace. Workspace connections return only currently accessible courses in that workspace; folder and collaborator permissions still apply. Requires courses:read (or api:*). Results are sorted by creation date (newest first), then ID for stable pagination. Follow pagination.totalPages to retrieve the complete list (up to 100 courses per page). REST: GET /api/v1/courses
listSections
ChatGPTRetrieves all sections in a course, ordered by their position. REST: GET /api/v1/courses/{courseId}/sections
listSlides
ChatGPTRetrieves all slides in a course, optionally filtered by section. REST: GET /api/v1/courses/{courseId}/slides
listThemes
ChatGPTLists system themes, themes owned by the token user, and themes shared through courses the user can access in the token workspace. Deduplicated and sorted by creation date (newest first), then ID. Requires courses:read (or api:*). Use a returned id as theme_id when creating or updating a course. Theme creation and editing are not exposed by this API. REST: GET /api/v1/themes
publishCourse
ChatGPTStarts publication of a course using the same export options exposed in the app. Package exports return either a signed download URL immediately or a request_id plus status_url when background processing is required. When a package is ready, configured workspace webhooks receive a signed course_published event. To refresh an existing dynamic package, send only refresh_dynamic_content_only: true, target_export_id (the export_id returned by creation or GET /courses/{courseId}/exports), and optionally notify_webhooks: false. The response is HTTP 200 with the same export_id (also returned as request_id). Saved export settings and hosted data URLs are preserved; the LMS ZIP does not need to be replaced. No new export slot is consumed. By default, configured webhooks receive dynamic_course_updated. Static, incomplete, deleted, and public-link exports cannot use this mode. Use the public-link update mode below for hosted links. The courseId must belong to the connected space. Personal OAuth only supports owned courses without a workspace. Use format: "public_link" to create or update a hosted learner URL. Password protection is off unless explicitly enabled. Through MCP, the user must approve the exact public-link request in the in-chat confirmation card or the ScormStack approval page before it can execute. The email and linkedin share options only record the preferred sharing mode; this tool does not send email or post to LinkedIn. For course deletion, learner analytics deletion, or public-link publication/update, this tool returns CONFIRMATION_REQUIRED and an in-chat confirmation card. The user must click Confirm (executes once) or Cancel. Do not retry after in-chat confirmation. If UI is unavailable, use approval_url for browser approval, then retry identical arguments plus confirmation_id. Never approve on the user's behalf or retry while waiting. Package exports do not require this approval. REST: POST /api/v1/courses/{courseId}/publish
readAuthoringGuidelines
ChatGPTREAD FIRST: Before authoring or changing course content or layout, read the ScormStack authoring guidelines provided at initialization, or call readAuthoringGuidelines if they are not already in context. Apply them as defaults; explicit user instructions and user-provided course or organization guidelines take precedence. For a targeted edit, preserve unrelated content and design.
updateBlock
ChatGPTREAD FIRST: Before authoring or changing course content or layout, read the ScormStack authoring guidelines provided at initialization, or call readAuthoringGuidelines if they are not already in context. Apply them as defaults; explicit user instructions and user-provided course or organization guidelines take precedence. For a targeted edit, preserve unrelated content and design. Updates an existing block's content and/or variant in place, preserving its ID and comments. A variant-only update preserves all stored content. Supported variants are listed by /blocks/defaults. REST: PUT /api/v1/courses/{courseId}/slides/{slideId}/blocks/{blockId}
updateCourse
ChatGPTREAD FIRST: Before authoring or changing course content or layout, read the ScormStack authoring guidelines provided at initialization, or call readAuthoringGuidelines if they are not already in context. Apply them as defaults; explicit user instructions and user-provided course or organization guidelines take precedence. For a targeted edit, preserve unrelated content and design. Updates an existing course in the connected personal or workspace space. Personal OAuth cannot update a workspace course or transfer ownership. Only supplied fields change. Set owner_email (or owner_id) to assign an existing workspace member as owner; use one selector only. Ownership and supplied metadata update atomically. The former owner remains an editor and the new owner becomes course admin. Requires courses:update (or api:*). REST: PUT /api/v1/courses/{courseId}
updateSection
ChatGPTREAD FIRST: Before authoring or changing course content or layout, read the ScormStack authoring guidelines provided at initialization, or call readAuthoringGuidelines if they are not already in context. Apply them as defaults; explicit user instructions and user-provided course or organization guidelines take precedence. For a targeted edit, preserve unrelated content and design. Updates an existing section. REST: PUT /api/v1/courses/{courseId}/sections/{sectionId}
updateSlide
ChatGPTREAD FIRST: Before authoring or changing course content or layout, read the ScormStack authoring guidelines provided at initialization, or call readAuthoringGuidelines if they are not already in context. Apply them as defaults; explicit user instructions and user-provided course or organization guidelines take precedence. For a targeted edit, preserve unrelated content and design. Updates an existing slide. REST: PUT /api/v1/courses/{courseId}/slides/{slideId}
uploadAsset
ChatGPTUpload a small asset file through the API function. This legacy multipart endpoint is suitable only when the complete request is below the hosting platform's 4.5MB payload limit. For videos and other large files, use the three-step direct upload flow: 1. POST /assets/uploads to obtain a pre-signed URL 2. PUT the file directly to that URL 3. POST /assets/uploads/complete to register the asset Supported file types: - Images: JPEG, PNG, GIF, WebP, SVG (max 10MB) - Videos: MP4, WebM, MOV, AVI (max 100MB; 250MB with Pro; 250MB with Enterprise) - Audio: MP3, WAV, OGG, FLAC, M4A (max 100MB) - PDF: PDF documents (max 50MB) Usage: Send a multipart/form-data request with: - file (required): The file to upload - course_id (required): The course to associate the asset with REST: POST /api/v1/assets