Instructor CSV import

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

Step 1

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 Files
Step 2

Prepare CSV

Fill the template columns. Put modules, lectures, files, and assessments in outline_json.

Replace sample file IDs before importing.

Step 3

Validate and import

Upload the CSV in the instructor import wizard, validate, then execute.

Open import wizard
Step 4

Review 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_idOptional

Stable key for creating a new offering or initializing an existing empty-outline offering. Leave blank to generate one.

full_nameRequired

Offering title.

price_tierOptional

Public 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_planOptional

Membership inclusion request. Use one yes/no value from the template comments.

join_platform_promotionOptional

Promotion eligibility request. Use one yes/no value from the template comments.

category_l1Required

Top category. Use Course or Resource.

category_l2Optional

Second-level category, when your selected top category requires one.

category_l3Optional

Third-level category, when your selected second-level category requires one.

languageOptional

Language code. Unsupported or empty values default to en (English).

type_payload_jsonOptional

Course 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_jsonRequired

Modules, 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.
Example
{
  "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.
Course

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.

Resource

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.

Course example
{
  "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"
  ]
}