Web Service - Overview

This page describes Algebrakit's web service API.

You call the API through JSON POST, encoding parameters as a JSON object in the message body. Choose the endpoint closest to your location:

  • Ireland: https://api.algebrakit.com
  • Singapore: https://prod.api.sg-1.algebrakit.com

Note: Make sure you use the same location to load the frontend.

Every request must include an X-API-KEY header containing the unique API key associated with your account.

URL Description
/session/create Create a new interaction from an Exercise Definition or the ID of a predefined exercise in the CMS.
/session/retrieve Create a new interaction from an Exercise Definition or the ID of a predefined exercise in the CMS.
/session/solution Get the worked solution for an exercise or an existing session.
/session/info Returns an extensive overview of the information in the session, such as solutions and student performance
/session/score Calculate scoring for a session.
/sessions/lock Lock or unlock sessions for student input.
/exercise/generate Generate non-random instances for a randomised exercise.
/exercise/published-info Get general information about an exercise in Algebrakit’s CMS, such as name, interaction type, and the number of difficulty levels.
/exercise/validate Retrieve information about an exercise and perform some validation.

Create session

Create new sessions for the (possibly randomized) Algebrakit exercises. You can create multiple sessions in one call to save round trips to Algebrakit’s web service. The response contains a unique session ID for each session. The reply also contains the optimized HTML code to create and initialize the web component for each session. You can insert this HTML in your web page at the appropriate location.

Endpoint: /session/create

Request Body

{
   exercises: [{
      exerciseId?: <string>
      version?: <string>
      exerciseSpec?: <Exercise>
      sessionId?: <string>
      level?: <int>
      nr?: <int>
   }]
   scoringModel?: <string> 
   assessmentMode?: <boolean>
   requireLockForSolution?: <boolean>
   apiVersion: 2
}
Property Description
exerciseId ID of the exercise in the CMS. Either exerciseId, exerciseSpec, or sessionId is required.
version The published version number of the exercise (number) or 'latest' (default), indicating the current version in the CMS.
exerciseSpec Exercise Definition of the exercise. Either exerciseId, exerciseSpec, or sessionId is required.
sessionId ID of an existing exercise session. Except for random exercises, the behavior is the same as for exerciseId. Using exerciseId on random exercises generates a new random instance of the exercise. Using sessionId generates a new session for the same random exercise. Either exerciseId, exerciseSpec, or sessionId is required
level Optional. Difficulty level for the exercise. Applicable for randomized exercise arrangements, which generally offer multiple levels of difficulty. The default value is 0, which represents the lowest level. You can get the number of difficulty levels in the exercise from /exercise-info.
nr Optional. Number of sessions to generate for this exercise. Only relevant for randomized exercises. The default value is 1.
scoringModel Optional. Reference to a predefined scoring model for the exercise. If given, Algebrakit calculates the total marks and the marks earned based on the evaluations of the student's input and taking into account errors and hint requests. Algebrakit will use a standard scoring model that awards one mark to each interaction if omitted. See scoring for more information.
requireLockForSolution Optional. If true (default), prevents anyone from obtaining the solution to this exercise before the session is locked.
assessmentMode Optional. Setting this option to true turns off the step-by-step evaluation, hints, and feedback for the student.
apiVersion Required. Always 2.

Output

The response contains the following session results for each element of the input array exercises.

[{
   success: <boolean>
   msg?: <string>
   sessions: [{
     success: <boolean>
     msg?: <string>
     sessionId: <string>
     html: <string>
     marksTotal: <number>
     type: 'SINGLE' | 'COMPOUND'
     interactions: {id => <InteractionDescription>}
   }]
}]

InteractionDescription = {
   type: <string>
   marks: <number>
   scorable?: <boolean>
}
Property Description
success Indicates if creating of the session succeeded
msg If creating the session was unsuccessful, information about the error.
sessionId A unique ID for this session.
html Optimized html code to create the appropriate web component. This html code already contains the initialization data required by the web component for optimal performance.
type COMPOUND if the exercise has multiple questions (a, b, c, etc). Otherwise SINGLE.
marksTotal The total number of marks that can be earned with this exercise.
interactions Information about each interaction.

Retrieve session

Returns the same session information produced by /session/create without creating a new session. This endpoint can be helpful to efficiently restore a webpage with existing Algebrakit exercises, including a student's previous input.

Note that restoring an existing exercise can be done without using this endpoint, simply by the akit-exercise or akit-interaction web components:

  <akit-exercise session-id="..."></akit-exercise>

The web component will retrieve all needed information (question type, learning events, etc) from the server. However, this roundtrip impacts page load time, especially if multiple exercises are on the page. The /session/retrieve endpoint lets you obtain optimized HTML code for multiple sessions in one call. Inserting this optimized HTML into the webpage prevents a server roundtrip per exercise and allows the exercises to show instantly.

