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. 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 it, then start the import.
Open import wizardReview results
If successful, open the Draft from your Instructor Dashboard to review and refine it before requesting Publish.
Open Instructor DashboardImport limits
- This import supports Course and Resource offerings.
- Imported content is saved to Draft.
- 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_idOptionalCopy an existing offering external ID to update it, or leave this blank when creating a new offering.
full_nameRequiredOffering title.
price_tierOptionalPublic list price. Use a supported tier value, or enter a numeric price to use the next 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. A blank value preserves an existing Draft language; new offerings and unsupported values default to en (English).
type_payload_jsonOptionalCourse or Resource details in JSON. abstraction/abstract is limited to 4000 characters; description is limited to 20000 characters. Resource catalogue.text is included in the description.
outline_jsonRequiredModules, lectures, uploaded files, and quiz content in 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 contains modules, lectures, files, and quiz content.
- Place append_all or replace_all alongside modules in outline_json, and set only one of them to true.
- Use append_all=true to keep the current Outline and add the imported modules at the end. An empty modules list can be used when updating offering details only.
- Use replace_all=true only to replace the complete Draft Outline of an eligible Upcoming offering. Validate will tell you if it is available.
- 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.
- Course and Resource imports do not support Exam lectures.
{
"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 description length.
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.
abstraction, description, includes, catalogue
Use these fields for the resource summary, description, included materials, and catalogue information.
{
"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"
]
}