SCORM error codes explained (101, 201, 301, 401, 403, 405...)
Updated 19 October 2026
Quick answer
A SCORM error code is the LMS's reason for refusing one call from your course. Whatever that call tried to save is missing. Check the SCORM version first: several numbers mean different things in SCORM 1.2 and SCORM 2004.
- Look up your code: the numbers that change meaning, then the full SCORM 1.2 and SCORM 2004 tables.
- 101 or 301 in SCORM 1.2, 103 to 143 in SCORM 2004: usually calls in the wrong order. What to do.
- 405 in 1.2, 406 or 351 in 2004: the LMS refused a value. What to do.
- 403 in SCORM 2004, on a read: usually normal, nothing is lost. Why.
Drop the zip into Alder (free, nothing is uploaded) and run the course in its test player: every refused call shows up in the log with its code and what it means.
First, which SCORM version is it?
Look at the call next to the code. SCORM 1.2 calls start with “LMS”: LMSInitialize, LMSSetValue, LMSFinish. SCORM 2004 calls don't: Initialize, SetValue, Terminate. Field names help too: cmi.core.lesson_status is SCORM 1.2, and cmi.completion_status is SCORM 2004.
The numbers that mean different things
These codes exist in both versions with different meanings. If you found an explanation online that doesn't fit, it was probably for the other version.
| Code | SCORM 1.2 | SCORM 2004 |
|---|---|---|
| 201 | Invalid argument error | General Argument Error |
| 301 | Not initialized | General Get Failure |
| 401 | Not implemented error | Undefined Data Model Element |
| 402 | Invalid set value, element is a keyword | Unimplemented Data Model Element |
| 403 | Element is read only | Data Model Element Value Not Initialized |
| 404 | Element is write only | Data Model Element Is Read Only |
| 405 | Incorrect Data Type | Data Model Element Is Write Only |
SCORM 1.2 error codes
| Code | Name | What it usually means |
|---|---|---|
| 0 | No error | The call worked. |
| 101 | General Exception | The catch-all. Often a call in the wrong order, such as a second LMSInitialize. |
| 201 | Invalid argument error | A field name or argument the LMS can’t use. |
| 202 | Element cannot have children | Asked for _children on a field without any. |
| 203 | Element not an array. Cannot have count. | Asked for _count on a field that isn’t a list. |
| 301 | Not initialized | A call came before LMSInitialize. |
| 401 | Not implemented error | A valid field this LMS doesn’t support. |
| 402 | Invalid set value, element is a keyword | Tried to set a _children or _count field. |
| 403 | Element is read only | Tried to set a field only the LMS sets. |
| 404 | Element is write only | Tried to read a field the course can only set. |
| 405 | Incorrect Data Type | The value has the wrong format, or is too long. |
SCORM 2004 error codes
| Code | Name | What it usually means |
|---|---|---|
| 0 | No Error | The call worked. |
| 101 | General Exception | The catch-all, when no other code fits. |
| 102 | General Initialization Failure | Initialize failed, reason unknown. |
| 103 | Already Initialized | Initialize was called a second time. |
| 104 | Content Instance Terminated | Initialize was called after Terminate. |
| 111 | General Termination Failure | Terminate failed, reason unknown. |
| 112 | Termination Before Initialization | Terminate came before Initialize. |
| 113 | Termination After Termination | Terminate was called a second time. |
| 122 | Retrieve Data Before Initialization | A read came before Initialize. |
| 123 | Retrieve Data After Termination | A read came after Terminate. |
| 132 | Store Data Before Initialization | A save came before Initialize. |
| 133 | Store Data After Termination | A save came after Terminate: it is lost. |
| 142 | Commit Before Initialization | Commit came before Initialize. |
| 143 | Commit After Termination | Commit came after Terminate. |
| 201 | General Argument Error | Usually Initialize, Commit or Terminate without the empty "" argument. |
| 301 | General Get Failure | A read failed, no more specific code. |
| 351 | General Set Failure | A save failed, no more specific code. |
| 391 | General Commit Failure | Commit failed, no more specific code. |
| 401 | Undefined Data Model Element | The field name isn’t a SCORM 2004 field. |
| 402 | Unimplemented Data Model Element | A valid field this LMS doesn’t support. |
| 403 | Data Model Element Value Not Initialized | Read a field that has no value yet. |
| 404 | Data Model Element Is Read Only | Tried to set a field only the LMS sets. |
| 405 | Data Model Element Is Write Only | Tried to read a field the course can only set. |
| 406 | Data Model Element Type Mismatch | The value has the wrong format. |
| 407 | Data Model Element Value Out Of Range | A number outside the allowed range. |
| 408 | Data Model Dependency Not Established | Set a field before the one it depends on. |
Codes and names from Rustici's SCORM run-time reference; the right-hand column is our summary.
Calls in the wrong order (101, 301, 103 to 143)
A SCORM course opens a session with the LMS (Initialize), sends and reads data, and closes the session (Terminate, or LMSFinish in SCORM 1.2). Anything outside that window is refused. SCORM 2004 has a code for each case. SCORM 1.2 only has 301, for a call before LMSInitialize. For the other mistakes, the catch-all 101 is what's left: Alder's test LMS answers a second LMSInitialize with it.