Endpoint: /session/retrieve

Request Body

{
   sessionIds: <string>[]
}
Property Description
sessionIds Array of session IDs to retrieve.

Output

See /session/create.


Generate exercise

Generate nonrandom Exercise Definitions from randomized exercises. With these Exercise Definitions, you can repeatedly create new sessions using endpoint /session/create. A use case is to let an author define a test from a generated list of exercises. The Exercise Definitions of the chosen exercises can then be stored and used repeatedly.

To save round trips to Algebrakit’s web service, you can create multiple instances for randomized exercises in one call.

Endpoint: /exercise/generate

Request body

{
   exercises: [{
      exerciseId?: <string>
      version?: <string>
      exerciseSpec?: <Exercise>
      level?: <int>
      nr?: <int>
   }]
   apiVersion: 2
}
Property Description
exerciseId ID of the exercise in the CMS. Either exerciseId or exerciseSpec is required.
version The published version number of the exercise (number) or 'latest' (default). The latter refers to the current version of the exercise.
exerciseSpec Exercise Definition of the exercise. Either exerciseId or exerciseSpec is required.
level Optional. Difficulty level for the exercise. Applicable for randomized exercise arrangements, which generally offer multiple levels of difficulty. The default value is 0, which represents the lowest level. You can get the number of difficulty levels for the exercise from /exercise-info.
nr Optional. Number of sessions to generate for this exercise. Only relevant for randomized exercises. Default value is 1.
apiVersion Required. Always 2.

Output

The response contains the generated exercises for each element of the input array exercises.

[{
   success: <boolean>
   msg?: <string>
   instances: [{
     success: <boolean>
     msg?: <string>
     exerciseSpec: <Exercise>
     view: <ExerciseView>
   }]
}]
Property Description
success Indicates if generating the nonrandom exercise succeeded.
msg If generating the nonrandom exercise was unsuccessful, information about the error.
view Information relevant for display in the front end, such as instruction text, assignment expression, and required buttons for the formula editor.
exerciseSpec The generated Exercise Definition object.

Get solution

Get the worked solutions for the given sessions. The reply also contains the optimized html code to create and initialize the correct web component for this exercise. You can insert this html in your web page at the appropriate location.

Endpoint: /session/solution

Request body

{
   ids: [<string>]
}
Property Description
ids Session IDs of the desired sessions.

Output

For each session, the following results.

[{
   success: <boolean>
   msg?: <string>
   sessionId: <string>
   type: <string>
   html: <string>
   data: <ExerciseView>
}]
Property Description
success Indicates if creating the solution for this session succeeded.
msg If creating the solution was not successful, information about the error.
sessionId The ID of the session that corresponds to this solution.
html Optimised html code to create the appropriate web component. This html code already contains the initialization data required by the web component for optimal performance.
data Object with with the layout of the exercise, including solutions and step-by-step derivations (if applicable) for the interactions.

Get score

Perform a final evaluation for all interactions in this exercise (if necessary) and retrieve the session results. You can optionally lock the session to prevent any further modifications.

Endpoint: /session/score

Note: Ensure no evaluation events are ongoing when retrieving the score. Learning platforms that use javascript to submit a question should wait before requesting the score.

  await akitExercise.submit(); // wait until the Promise returned by submit() resolves
  // Evaluation is done. It is now safe to retrieve the score

Request Body

{
   sessionId: <string>
   lockSession?: <boolean>
}
Property Description
sessionId ID of the session.
lockSession Set to true to reject future events (evaluation, hint) on this session. Note that it is impossible to unlock the session again.

Output

An exercise can consist of multiple questions (like questions a, b, c, etc.), each containing one or more interactions.

{
   scoring: <ScoringResult>
   questions: [{
      id: <string>
      scoring: <ScoringResult>
      interactions: <InteractionResult>[]
   }]
   tagDescriptions: {<string> : <SkillTagDescription>}
}

<InteractionResult> = {
   id: <string>
   type: <string>
   status: <EvaluationStatus>
   progress: <float>
   scoring: <ScoringResult>
   tags: <SkillTag>[]
   events: <EventData>[]
}

<EventData> =
    {
      event = 'EVALUATE' | 'HINT' | 'GIVEUP'
      timestamp: <long>
      tags: <SkillTag>[]
      annotations: Annotation[]

      //if event  == 'EVALUATE':
      exerciseStatus: <ExerciseStatus>
      inputStatus: <ExpressionStatus> 
      progress: <float> 
    }


<WKDescription> = {
    headLine: ContentElement[];
    subLine?: ContentElement[];
}

