Bulk import offerings
Prepare a CSV for Course and Resource imports. Upload files first, then reference their file IDs in outline_json.
Who can import
Only active instructors can validate and import offerings from this page. Admin-managed imports must use a separate admin workflow. Confirm instructor access first.
Steps
Upload and copy file IDs
Upload files on the My Files page, then copy each uploaded_file_id or prefilled outline file JSON.
Open My FilesValidate and import
Upload the CSV in the instructor import wizard, validate, then execute.
Open import wizardReview result summary
Check generated external IDs, draft revision status, row-level warnings, and blocking errors in the import result.
Import limits
- This import supports Course and Resource offerings.
- Imported offerings are saved as drafts. Review and publishing happen after import.
- Use the template columns exactly. Extra or older columns are rejected.
- An existing external_id can be imported only when the offering has no outline content, unless you intentionally use append_all=true to append new content. You can copy your existing offering external ID from the Copy external ID button on your instructor offering list.
Large quiz or exam question sets
CSV import works best for setting up offering details, modules, lectures, files, and smaller quiz activities.
The importer can handle long content, but apps like Microsoft Excel, Google Sheets, or Apple Numbers may not keep very large quiz cells intact when you edit and save the CSV.
For large assessments, use the CSV for the offering structure and prepare questions in the platform editor, or contact support for assisted migration.
CSV fields
You can leave optional columns blank when they are not needed for this import.
To set or update an optional detail, enter the value in that offering row.
For type_payload_json, include only the Course or Resource details you want to set or update.
To remove information that is already saved on an offering, use the offering editor after import.
external_idOptionalStable key for creating a new offering or initializing an existing empty-outline offering. Leave blank to generate one.
full_nameRequiredOffering title.
price_tierOptionalPublic list price. Use a supported tier value, or enter a numeric price and the system will round it up to the nearest available tier.
join_membership_planOptionalMembership inclusion request. Use one yes/no value from the template comments.
join_platform_promotionOptionalPromotion eligibility request. Use one yes/no value from the template comments.
category_l1RequiredTop category. Use Course or Resource.
category_l2OptionalSecond-level category, when your selected top category requires one.
category_l3OptionalThird-level category, when your selected second-level category requires one.
languageOptionalLanguage code. Unsupported or empty values default to en (English).
type_payload_jsonOptionalCourse or Resource metadata JSON. Use abstraction and description inside this JSON. abstraction/abstract is limited to 4000 characters; description is limited to 20000 characters. For Resource rows, catalogue.text is synced into the draft description under a Catalogue: marker.
outline_jsonRequiredModules, lectures, uploaded files, and quiz assessment JSON.
Category rules
- category_l1 is always required and must be Course or Resource.
- category_l2 and category_l3 are conditional: fill the next level only when the selected parent has active child categories.
- The final selected category must be the deepest active category in that branch.
- If validation says a category is missing or inactive, check spelling first. If the category does not exist or is inactive, ask an admin to create or activate it before importing.
outline_json
- outline_json uses modules, lectures, files, and assessment payloads.
- Each file item must include filename and uploaded_file_id. You can copy this file information directly from My Files.
- Supported Course/Resource lecture types: video lecture, online doc, download, quiz.
- Quiz lectures do not require files, but must provide assessment inside the lecture object.
- Exam lectures are reserved for Training/Certification offerings and are rejected by the current Course/Resource import flow.
{
"modules": [
{
"name": "Getting Started",
"lectures": [
{
"title": "Course introduction",
"type": "video lecture",
"files": [
{
"filename": "intro.mp4",
"uploaded_file_id": "00000000-0000-0000-0000-000000000101"
}
]
},
{
"title": "Quiz 1",
"type": "quiz",
"assessment": {
"title": "Quiz 1",
"quiz_type": "graded_quiz",
"questions": [
{
"stem": "Which answer is correct?",
"type": "single_choice",
"points": "1.0",
"required": true,
"options": [
{ "label": "A", "text": "Correct", "is_correct": true },
{ "label": "B", "text": "Wrong", "is_correct": false }
],
"scoring_rule": { "scoring_mode": "auto" }
}
]
}
}
]
}
]
}type_payload_json
- Multiline paragraphs are supported for long text fields such as description, welcome_message, and congrats_message.
- abstraction/abstract is limited to 4000 characters. description is limited to 20000 characters.
- For Resource rows, catalogue.text counts toward the final description length after the Catalogue: marker is added.
mode, subtitle, abstraction, description, what_you_will_learn, requirement, who_is_this_for, welcome_message, congrats_message
Use these fields for course summary, learner-facing details, requirements, audience, and completion messages.
mode, abstraction, description, includes, catalogue
Use these fields for resource summary, learner-facing details, included materials, and catalogue information. catalogue.text is synced into the draft description as a Catalogue: fallback display section.
{
"mode": "Self-paced",
"subtitle": "Logic design fundamentals",
"abstraction": "A concise course summary.",
"description": "A practical course description.",
"what_you_will_learn": [
"Read timing diagrams",
"Build simple RTL"
],
"requirement": [
"Basic digital logic"
],
"who_is_this_for": [
"New RTL learners"
]
}