Convert Google Docs to Canvas LMS Quizzes with the Formswrite API
Formswrite Team
•
February 15, 2026

Convert Google Docs to Canvas LMS Quizzes with the Formswrite API
Manually entering quiz questions into Canvas LMS is one of the most time-consuming tasks for educators and LMS administrators. If you already have your assessments written in Google Docs, the Formswrite API can convert them into Canvas-ready QTI packages automatically.
The Problem with Manual Canvas Quiz Entry
Canvas LMS has a built-in quiz editor, but it requires entering each question individually — typing the question text, adding answer options, marking the correct answer, and setting point values. For a 50-question exam, this can take over an hour.
Canvas does support QTI (Question and Test Interoperability) imports, but creating valid QTI XML packages by hand is even more painful.
The Formswrite API solves both problems: write your quiz in a Google Doc and get a valid QTI package in seconds.
Quick Start
bashcurl -X POST https://api.formswrite.com/api/v1/convert \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"documentId": "YOUR_GOOGLE_DOC_ID",
"format": "canvas",
"documentName": "Midterm Exam - History 101"
}'
Response:
json{
"success": true,
"exportId": "export-uuid",
"downloadUrl": "https://api.formswrite.com/api/forms/exports/export-uuid",
"fileName": "Midterm Exam - History 101-canvas.zip",
"format": "canvas",
"expiresAt": "2026-03-17T00:00:00.000Z"
}
Download the
.zip file and import it into Canvas via Settings → Import Course Content → QTI .zip file.Python Example
pythonimport requests
API_TOKEN = "your_api_token"
response = requests.post(
"https://api.formswrite.com/api/v1/convert",
headers={
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json"
},
json={
"documentId": "1abc123xyz",
"format": "canvas",
"documentName": "History 101 Midterm"
}
)
result = response.json()
if result["success"]:
# Download the QTI zip
qti = requests.get(result["downloadUrl"])
with open(result["fileName"], "wb") as f:
f.write(qti.content)
print(f"Canvas QTI package saved: {result['fileName']}")
Node.js Example
javascriptasync function convertToCanvas(docId, name) {
const response = await fetch('https://api.formswrite.com/api/v1/convert', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.FORMSWRITE_TOKEN}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
documentId: docId,
format: 'canvas',
documentName: name
})
});
const result = await response.json();
if (result.success) {
console.log(`Download QTI: ${result.downloadUrl}`);
console.log(`Expires: ${result.expiresAt}`);
}
return result;
}
How to Import QTI into Canvas
- In Canvas, go to your course
- Click Settings → Import Course Content
- Select QTI .zip file as the content type
- Upload the generated
.zipfile - Click Import
- Your questions appear in the Question Bank
From there, you can create quizzes using the imported questions.
Supported Question Types
The AI automatically converts these question types from your Google Doc:
- Multiple Choice — standard single-answer questions
- Multiple Answer — select all that apply
- True/False — binary choice
- Short Answer — text response
- Essay — long-form response
- Fill in the Blank — text completion
- Matching — pair items together
All question types are mapped to their Canvas equivalents in the QTI package.
Batch Conversion for Multiple Courses
pythoncourses = [
{"doc": "doc_id_1", "name": "History 101 - Quiz 1"},
{"doc": "doc_id_2", "name": "History 101 - Quiz 2"},
{"doc": "doc_id_3", "name": "History 101 - Midterm"},
{"doc": "doc_id_4", "name": "History 101 - Final"},
]
for course in courses:
response = requests.post(
"https://api.formswrite.com/api/v1/convert",
headers={
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json"
},
json={
"documentId": course["doc"],
"format": "canvas",
"documentName": course["name"]
}
)
result = response.json()
if result["success"]:
qti = requests.get(result["downloadUrl"])
with open(result["fileName"], "wb") as f:
f.write(qti.content)
print(f"Ready for Canvas: {course['name']}")
Other LMS Formats
The same API supports all major learning management systems:
| LMS | Format Value | File Type |
|---|---|---|
| Canvas | canvas | .zip (QTI) |
| Moodle | moodle | .xml |
| Blackboard | blackboard | .txt |
| Brightspace (D2L) | brightspace | .zip |
| Schoology | schoology | .zip |
| Sakai | sakai | .zip |
Convert the same Google Doc to any LMS format by changing the
format parameter.Use Cases
- University IT departments automating quiz imports across hundreds of Canvas courses
- Instructional designers batch-converting assessment documents
- EdTech companies integrating Canvas quiz generation into their platforms
- K-12 districts standardizing assessment delivery through Canvas
FAQ
Does the QTI package include images?
Yes. Images from your Google Doc are included in the QTI zip package.
Which QTI version does Canvas use?
Canvas uses QTI 1.2. The Formswrite API generates Canvas-compatible QTI packages. If you need QTI 2.1 or 2.2 for other platforms, use
qti_21 or qti_22 as the format.Can I convert to both Canvas and Moodle from the same document?
Yes. Make two API calls with different
format values (canvas and moodle).Does it work with Canvas New Quizzes?
The generated QTI imports into Canvas Classic Quizzes. Canvas New Quizzes has a separate import system that also supports QTI.
Get Started
Automate your Canvas quiz workflow. Sign up for Formswrite and convert Google Docs to Canvas QTI packages with a single API call.