SAP documents “LMSInitialize Error: General Exception” in SuccessFactors when a learner relaunches a course partway through an assessment or goes back a screen, and puts it down to the order of the course's calls (SAP KBA 2811320). Its advice is to send it back to whoever built the course.
Look for custom code first
Storyline, Rise and Captivate make these calls for you. A second Initialize, or a save after the session closed, usually comes from a web object, custom JavaScript or a hand-built page making its own calls.
Republish, unchanged
If there is no custom code, republish for an LMS and upload the zip exactly as the tool made it. Don't add or swap files inside it.
Check the new zip in Alder
Alder flags a course that starts its session more than once (RUNTIME-002) and one that sends data after it finished (RUNTIME-005).

SCORM 2004 gives the same kind of mistake its own number: 133 for a save after Terminate.
The LMS refused a value (405 in 1.2; 406, 407, 351 in 2004)
The call was in the right place, but the LMS didn't accept the value. Find the field name next to the code; it tells you which case you have:
cmi.suspend_data, 405 in SCORM 1.2: the saved progress is too long. We tested this on SCORM Cloud: it refused every save over 4,096 characters with 405. See the suspend_data limit.- Question answers, 405 in SCORM 1.2: on SCORM Cloud, a Storyline quiz course's long-text answers were refused, then sent again as short letter codes, which were accepted. The answers were still recorded.
- An id with spaces, 406 in SCORM 2004: SCORM Cloud refused a question objective id containing spaces in our test. That one save is lost.
cmi.score.scaled, 406 or 407: the scaled score must be a number from -1 to 1. Captivate users report 406 errors from a scaled score sent as “NaN” (not a number). See score not recording.- 351, General Set Failure: the LMS refused a save without a more specific reason. The LMS's detail text (GetDiagnostic, often shown in its debug log) says more.
Read-only and write-only fields (403, 404, 405)
Some fields are set only by the LMS: the learner's name, entry, credit, the mastery score and total_time. Trying to set one gives 403 in SCORM 1.2 (“Element is read only”) and 404 in SCORM 2004. For time, the course sets session_time and the LMS adds it to total_time.
Others can be set but never read back, such as exit and session_time. Reading one gives 404 in SCORM 1.2 and 405 in SCORM 2004. Both mistakes usually come from custom code.
403 in SCORM 2004: usually nothing to fix
In SCORM 2004, 403 means the course read a field that has no value yet. On a first launch that is normal: there is no saved progress or bookmark to read. We saw it on SCORM Cloud for values the course had never set, such as the scaled score, and Captivate users report the same for cmi.suspend_data and cmi.location. If a returning learner gets it for their saved progress, that progress wasn't saved last time: see resume not working.
Find the failing call before you upload (free)
Run the course in Alder
Open Alder, drop the zip and click “Launch the course”. Take the path where the error appears.
Open the technical log
A refused save is marked Problem and a refused read Worth a look, with the code, its name and the exact field and value. A harmless 2004 403 stays marked Normal.
Press “I’m done”
Refused saves become a finding (RUNTIME-011) under “What we found”.

RUNTIME-011 for the SCORM 2004 probe's save after Terminate.
Alder's test LMS is more lenient than SCORM Cloud in places: in our tests it accepted Storyline's long-text answers and 2004 ids with spaces. If your LMS refuses a call that Alder accepts, believe your LMS.
Why a course gets an error code
Each call a course makes returns a result, “true” or “false” for a save. After a failure the course can ask the LMS for the code (GetLastError), its name (GetErrorString) and more detail (GetDiagnostic). The pop-ups and log lines people paste, such as “LMSInitialize Error: General Exception”, are that code shown by the course or the LMS.
Still not working?
- Reading a log line by line: see how to read a SCORM Cloud debug log.
- The course never connects at all: see “Unable to acquire LMS API”.
- No error, but the course stays incomplete: see SCORM course not marking complete.
- Your LMS admin needs evidence: “Download log for your LMS admin” in the test player saves every call with its code.