Course Import / Export
Back up, share, and duplicate courses as JSON
You can export any course to a JSON file and re-import it later — to back it up, duplicate it, share it with a colleague, or move it between institutions.
What gets exported:
- Course metadata (title, description, level, tags, objectives, etc.)
- Category name
- Every module, lesson, quiz (with questions), and assignment
- Pricing, duration, and visibility settings
What doesn't get exported:
- Student enrollments and progress
- Quiz attempts and assignment submissions
- Discussions and announcements
- Uploaded files (videos, PDFs) — only the URLs are exported
Because uploaded file URLs aren't rewritten, importing a course between institutions means video/PDF URLs still point at the original storage. Re-upload those files in the new institution if they aren't public.
Exporting a Course
- Open any course (Courses → click a course card)
- Click Export in the top-right action bar
- A
course-<slug>-<timestamp>.jsonfile downloads automatically
The file is plain JSON, so you can open it in any text editor, check it into git, or diff two exports to see what changed.
Importing a Course
- Go to Courses in the sidebar
- Click Import in the top-right action bar (next to New Course)
- Select a
.jsonfile from the file picker
On success:
- A new course is created in DRAFT status
- You're redirected to the new course's overview page
- Review, edit, and publish when ready
Import always creates a new course. It never overwrites an existing one. If a course with the same slug already exists, the imported course gets -copy appended to its slug.
Use Cases
Backup before a redesign
Export a working course before making major curriculum changes. If something goes wrong, import the backup as a new draft and copy what you need.
Share templates across instructors
A well-designed course makes a great template. Export it, share the JSON file, and let other instructors import it as a starting point.
Move between environments
Build a course in a staging institution, export it, and import it into the live institution when ready.
Duplicate with modifications
Instead of rebuilding a similar course from scratch, export → import → edit the copy.
JSON Format
The export file looks like this (abbreviated):
{
"version": 1,
"exportedAt": "2026-04-11T10:30:00.000Z",
"course": {
"title": "Biology 101",
"slug": "biology-101",
"description": "Introduction to cellular biology",
"level": "BEGINNER",
"language": "en",
"tags": ["biology", "science"],
"objectives": ["Understand cell structure", "..."],
"categoryName": "Science",
"modules": [
{
"title": "Week 1: Cells",
"order": 0,
"lessons": [
{
"title": "Intro to the Cell",
"type": "VIDEO",
"videoUrl": "https://...",
"quiz": null,
"assignment": null
}
]
}
]
}
}
The top-level version field is 1 today. Future format revisions will keep backward compatibility — a v1 export will always import cleanly.
Advanced: Editing an Export
Because the JSON is plain text, you can script changes before re-importing:
- Bulk rename lessons — find-and-replace in the JSON
- Translate content — run it through a translator and edit
- Reorder modules — shuffle the
modulesarray - Merge two courses — combine their
modulesarrays into one JSON and import
Just make sure the structure stays valid — prisma db push has already generated the types you'd need to validate against if you're scripting.