<ScoringResult> =
    {
        finished: <boolean>
        marksTotal: <float>
        marksEarned: <float>
        penalties?: {
            hintsRequested: <int>
            mathErrors: <int>
            notationErrors: <int>
        }
    }

<SkillTag> = 
  {
     id: <string>
     source: 'ERROR_FEEDBACK' | 'HINT' | 'FINISHED_STEP'
     weight: <float>
     errors?: <string>[]
  }

<SkillTagDescription> = 
  {
     id: <string>
     descr: {lang: <string>}
     stepType: "STRATEGY" | "ALGEBRA" | "CALCULATE" | "ROUND" | "CONCEPT"
     errors?: <ErrorTag>
  }

<ErrorTag> =
  {
     id: <string>
     descr: {lang: <string>}
     type: <ErrorType>[]
  }

<ErrorType> = "MISCONCEPTION" | "MISTAKE"

<Annotation> =
  {
    type: 'HINT' | 'ERROR_FEEDBACK' | 'INPUT_EXPRESSION'
    main?: ContentElement[];
    sub?: ContentElement[];
    expr?: ContentElement[];
  }

<ContentElement> = {
   mimeType: <string>
   content: <string>
}

<ExerciseStatus> = {
   "FINISHED" | "CORRECT" | "ERROR" | "VIRGIN" | "UNKNOWN"
}

<ExpressionStatus> = 
   'FINISHED' | 'CORRECT' | 'ERROR' | 'NO_MATCH' | 
   'PARSE_ERROR' | 'TRUE_EXPRESSION' | 'FALSE_EXPRESSION'

The output contains the following properties:

Property Description
scoring The total marking for this exercise, based on the results of all interactions.
questions The total marking for each question. Questions are the parts of an exercise, indexed by a, b, c, etc.
tagDescriptions A description of the skills identified in this exercise. The IDs of these tags occur in the results of the various events. You can find more information about detecting mathematical skills here.

The properties of a single interaction are:

Property Description
id The interaction's unique id, or 'ref-id', in this exercise.
type The interaction type.
events An array containing information for every evaluation or hint.
scoring Contains the calculated marking for this interaction based on the evaluations, the hints, and the scoring model.
progress Indicating what percentage of the exercise was completed.
tags A list of tags identifying mathematical skills related to this session. The id in each tag refers to a more detailed description of the skill, which you can find in tagDescriptions. You can find more information about detecting mathematical skills here

The properties of an evaluation event are:

Property Description
exerciseStatus Overall status of the exercise: FINISHED if the question is completed successfully, CORRECT if the question contains valid input but is incomplete, VIRGIN if no work was done, ERROR if the last evaluation contained an error.
inputStatus Evaluation class of the student input. See the table below for more information
progress Indicating what percentage of the exercise was completed.
tags A list of tags identifying mathematical skills related to this event. The id in each tag refers to a more detailed description of the skill, which you can find in tagDescriptions. You can find more information about detecting mathematical skills here.
annotations Textual information about this event, such as error feedback, hint text, or input expression.

Textual information generally consists of text and math elements and is encoded as a list of ContentElement objects. Algebrakit offers two ways to convert this content into HTML; see AlgebraKIT.elements2HTML and akit-content-view.

Scoring results are summarized per interaction, per question, and for the whole exercise.

Property Description
finished Indicates if the student completed the exercise, question, or interaction successfully.
marksTotal The total number of marks the student can earn for this interaction, question, or exercise.
marksEarned The total number of marks that the student got for this interaction, question, or exercise.
penalties Only present on the interaction level. It contains some extra information that explains the scoring for this interaction.

The property inputStatus can have the following values:

Value Description
FINISHED The input is accepted as the final answer to the question.
CORRECT The input is a correct intermediate step but not the final answer.
ERROR The input is incorrect, and Algebrakit has diagnosed an error.
NO_MATCH Algebrakit could not relate the input to any solution step for this question. The input is probably false.
PARSE_ERROR The input is not a valid mathematical expression.
TRUE_EXPRESSION The input is a correct expression, such as 2x+3x=5x, but Algebrakit could not relate the input to any solution step for this question.
FALSE_EXPRESSION The input is incorrect, such as 2+3=6.

Session Info

Retrieve a readable overview of the information in a session, including the layout of the exercise, solution and derivation of interactions, and scoring results. This information provides more information than Get score. However, calculating the solutions can be time-consuming so you should use Get score when possible.

Endpoint: /session/info

Request Body

{
   sessionId: <string>
}
Property Description
sessionId The session ID to get the results from

Output

{
   elements: <ElementInfo>,
   tagDescriptions: {<string> : <SkillTagDescription>}
}

<ElementInfo> = 
{
   id: <string>,
   type: "CONTENT" | "QUESTION",
   items: <ElementItemInfo>[]
}

<ElementItemInfo> = <InteractionInfo> | <TextItemInfo>

<TextItemInfo> =
{
   itemType: "TEXT",
   content: <string>
}

<InteractionInfo> =
{
   itemType: "INTERACTION",
   id: <string>,
   interactionType: <string>,
   content?: <string>,
   solution?: <string>,
   derivation?: <DerivationPart>[],
   result: <InteractionResult>
}

Property Description
tagDescriptions A description of the skills identified in the response. You can find more information about detecting mathematical skills here.
interactionType Question type, like "MULTISTEP", "FILL_IN_THE_BLANKS", etc
content Text-like content. Math content is encoded as latex and wrapped in dollar signs, like "Simplify $$\sqrt{x^2}$$"
solution The correct solution, if available
derivation The step-by-step worked solution, if available
result Information about the student's performance. See Get score for a description of <InteractionResult>

<DerivationPart> = <DerivationExpression> | <DerivationStep> | <DerivationHint> 

<DerivationExpression> =
{
   expression: <string>
}

<DerivationStep> = 
{
   description?: <string>,
   derivation?: <DerivationStep>,
   result: <string>
}

<DerivationHint> =
{
   hint: <string>
}

Property Description
expression Math expression in latex syntax.
result Resulting expression of a rewriting step in latex syntax

Lock sessions

Lock or unlock a session. A locked session does not accept new inputs from a student. This functionality is mainly intended for assessments to guarantee nobody changes the results afterward.

There are two types of lock actions. You can later undo a LOCK action with an UNLOCK action. A FINALIZE action locks a session forever.

You can lock or unlock a batch of sessions in a single call.

Endpoint: /sessions/lock

Request Body

{
   action: 'LOCK' | 'UNLOCK' | 'FINALIZE'
   sessionIds: <string>[]
}
Property Description
action 'LOCK': Apply a reversible lock;
'UNLOCK': Unlock a session that was locked with 'LOCK';
'FINALIZE': Lock the session indefinitely.
sessionIds Array of session IDs to lock or unlock.

Exercise info

Retrieve information about an exercise in Algebrakit's CMS, such as available versions, the structure, and the change history.

Endpoint: /exercise/published-info

Request Body

{
   id: <string>
}
Property Description
id ID of the exercise.

Output

Information about the structure of the exercise.

{
    commitHistory: CommitData[];
    id: string;
    publishedVersions: <PubVersionInfo>[];
    courseName: string;
    type: string;
}
Property Description
id The exercise ID
type regular exercise if the question is defined by an Exercise Specification (default), single reference if the question is a reference to a question in the question library, arrangement exercise if the question refers to multiple questions in the question library.
<PubVersionInfo> = {
    name: string;
    majorVersion: number | 'latest';
    minorVersion: number;
    metadata: {[key: string]: string};
    numberOfLevels?: number;
    interactions: <InteractionInfo>[];
    resources: <ResourceInfo>[];
}

<CommitData> = {
    versionNumber: string;
    commitDate: Date;
    commitMessage: string;
    authorUsername: string
}

<InteractionInfo> = {
    block: string;
    refId: string;
    type: <QuestionType>;
    refName: string
}

<ResourceInfo> = {
    refId: string;
    type: string;
    refName: string
}

<QuestionType> = {
   MULTISTEP, 
   FILL_IN_THE_BLANKS, 
   MATH_TABLE, 
   MODEL_METHOD,
   ARITHMETIC,   //Written Arithmetic
   OPEN_ANSWER, 
   CHOICE, 
   STATISTICS,   //Data Analysis
   GEOMETRY,     //Geometry and Graphs
   NUMBER_LINE 
}


Validate exercise

This endpoint checks whether an exercise is valid (i.e., that it runs) and to obtain general information.

Endpoint: /exercise/validate

Request body

{ 
      exerciseId?: <string>
      version?: <string>
      exerciseSpec?: <Exercise>
}
Property Description
exerciseId ID of the exercise in the CMS. Either exerciseId or exerciseSpec is required.
version The published version number of the exercise (number) or 'latest' (default). The latter refers to the current version of the exercise.
exerciseSpec An exercise specification as obtained from the exercise authoring tool

Output

{
   valid: <boolean>
   msg?: <string>
   marks: <number>
   random: <boolean>
   interactions: {[refId: string]:InteractionInfo}
]

InteractionInfo = {
   type: <string>
   marks: <number>
}

Property Description
valid If false, this exercise has a problem and is not suitable to create sessions.
msg A description of the problem in case the exercise is not valid
marks The total number of marks for this exercise
random Indicates whether this exercise is randomized or not
interactions A map with information on the interactions in the exercise. The key is the unique ID of the interaction.