IMS Candidate Final

IMS Global Logo

IMS Comprehensive Learner Record REST/JSON Binding Version 1.0

IMS Candidate Final
Version 2.0

Date Issued: 26 August 2019
Latest version: http://www.imsglobal.org/clr/

IPR and Distribution Notices

Recipients of this document are requested to submit, with their comments, notification of any relevant patent claims or other intellectual property rights of which they may be aware that might be infringed by any implementation of the specification set forth in this document, and to provide supporting documentation.

IMS takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on IMS's procedures with respect to rights in IMS specifications can be found at the IMS Intellectual Property Rights web page: http://www.imsglobal.org/ipr/imsipr_policyFinal.pdf.

Copyright © 2019 IMS Global Learning Consortium. All Rights Reserved.

Use of this specification to develop products or services is governed by the license with IMS found on the IMS website: http://www.imsglobal.org/speclicense.html.

Permission is granted to all parties to use excerpts from this document as needed in producing requests for proposals.

The limited permissions granted above are perpetual and will not be revoked by IMS or its successors or assigns.

THIS SPECIFICATION IS BEING OFFERED WITHOUT ANY WARRANTY WHATSOEVER, AND IN PARTICULAR, ANY WARRANTY OF NONINFRINGEMENT IS EXPRESSLY DISCLAIMED. ANY USE OF THIS SPECIFICATION SHALL BE MADE ENTIRELY AT THE IMPLEMENTER'S OWN RISK, AND NEITHER THE CONSORTIUM, NOR ANY OF ITS MEMBERS OR SUBMITTERS, SHALL HAVE ANY LIABILITY WHATSOEVER TO ANY IMPLEMENTER OR THIRD PARTY FOR ANY DAMAGES OF ANY NATURE WHATSOEVER, DIRECTLY OR INDIRECTLY, ARISING FROM THE USE OF THIS SPECIFICATION.

Public contributions, comments and questions can be posted here: www.imsglobal.org/forums/ims-glc-public-forums-and-resources.

Trademark information: http://www.imsglobal.org/copyright.html

Document Name: IMS Comprehensive Learner Record REST/JSON Binding v1.0

Revision: 26 August 2019

toc | top

Abstract

The IMS Comprehensive Learner Record (CLR) Specification has been designed to create, transmit, and render an individual's set of achievements from one issuer, in a digital, machine-readable format. The specification allows for global adoption and supports shared tools within the IMS Global community.

The Comprehensive Learner Record supports interoperability in that CLR Providers and Consumers can consistently send and receive records among conformant entities. The IMS Comprehensive Learner Record specification describes an information model, service definition, and implementation guide to allow institutions, suppliers, and others to 'extend' the traditional transcript with records and types of information that are typically not found in a traditional transcript, such as competency attainment and co-curricular activities, and to define and facilitate an institution's learner achievements record store for collection of CLRs.

The CLR digitized information can be consumed by other schools, institutions, employers, and any other entities that are conformant as CLR consumers. In this machine readable format, CLR data enables granular and expansive discoverability of learning achievements that was not previously possible.

toc | top

Table of Contents

Abstract

1. Introduction

1.1 Scope and Context

1.2 Conventions

1.3 Structure of this Document

1.4 Nomenclature

3. The REST Endpoints

3.1 Mapping of the Service Operations to the REST Endpoints

3.2 API Root URL and Versioning

3.3 Predefined Endpoint Query Parameters

3.3.1 "deleteClr" Endpoint Query Parameters

3.3.2 "getAssertion" Endpoint Query Parameters

3.3.3 "getClrs" Endpoint Query Parameters

3.3.4 "getDiscoveryDocument" Endpoint Query Parameters

3.3.5 "getEndorsement" Endpoint Query Parameters

3.3.6 "getKey" Endpoint Query Parameters

3.3.7 "replaceClr" Endpoint Query Parameters

3.4 HTTP Code Handling

4. Security Framework

4.1 Overview

4.2 Architecture

4.3 OAuth 2.0 Client Credentials Grant Resource Access

4.3.1 CCG - Registration

4.3.2 CCG - Obtaining Tokens

4.3.3 CCG - Authenticating with Tokens

4.4 OAuth 2.0 Authorization Code Grant Resource Access

4.4.1 ACG - Registration

4.4.2 ACG - Obtaining Tokens

4.4.3 ACG - Authenticating with Tokens

5. JSON Payloads

5.1 "deleteClr" Request Payload

5.2 "deleteClr" Response Payload

5.2.1 Response Payloads for the HTTP Codes (204)

5.2.2 Response Payloads for the HTTP Codes (400, 401, 403, 404, default)

5.3 "getAssertion" Request Payload

5.4 "getAssertion" Response Payload

5.4.1 Response Payloads for the HTTP Codes (200)

5.4.2 Response Payloads for the HTTP Codes (404, default)

5.5 "getClrs" Request Payload

5.6 "getClrs" Response Payload

5.6.1 Response Payloads for the HTTP Codes (200)

5.6.2 Response Payloads for the HTTP Codes (400, 401, 403, 404, default)

5.7 "getDiscoveryDocument" Request Payload

5.8 "getDiscoveryDocument" Response Payload

5.8.1 Response Payloads for the HTTP Codes (200)

5.8.2 Response Payloads for the HTTP Codes (404, 421, default)

5.9 "getEndorsement" Request Payload

5.10 "getEndorsement" Response Payload

5.10.1 Response Payloads for the HTTP Codes (200)

5.10.2 Response Payloads for the HTTP Codes (404, default)

5.11 "getKey" Request Payload

5.12 "getKey" Response Payload

5.12.1 Response Payloads for the HTTP Codes (200)

5.12.2 Response Payloads for the HTTP Codes (404, default)

5.13 "replaceClr" Request Payload

5.14 "replaceClr" Response Payload

5.14.1 Response Payloads for the HTTP Codes (200, 201)

5.14.2 Response Payloads for the HTTP Codes (304)

5.14.3 Response Payloads for the HTTP Codes (400, 401, 403, 404, default)

6. Service OpenAPI Description

6.1 General Information

6.2 Tags Information

6.3 Security Information

6.4 Paths Information

6.4.1 "/assertions/{id}" Path

6.4.2 "/clrs" Path

6.4.3 "/clrs/{id}" Path

6.4.4 "/discovery" Path

6.4.5 "/endorsements/{id}" Path

6.4.6 "/keys/{id}" Path

6.5 Definitions Information

6.5.1 "AchievementDType" Definition

6.5.2 "AddressDType" Definition

6.5.3 "AlignmentDType" Definition

6.5.4 "ArtifactDType" Definition

6.5.5 "AssertionDType" Definition

6.5.6 "AssertionBaseDType" Definition

6.5.7 "AssociationDType" Definition

6.5.8 "CLRDType" Definition

6.5.9 "CLRSetDType" Definition

6.5.10 "CriteriaDType" Definition

6.5.11 "CryptographicKeyDType" Definition

6.5.12 "DiscoveryDocumentDType" Definition

6.5.13 "EndorsementDType" Definition

6.5.14 "EndorsementBaseDType" Definition

6.5.15 "EndorsementClaimDType" Definition

6.5.16 "EndorsementProfileDType" Definition

6.5.17 "EvidenceDType" Definition

6.5.18 "IdentityDType" Definition

6.5.19 "ProfileDType" Definition

6.5.20 "ResultDType" Definition

6.5.21 "ResultDescriptionDType" Definition

6.5.22 "RevocationListDType" Definition

6.5.23 "SignedAssertionDType" Definition

6.5.24 "SignedEndorsementDType" Definition

6.5.25 "VerificationDType" Definition

6.5.26 "imsx_CodeMinorDType" Definition

6.5.27 "imsx_CodeMinorFieldDType" Definition

6.5.28 "imsx_StatusInfoDType" Definition

7. Extending and Profiling the Service

7.1 Extending the Service

7.1.1 Proprietary Operations

7.1.2 Proprietary Data Elements

7.2 Profiling the Service

References

Appendix A REST/JSON Modelling Terms

A1 REST Endpoint Description Explanations

A1.1 REST Endpoint Mapping Table Explanation

A1.2 Query Parameter Table Explanation

A1.3 Error Codes and Handling for each Endpoint Table Explanation

A2 OpenAPI Descriptions Explanations

A2.1a OpenAPI(2) General Information Table Explanation

A2.1b OpenAPI(3) General Information Table Explanation

A2.2 OpenAPI Tags Table Explanation

A2.3 OpenAPI Security Table Explanation

A2.4 OpenAPI Paths Table Explanation

A2.5 OpenAPI Definitions Table Explanation

Appendix B OpenAPI Listings

B1 Comprehensive Learner Record Service OpenAPI JSON Definition Listing

B1.1 OpenAPI 2.0 JSON Listing

B1.2 OpenAPI 3.0 JSON Listing

B2 Comprehensive Learner Record Service OpenAPI YAML Definition Listing

B2.1 OpenAPI 2.0 YAML Listing

B2.2 OpenAPI 3.0 YAML Listing

About this Document

List of Contributors

Revision History

toc | top

List of Tables

Table 3.1 - The Set of REST Endpoint URL-leaf Values.

Table 3.4 - The List of HTTP Codes and Handling for each Endpoint.

Table 5.13.1 - Tabular representation of the JSON payload for the request message for a "replaceClr" operation.

Table 6.1a - The Set of General Information Defined in the OpenAPI(2) Description.

Table 6.1b - The Set of General Information Defined in the OpenAPI(3) Description.

Table 6.2 - The Set of Tags Defined in the OpenAPI Description.

Table 6.4.1 - The Set of HTTP Verbs Permitted on the "/assertions/{id}" Path.

Table 6.4.2 - The Set of HTTP Verbs Permitted on the "/clrs" Path.

Table 6.4.3 - The Set of HTTP Verbs Permitted on the "/clrs/{id}" Path.

Table 6.4.4 - The Set of HTTP Verbs Permitted on the "/discovery" Path.

Table 6.4.5 - The Set of HTTP Verbs Permitted on the "/endorsements/{id}" Path.

Table 6.4.6 - The Set of HTTP Verbs Permitted on the "/keys/{id}" Path.

Table 6.5.1 - OpenAPI JSON Schema description for the "AchievementDType" Complex Type.

Table 6.5.2 - OpenAPI JSON Schema description for the "AddressDType" Complex Type.

Table 6.5.3 - OpenAPI JSON Schema description for the "AlignmentDType" Complex Type.

Table 6.5.4 - OpenAPI JSON Schema description for the "ArtifactDType" Complex Type.

Table 6.5.5 - OpenAPI JSON Schema description for the "AssertionDType" Complex Type.

Table 6.5.6 - OpenAPI JSON Schema description for the "AssertionBaseDType" Complex Type.

Table 6.5.7 - OpenAPI JSON Schema description for the "AssociationDType" Complex Type.

Table 6.5.8 - OpenAPI JSON Schema description for the "CLRDType" Complex Type.

Table 6.5.9 - OpenAPI JSON Schema description for the "CLRSetDType" Complex Type.

Table 6.5.10 - OpenAPI JSON Schema description for the "CriteriaDType" Complex Type.

Table 6.5.11 - OpenAPI JSON Schema description for the "CryptographicKeyDType" Complex Type.

Table 6.5.12 - OpenAPI JSON Schema description for the "DiscoveryDocumentDType" Complex Type.

Table 6.5.13 - OpenAPI JSON Schema description for the "EndorsementDType" Complex Type.

Table 6.5.14 - OpenAPI JSON Schema description for the "EndorsementBaseDType" Complex Type.

Table 6.5.15 - OpenAPI JSON Schema description for the "EndorsementClaimDType" Complex Type.

Table 6.5.16 - OpenAPI JSON Schema description for the "EndorsementProfileDType" Complex Type.

Table 6.5.17 - OpenAPI JSON Schema description for the "EvidenceDType" Complex Type.

Table 6.5.18 - OpenAPI JSON Schema description for the "IdentityDType" Complex Type.

Table 6.5.19 - OpenAPI JSON Schema description for the "ProfileDType" Complex Type.

Table 6.5.20 - OpenAPI JSON Schema description for the "ResultDType" Complex Type.

Table 6.5.21 - OpenAPI JSON Schema description for the "ResultDescriptionDType" Complex Type.

Table 6.5.22 - OpenAPI JSON Schema description for the "RevocationListDType" Complex Type.

Table 6.5.23 - OpenAPI JSON Schema description for the "SignedAssertionDType" Complex Type.

Table 6.5.24 - OpenAPI JSON Schema description for the "SignedEndorsementDType" Complex Type.

Table 6.5.25 - OpenAPI JSON Schema description for the "VerificationDType" Complex Type.

Table 6.5.26 - OpenAPI JSON Schema description for the "imsx_CodeMinorDType" Complex Type.

Table 6.5.27 - OpenAPI JSON Schema description for the "imsx_CodeMinorFieldDType" Complex Type.

Table 6.5.28 - OpenAPI JSON Schema description for the "imsx_StatusInfoDType" Complex Type.

Table A1.1 The key to the descriptions of the mapping between a service calls and its REST endpoint URL-leaf

Table A1.2 The key to the descriptions of the data attribute/characteristic tables

Table A1.3 The key to the descriptions of the list of error codes and handling for each endpoint

Table A2.1a The key to the tabular description of the OpenAPI(2) general information

Table A2.1b The key to the tabular description of the OpenAPI(3) general information

Table A2.2 The key to the tabular description of the OpenAPI tags information

Table A2.3 The key to the tabular description of the OpenAPI security information.

Table A2.4 The key to the tabular description of the OpenAPI paths information for an HTTP Verb

Table A2.5 The key to the tabular description of the OpenAPI definitions information

toc | top

List of Code Blocks

Code 5.2.2 - JSON payload example for "400, 401, 403, 404, default" response messages for a "deleteClr" operation.

Code 5.4.1 - JSON payload example for "200" response messages for a "getAssertion" operation.

Code 5.6.1 - JSON payload example for "200" response messages for a "getClrs" operation.

Code 5.6.2 - JSON payload example for "400, 401, 403, 404, default" response messages for a "getClrs" operation.

Code 5.8.1 - JSON payload example for "200" response messages for a "getDiscoveryDocument" operation.

Code 5.10.1 - JSON payload example for "200" response messages for a "getEndorsement" operation.

Code 5.12.1 - JSON payload example for "200" response messages for a "getKey" operation.

Code 5.13.1 - JSON payload example for the request message for a "replaceClr" operation.

Code 5.14.1 - JSON payload example for "200, 201" response messages for a "replaceClr" operation.

Code 5.14.3 - JSON payload example for "400, 401, 403, 404, default" response messages for a "replaceClr" operation.

toc | top

1. Introduction

1.1. Scope and Context

This document is the IMS Comprehensive Learner Record (CLR) REST/JSON Binding Version 1.0 and as such it is used as the basis for implementing the CLR Service. The key related documents are:

This information model and this REST/JSON binding define the IMS Comprehensive Learner Record Abstract Application Programming Interface (a-API). This model is described using the Unified Modeling Language (UML) based upon the IMS Global Model Driven Specification approach and the associated modelling toolkit [I-BAT, 06]. This means that this specification is based upon the concepts of:

1.2. Conventions

All sections marked as non-normative, all authoring guidelines, diagrams (with the exception of the UML diagrams), examples, and notes in this specification are non-normative. Everything else in this specification is normative.

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC 2119]. This means that from the perspective of conformance:

The Conformance and Certification Guide for this specification may introduce greater normative constraints than those defined here for specific service or implementation categories.

The SHOULD/SHOULD NOT/RECOMMENDED statements MUST NOT be used in any document, or section of a document, that is responsible for defining the information model and/or the associated bindings and/or conformance and certification.

1.3. Structure of this Document

The structure of the rest of this document is:

3. The REST Endpoints An explanation of the relationship between the logical service operations (as defined in the Comprehensive Learner Record Information Model [CLR, 19d]) and how these are realised as the corresponding set of REST endpoints (including the set of query parameters that are permitted);
4. Security Framework The underlying security framework within which this REST/JSON binding is designed to operate. This includes the details about authentication and how the payload integrity may be protected;
5. JSON Payloads Examples of the set of JSON payloads that are sent by the consumer (the request) and returned by the service provider (response). These examples are focused on the expected structure of a request/response and do not include actual payloads;
6. Service OpenAPI Description A detailed explanation of the structure of the OpenAPI files that are produced as part of the specification documentation. The associated JSON and YAML files are supplied in Appendix B;
7. Extending and Profiling the Service An explanation of how the service can be extended, using the permitted points of extension and/or profiled. Profiling is the process by which the specification is tailored to a specific set of market/domain requirements;
References A list of references used throughout this document.
Appendix A REST/JSON Modelling Terms An overview of the model driven approach, the concepts and the terms used by IMS to create the service model REST/JSON binding definitions (based upon a profile of UML) and the accompanying documentation (including this binding);
Appendix B OpenAPI Listings The listings of the OpenAPI(JSON) and OpenAPI(YAML) files that have been created to define the REST/JSON binding in a machine-readable format i.e. conforming to the OpenAPI 2.0 specification.

1.4. Nomenclature

A-API Abstract API
API Application Programming Interface
CASE IMS Competencies and Standards Exchange specification
CBE Competency Based Education
CLR Comprehensive Learner Record
HE Higher Education
IETF Internet Engineering Task Force
IdentityHash A hash string preceded by a dollar sign ('$') and the algorithm used to generate the hash. The supported algorithms are MD5 and SHA-256, identified by the strings md5 and sha256 respectively. For example: sha256$28d50415252ab6c689a54413da15b083034b66e5 represents the result of calculating a SHA-256 hash on the string 'mayze'.
JSON Java Script Object Notation
JSON-LD A JSON-based serialization for Linked Data
REST Representation State TRansfer
RFC Request for Comments
UML Unified Modelling Language
URI Uniform Resource Identifier
URL Uniform Resource Locator
XML Exchange Markup Language
XSD XML Schema Definition

toc | top

3. The REST Endpoints

This Section is NORMATIVE.

3.1 Mapping of the Service Operations to the REST Endpoints

The mapping between the service operations and the REST Endpoint URL-leaf values are listed in Table 3.1. The syntax and semantics for this mapping are described in Appendix A1.1.

Table 3.1 - The Set of REST Endpoint URL-leaf Values.
Service Call REST Endpoint HTTP Verb
deleteClr /clrs/{id} DELETE
getAssertion /assertions/{id} GET
getClrs /clrs GET
getDiscoveryDocument /discovery GET
getEndorsement /endorsements/{id} GET
getKey /keys/{id} GET
replaceClr /clrs POST

3.2 API Root URL and Versioning

All of the paths MUST also contain, as the base of the path, excluding the host name, the string: "/ims/clr/v1p0/".

3.3 Predefined Endpoint Query Parameters

The definition of the permitted set of query parameters are defined in the following Tables. The syntax and semantics for this Tables are described in Appendix A1.2.

3.3.1 "deleteClr" Endpoint Query Parameters

There are no pre-defined query parameters for this endpoint.

3.3.2 "getAssertion" Endpoint Query Parameters

There are no pre-defined query parameters for this endpoint.

3.3.3 "getClrs" Endpoint Query Parameters

3.3.3.1 "limit" Query Parameter

The description of the "limit" query parameter is presented in Table 3.3.3.1

Table 3.3.3.1 - The definition of the "limit" query parameter for the "getClrs" operation.
Descriptor Definition
Parameter Name limit
Data Type PositiveInteger (Primitive-type)
Value Space See Appendix A1.2.
Default = "100".
Multiplicity [0..1]
Description The number of results to return.

3.3.3.2 "offset" Query Parameter

The description of the "offset" query parameter is presented in Table 3.3.3.2

Table 3.3.3.2 - The definition of the "offset" query parameter for the "getClrs" operation.
Descriptor Definition
Parameter Name offset
Data Type NonNegativeInteger (Primitive-type)
Value Space See Appendix A1.2.
Multiplicity [0..1]
Description The index of the first record to return. (zero indexed)

3.3.3.3 "since" Query Parameter

The description of the "since" query parameter is presented in Table 3.3.3.3

Table 3.3.3.3 - The definition of the "since" query parameter for the "getClrs" operation.
Descriptor Definition
Parameter Name since
Data Type DateTime (Primitive-type)
Value Space See Appendix A1.2.
Multiplicity [0..1]
Description Retrieve CLRs that were issued after the provided timestamp. Must be an ISO 8601 compatible timestamp with a time zone indicator.

3.3.4 "getDiscoveryDocument" Endpoint Query Parameters

There are no pre-defined query parameters for this endpoint.

3.3.5 "getEndorsement" Endpoint Query Parameters

There are no pre-defined query parameters for this endpoint.

3.3.6 "getKey" Endpoint Query Parameters

There are no pre-defined query parameters for this endpoint.

3.3.7 "replaceClr" Endpoint Query Parameters

There are no pre-defined query parameters for this endpoint.

3.4 HTTP Code Handling

A service provider will either return a data payload or a payload that indicates the cause of the failure. The list of HTTP Codes and handling for each endpoint is shown in Table 3.4. The syntax and semantics for this tabular description are described in Appendix A1.3.

Table 3.4 - The List of HTTP Codes and Handling for each Endpoint.
REST Endpoint HTTP Verb HTTP Codes and Handling
/assertions/{id} GET
  • 200 - 'OK' - the resource is returned in the payload. The payload is defined by the structure AssertionDType.
  • 404 - 'Not Found' – there is no resource behind the URI. There is no payload in the response message.
/clrs GET
  • 200 - 'OK' - the resource is returned in the payload. The payload is defined by the structure CLRSetDType.
  • 400 - 'Bad Request' – the request was invalid or cannot be served. The exact error should be explained in the error payload. The payload is defined by the structure imsx_StatusInfoDType.
  • 401 - 'Unauthorized' – the request requires an user authentication. The payload is defined by the structure imsx_StatusInfoDType.
  • 403 - 'Forbidden' – the server understood the request, but is refusing it or the access is not allowed. The payload is defined by the structure imsx_StatusInfoDType.
  • 404 - 'Not Found' – there are no resources behind the URI. The payload is defined by the structure imsx_StatusInfoDType.
/clrs POST
  • 200 - 'OK' – the resource was successfully replaced. The payload is defined by the structure CLRDType.
  • 201 - 'Created` – the resource was successfully created. The payload is defined by the structure CLRDType.
  • 304 - 'Not Modified' – the client can use cached data. There is no payload in the response message.
  • 400 - 'Bad Request' – the request was invalid or cannot be served. The exact error should be explained in the error payload. The payload is defined by the structure imsx_StatusInfoDType.
  • 401 - 'Unauthorized' – the request requires user authentication. The payload is defined by the structure imsx_StatusInfoDType.
  • 403 - 'Forbidden' – the server understood the request, but is refusing it or the access is not allowed. The payload is defined by the structure imsx_StatusInfoDType.
  • 404 - 'Not Found' – there is no resource behind the URI. The payload is defined by the structure imsx_StatusInfoDType.
/clrs/{id} DELETE
  • 204 - 'No Content' – The resource was successfully deleted. There is no payload in the response message.
  • 400 - 'Bad Request' – The request was invalid or cannot be served. The exact error should be explained in the error payload. The payload is defined by the structure imsx_StatusInfoDType.
  • 401 - 'Unauthorized' – The request requires an user authentication. The payload is defined by the structure imsx_StatusInfoDType.
  • 403 - 'Forbidden' – The server understood the request, but is refusing it or the access is not allowed. The payload is defined by the structure imsx_StatusInfoDType.
  • 404 - 'Not found' – There is no resource behind the URI. The payload is defined by the structure imsx_StatusInfoDType.
/discovery GET
  • 200 - 'OK' - the resource is returned in the payload. The payload is defined by the structure DiscoveryDocumentDType.
  • 404 - 'Not Found' – there is no resource behind the URI. There is no payload in the response message.
  • 421 - 'Misdirected Request' - the request was not made over secure TLS 1.2 or 1.3 protocol. There is no payload in the response message.
/endorsements/{id} GET
  • 200 - 'OK' - the resource is returned in the payload. The payload is defined by the structure EndorsementDType.
  • 404 - 'Not Found' – there is no resource behind the URI. There is no payload in the response message.
/keys/{id} GET
  • 200 - 'OK' - the resource is returned in the payload. The payload is defined by the structure CryptographicKeyDType.
  • 404 - 'Not Found' – there is no resource behind the URI. There is no payload in the response message.

toc | top

4. Security Framework

This Section is NORMATIVE.

4.1. Overview

This specification has several REST endpoints. Some of those endpoints are secured and the others are not. This section describes how the secured endpoints are protected. The following REST endpoints are protected using the OAuth 2.0 Authorization Framework [RFC6749]:

REST Endpoint HTTP Verb Scope Required
clrs/{id} DELETE https://purl.imsglobal.org/spec/clr/v1p0/scope/delete
clrs GET https://purl.imsglobal.org/spec/clr/v1p0/scope/readonly
clrs POST https://purl.imsglobal.org/spec/clr/v1p0/scope/replace

Endpoints that are secured must use the methods outlined in Section 4, "Securing Web Services" of the IMS Security Framework [SECURITY FRAMEWORK, 19a]. Consumers and Providers that have a pre-established trust relationship and shared ownership of the resources MUST use the OAuth 2.0 Client-Credentials Grant method. Consumers and Providers that give individual users access to their resources MUST use the OAuth 2.0 Authorization Code Grant method. A partial list of examples are shown in the table below:

Example Grant Method to Use
A university system within a state is collecting CLRs from every campus. The Providers are the campus learning information systems. The Consumer is the university system's CLR Hub. OAuth 2.0 Client Credentials Grant because the Consumer and Provider have a pre-established trust relationship and shared ownership of the protected resources.
A school district contracts out a specialty program to a third party. The district collects a CLR for each student from the third party at the end of each course. The Consumer is the school district and the Provider is the third party.
A university system maintains a CLR Hub students and alumni can use to retrieve their personal extended transcript. A student is using a third party application to assemble a personal portfolio. The student uses the portfolio application to get their extended transcript from the university system's CLR Hub. The Consumer is the portfolio application and the Provider is the CLR Hub. OAuth 2.0 Authorization Code Grant because the learner is accessing their own individual resources.
A learner has used a personal portfolio application to assemble a comprehensive record of their achievements. The learner uses the portfolio application to "submit" their CLR to a potential employer. The Consumer is the portfolio application and the Provider is the employer's career tracking system.

4.2. Architecture

Diagram showing the major components of the CLR security

Diagram of the major components of the CLR security framework

Secure IMS services use the OAuth 2.0 Authorization Framework [RFC6749] to protect resources such as comprehensive learner records. There are five key components to the CLR security architecture.

User
This is the individual that owns the protected resources (CLRs) that are on the Provider.
Web Browser
This is the web browser application that the User interacts with.
Consumer
This is the web application that interacts with the Provider on behalf of the User.
Authorization Server
This is a server that implements OAuth 2.0 endpoints on behalf of the Provider. In many systems, the Authorization Server and the Provider are combined.
Provider
This is the resource server that has the protected resources (CLRs).

The role of each component during Registration, Obtaining Tokens, and Authenticating with Tokens using the appropriate method are described below.

4.3. OAuth 2.0 Client Credentials Grant Resource Access

Consumers and Providers that have a pre-established trust relationship and shared ownership of the protected resources MUST use the OAuth 2.0 Client-Credentials Grant (CCG) method.

Consumers and Providers implementing this method of security MUST comply with Section 4.1, "Using OAuth 2.0 Client-Credentials Grant" of the IMS Security Framework [SECURITY FRAMEWORK, 19a].

4.3.1. CCG - Registration

To get started, the Consumer and Provider must share three pieces of information as shown below. The mechanism for sharing this information is not prescribed by this specification.

client_id
Also called the Key in the IMS Security Framework. This is the public identifier for the communication exchange.
client_secret
Also called a Secret in the IMS Security Framework. This is the shared secret for the communication exchange.
OAuth 2.0 Access Token Service Endpoint
The endpoint from which the approved, requesting Consumer can obtain an access token.

4.3.2. CCG - Obtaining Tokens

Sequence diagram for obtaining an access token using the CCG flow

Sequence diagram for obtaining an access token using the CCG flow

To obtain an access token, the Consumer posts a "client_credentials" grant token request to the OAuth 2.0 Access Token Service Endpoint established during Registration. Requests for an access token MUST use an HTTP POST over HTTPS and TLS 1.2 or 1.3 protocol. The Consumer MUST use its client_id and client_secret with the HTTP Basic Authentication method (as described in [RFC2617]) for this request and MUST NOT put its key, secret and list of scopes into the request body.

The set of query parameters used to request an access token are:

Parameter Required Description
grant_type REQUIRED The value MUST be set to "client_credentials"
scope REQUIRED The scope of the access request.

An example request message is shown below in which 3 scopes (https://purl.imsglobal.org/spec/clr/v1p0/scope/readonly, https://purl.imsglobal.org/spec/clr/v1p0/scope/replace, and https://purl.imsglobal.org/spec/clr/v1p0/scope/delete) are requested:

POST /token?scope=https%3a%2f%2fpurl.imsglobal.org%2fspec%2fclr%2fv1p0%2fscope%2fdelete+https%3a%2f%2fpurl.imsglobal.org%2fspec%2fclr%2fv1p0%2fscope%2freadonly+https%3a%2f%2fpurl.imsglobal.org%2fspec%2fclr%2fv1p0%2fscope%2freplace HTTP/1.1
Authorization: Basic YWQyMmU5ZjYxNzlhNzljODo5Y2MxYzEzY2NmZTAxYWQ1
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials
        

If the authorization service successfully grants this request (see Section 5.1 in [RFC6749] for the detailed description), it responds with an HTTP 200 OK response containing the access token and its expiry lifetime (IMS recommends a default expiry lifetime of 3600 seconds, one hour, for access tokens) and confirms the set of scopes supported by this access token:

HTTP/1.1 200 OK
Cache-Control: no-store, no-cache, max-age=0
Pragma: no-cache
Content-Type: application/json; charset=UTF-8

{
    "access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImRmMTExNWEyZDZiMWRkOWY4YWFiNzllZjUxZWNhOTE4IiwidHlwIjoiSldUIn0.eyJuYmYiOjE1NjU2MzYzNTgsImV4cCI6MTU2NTYzOTk1OCwiaXNzIjoiaHR0cHM6Ly9jbHJhdXRoLmF6dXJld2Vic2l0ZXMubmV0IiwiYXVkIjpbImh0dHBzOi8vY2xyYXV0aC5henVyZXdlYnNpdGVzLm5ldC9yZXNvdXJjZXMiLCJEZWxldGVDbHIiLCJHZXRDbHJzIiwiUmVwbGFjZUNsciJdLCJjbGllbnRfaWQiOiJhZDIyZTlmNjE3OWE3OWM4IiwiY2xpZW50X3BvbGljeV91cmkiOiJodHRwczovL2NscmNvbnN1bWVyLmF6dXJld2Vic2l0ZXMubmV0OjQ0My9wcml2YWN5IiwiY2xpZW50X3Rvc191cmkiOiJodHRwczovL2NscmNvbnN1bWVyLmF6dXJld2Vic2l0ZXMubmV0OjQ0My90ZXJtcyIsImNsaWVudF9yZXNwb25zZV90eXBlcyI6IiIsImNsaWVudF90b2tlbl9lbmRwb2ludF9hdXRoX21ldGhvZCI6ImNsaWVudF9zZWNyZXRfYmFzaWMiLCJzY29wZSI6WyJodHRwczovL3B1cmwuaW1zZ2xvYmFsLm9yZy9zcGVjL2Nsci92MXAwL3Njb3BlL2RlbGV0ZSIsImh0dHBzOi8vcHVybC5pbXNnbG9iYWwub3JnL3NwZWMvY2xyL3YxcDAvc2NvcGUvcmVhZG9ubHkiLCJodHRwczovL3B1cmwuaW1zZ2xvYmFsLm9yZy9zcGVjL2Nsci92MXAwL3Njb3BlL3JlcGxhY2UiXX0.hH6pyev1qqDm_ss69OAflROL8deF9z9jc902-m6PmDYylRqkIK_uO3Iv2Od6cwDRfZiqOEKotbyRks3S-Dv3jJsJLg0Kc52i8S-6Wbosjg05KMaXr7Ocg2o1_J6xquSdt-tCopwcMcOty--9ePGPYvkyDaKcTdUYeH0HX214R21K485x5ebiHr3JzKq6WAzvElhkwWQcGTGvopAKywZknwxZc9Z2Izjg1Xk96eFKuw1J9ReIzU9ZwuVsLYHXPlyq9ZjleHWl87y3BApwoYv3PxFT_PP87E9BhlFzYpR__NP5Uf_QSrk1mZxD2yFHmwmG4ad3kEoVISEndrwSc4iawQ",
    "expires_in": 3600,
    "token_type": "Bearer",
    "scope": "https://purl.imsglobal.org/spec/clr/v1p0/scope/delete https://purl.imsglobal.org/spec/clr/v1p0/scope/readonly https://purl.imsglobal.org/spec/clr/v1p0/scope/replace"
}
        

The authorization server MAY decide not to issue an access token: this could be because the request scopes are invalid, the credentials from the client may be invalid, etc. In this case the authorization server MUST return an error message with an HTTP 400 Bad Request status code.

4.3.3. CCG - Authenticating with Tokens

Sequence diagram for authenticating with tokens when using CCG flow

Sequence diagram for authenticating with tokens when using CCG flow

The Consumer utilizes the access token to authenticate with the Provider using the HTTP Authorization request header field [RFC2617] with a Bearer Token [RFC6750]. For example, a "getClrs" request would look like this:

GET /ims/clr/v1p0/clrs HTTP/1.1
Accept: application/ld+json, application/json
Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImRmMTExNWEyZDZiMWRkOWY4YWFiNzllZjUxZWNhOTE4IiwidHlwIjoiSldUIn0.eyJuYmYiOjE1NjU2NDg3NzEsImV4cCI6MTU2NTY1MjM3MSwiaXNzIjoiaHR0cHM6Ly9jbHJhdXRoLmF6dXJld2Vic2l0ZXMubmV0IiwiYXVkIjpbImh0dHBzOi8vY2xyYXV0aC5henVyZXdlYnNpdGVzLm5ldC9yZXNvdXJjZXMiLCJEZWxldGVDbHIiLCJHZXRDbHJzIiwiUmVwbGFjZUNsciJdLCJjbGllbnRfaWQiOiJhZDIyZTlmNjE3OWE3OWM4IiwiY2xpZW50X3BvbGljeV91cmkiOiJodHRwczovL2NscmNvbnN1bWVyLmF6dXJld2Vic2l0ZXMubmV0OjQ0My9wcml2YWN5IiwiY2xpZW50X3Rvc191cmkiOiJodHRwczovL2NscmNvbnN1bWVyLmF6dXJld2Vic2l0ZXMubmV0OjQ0My90ZXJtcyIsImNsaWVudF9yZXNwb25zZV90eXBlcyI6IiIsImNsaWVudF90b2tlbl9lbmRwb2ludF9hdXRoX21ldGhvZCI6ImNsaWVudF9zZWNyZXRfYmFzaWMiLCJzY29wZSI6WyJodHRwczovL3B1cmwuaW1zZ2xvYmFsLm9yZy9zcGVjL2Nsci92MXAwL3Njb3BlL2RlbGV0ZSIsImh0dHBzOi8vcHVybC5pbXNnbG9iYWwub3JnL3NwZWMvY2xyL3YxcDAvc2NvcGUvcmVhZG9ubHkiLCJodHRwczovL3B1cmwuaW1zZ2xvYmFsLm9yZy9zcGVjL2Nsci92MXAwL3Njb3BlL3JlcGxhY2UiXX0.F9R10NxTDSluOIQwj0KP0Nb4Ix6Ye1rqOgLu2uot9IP-VDn4rDZsiLeIb6eiUJE2nU40pKgve6IKQAew7gqC9Tt3BfRjVo5QMI99xPoYxgHDLAZeRiJhD_2JYZQmda_KgoByHOPiXuuWM9wI9qw3YpUCeObn7DldxNcFH0NvQZwwSWJzVX-R1N_M7LxdlHB7fHPeggbUXos0G3FWdLF37a-v_5wEsv5zMf-Ts6gHGCU7p682SS1bkLXKT-HWO44IuaqWxzBIRGHA9wXLHCADP6_nWLJxmaZa5_E-FFHpiIvcV4g-CcWlz6KAxgNH-my6mm4IMfPKhUn6vgGCQsSalw
        

If the Provider accepts the request, it responds with the appropriate payload. For example the response to the request above may look like this (empty list of clrs for brevity):

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

{
    "type": "ClrSet",
    "clrs": []
}
        

4.4. OAuth 2.0 Authorization Code Grant Resource Access

Consumers and Providers that give individual users access to their own resources MUST use the OAuth 2.0 Authorization Code Grant (ACG) method

Consumers and Providers implementing this method of security MUST comply with Section 4.2, "Using OAuth 2.0 Authorization Code Grant" of the IMS Security Framework [SECURITY FRAMEWORK, 19a].

4.4.1. ACG - Registration

Sequence diagram for registration when using ACG flow

Sequence diagram for registration when using ACG flow

Consumers and Providers that implement the Authentication Code Grant (ACG) method of resource access MUST implement the dynamic Consumer registration process outlined here. There are two steps in this process:

  1. Request the Discovery Document from the Provider
  2. Register with the Authentication Server

The Consumer only needs to register a client_id with the Authentication Server once. Each User will use the same client_id when they request their own authorization code.

Request the Discovery Document

To start the registration process, the User supplies the Consumer with the Provider's domain authority. When presented with an unknown Provider the Consumer MUST request the Provider's CLR Discovery Document at the path /ims/clr/v1p0/discovery. The Discovery Document MUST be provided over HTTPS with TLS 1.2 or 1.3 protocol.

An example request for the Discovery Document looks like this:

GET https://provider.example.com/ims/clr/v1p0/discovery HTTP/1.1
Accept: application/json
        

And an example response from a Provider that supports all the secured endpoints and allows refresh tokens looks like this:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

{
    "name": "Example Provider",
    "image": "https://provider.example.com/logo.png",
    "scopesOffered": [
        "https://purl.imsglobal.org/spec/clr/v1p0/scope/delete",
        "https://purl.imsglobal.org/spec/clr/v1p0/scope/readonly",
        "https://purl.imsglobal.org/spec/clr/v1p0/scope/replace",
        "offline_access"
    ],
    "registrationUrl": "https://auth.example.com/register",
    "authorizationUrl": "https://auth.example.com/authorize",
    "tokenUrl": "https://auth.example.com/token",
    "termsOfServiceUrl": "https://provider.example.com/terms",
    "privacyPolicyUrl": "https://provider.example.com/privacy"
}    
        

Upon receiving a Discovery Document from a Provider, the requester SHOULD respect the Cache-Control and Expires headers if present in the response and configure local cache to match the directives it declares. If directives include one of no-cache, no-store, the requester SHOULD NOT cache the data for future interactions. If directives include max-age or if an Expires header is present, the requester SHOULD cache the Discovery Document data, if valid, up to the expiration indicated, either at the time indicated by the Expires header or max-age seconds from request time.

An Etag header MAY be offered with the Discovery Document response. If so, after a resource's declared expiration, a requester MAY include an If-None-Match header containing the value of the Etag to check if the resource is still fresh. If so the server may return a 304 Not Modified response status code, and a new Expires or Cache-Control header MAY be included, which the requester SHOULD use to update the cache expiration.

Register with Authorization Server

With the OAuth 2.0 Registration URL in hand (from the registrationUrl property of the Discovery Document), the Consumer SHOULD post a registration request to the authorization server. The registration request MUST comply with OAuth 2.0 Dynamic Client Registration Protocol [RFC7591]. The request MUST be sent using HTTPS with TLS 1.2 or 1.3 protocol.

The properties of the JSON body MUST be implemented as described in the following table. All URLs MUST use HTTPS (e.g. https://example.com/logo.png) and all URLs MUST have the same hostname. All required properties MUST be present in the registration request in order for it to be accepted by the authorization server.

Name Required Description
client_name Yes The human-readable name of the Consumer.
client_uri Yes A page that which describes the Consumer.
logo_uri Yes The logo of the Consumer.
tos_uri Yes The Terms of Service of the Consumer.
policy_uri Yes The Privacy Policy of the Consumer.
software_id Yes A unique idenfitier assigned by the Consumer developer. As described in [RFC7591], it SHOULD remain the same for all instances of the Consumer software.
software_version Yes A version identifier string for the Consumer software. The value SHOULD change on any update to the Consumer software.
redirect_uris Yes Array of redirection URI strings for use in the OAuth 2.0 flow.
token_endpoint_auth_method No String indicator of the requested authentication method for the token endpoint. In this specification only "client_secret_basic" is allowed:
  • "client_secret_basic": The Consumer uses the HTTP Basic authentication method as defined in OAuth 2.0.
If omitted, the default is "client_secret_basic".
grant_types No Array of OAuth 2.0 grant type strings. In this specification only "authorization_code" and refresh_token" are allowed:
  • "authorization_code": The authorization code grant type defined in OAuth 2.0.
  • "refresh_token": The refresh token grant type defined in OAuth 2.0.
If omitted, the default behavior is that the client will use only the "authorization_code" grant type.
response_types No Array of OAuth 2.0 response type strings. In this specification only "code" is allowed:
  • "code": The authorization code response type defined in OAuth 2.0.
If omitted, the default is that the client will use only the "code" response type.
scope No In the registration request, this is a string containing a space-separated list of scope values that this Consumer may include when requesting access tokens. If omitted, the authorization server MAY register a Consumer with a default set of scopes. In the registration response, this is a list of scopes the authorization server supports.

The list of scopes that can be requested are shown in this table:

Scope Description
https://purl.imsglobal.org/spec/clr/v1p0/scope/delete Permission to delete CLRs for the User on the Provider platform.
https://purl.imsglobal.org/spec/clr/v1p0/scope/readonly Permission to read CLRs for the User on the Provider platform.
https://purl.imsglobal.org/spec/clr/v1p0/scope/replace Permission to create or update CLRs for the User on the Provider platform.
offline_access Permission to issue a refresh_token along with the access_token.

An example registration request looks like this:

POST https://clrauth.azurewebsites.net/connect/register HTTP/1.1
Accept: application/json
Content-Type: application/json; charset=utf-8

{
    "client_name": "Example Consumer",
    "client_uri": "https://consumer.example.com/",
    "logo_uri": "https://consumer.example.com/logo.png",
    "tos_uri": "https://consumer.example.com/terms",
    "policy_uri": "https://consumer.example.com/privacy",
    "software_id": "c88b6ed8-269e-448e-99be-7e2ff47167d1",
    "software_version": "v4.0.30319",
    "redirect_uris": [
        "https://consumer.example.com/Authorize"
    ],
    "token_endpoint_auth_method": "client_secret_basic",
    "grant_types": [
        "authorization_code",
        "refresh_token"
    ],
    "response_types": [
        "code"
    ],
    "scope": "https://purl.imsglobal.org/spec/clr/v1p0/scope/delete https://purl.imsglobal.org/spec/clr/v1p0/scope/readonly https://purl.imsglobal.org/spec/clr/v1p0/scope/replace offline_access"
}
        

If the authorization server accepts the registration request, it will store the information provided in the request and respond HTTP 201 Created with a registration response that includes a set of client credentials for the Consumer to use when requesting access tokens. All the information provided by the Consumer MUST be returned to the Consumer, including modifications to the properties as the authorization server deems necessary. An example response looks like this:

HTTP/1.1 201 Created
Content-Type: application/json; charset=utf-8

{
    "client_id": "4ad36680810420ed",
    "client_secret": "af7aa0d679778e12",
    "client_id_issued_at": 1565715850,
    "client_secret_expires_at": 1597338250,
    "client_name": "Example Consumer",
    "client_uri": "https://consumer.example.com/",
    "logo_uri": "https://consumer.example.com/logo.png",
    "tos_uri": "https://consumer.example.com/terms",
    "policy_uri": "https://consumer.example.com/privacy",
    "software_id": "c88b6ed8-269e-448e-99be-7e2ff47167d1",
    "software_version": "v4.0.30319",
    "redirect_uris": [
        "https://consumer.example.com/Authorize"
    ],
    "token_endpoint_auth_method": "client_secret_basic",
    "grant_types": [
        "authorization_code",
        "refresh_token"
    ],
    "response_types": [
        "code"
    ],
    "scope": "https://purl.imsglobal.org/spec/clr/v1p0/scope/delete https://purl.imsglobal.org/spec/clr/v1p0/scope/readonly https://purl.imsglobal.org/spec/clr/v1p0/scope/replace offline_access"
}    
        

The following table describes the properties present in the client registration response that were not included in the request. These are all REQUIRED properties.

Name Required Description
client_id Yes An OAuth 2.0 client identifier string. The value SHOULD NOT be currently valid for any other registered client.
client_secret Yes An OAuth 2.0 client secret string.
client_id_issued_at Yes The time at which the client_id was issued.
client_secret_expires_at Yes The time at which the client_secret will expire. MAY be 0 for no expiration.

4.4.2. ACG - Obtaining Tokens

Sequence diagram for obtaining access tokens when using the ACG flow

Sequence diagram for obtaining access tokens when using the ACG flow

After the Consumer is registered with the Authorization Server as described in Registration, the Consumer then MAY initiate an authorization request as described in Section 4.2 of the IMS Security Framework [SECURITY FRAMEWORK, 19a] by redirecting the user to the authorizationUrl as declared in the Provider's Discovery Document.

All required properties must be included in the authorization request:

Name Required Description
response_type Yes Value MUST be set to "code".
client_id Yes The Consumer identifier. MUST be the client_id provided in the Registration response.
redirect_uri Yes The Consumer's redirection endpoint. MUST match one of the redirect_uris in the Registration request. Although this is optional in the IMS Security Framework [SECURITY FRAMEWORK, 19a], it is REQUIRED by this specification.
scope Yes The scope of the authorization request. This is a space delimited list of scopes.
Scope Description
https://purl.imsglobal.org/spec/clr/v1p0/scope/delete Permission to delete CLRs for the User on the Provider platform.
https://purl.imsglobal.org/spec/clr/v1p0/scope/readonly Permission to read CLRs for the User on the Provider platform.
https://purl.imsglobal.org/spec/clr/v1p0/scope/replace Permission to create or update CLRs for the User on the Provider platform.
offline_access Permission to issue a refresh_token along with the access_token.
state Yes An opaque value used by the Consumer to maintain state between the request and callback.
code_challenge Yes This is BASE64URL-ENCODE(SHA256(ASCII(code_verifier))).
code_challenge_method Yes This MUST have a value of "S256" to indicate the SHA256 code verifier transformation method is used.

The request MUST be made by redirecting the browser to the OAuth 2.0 Authorization endpoint. The request MUST use HTTPS with TLS 1.2 or 1.3 protocol. An example authorization request looks like this (line breaks are for display purposes only):

HTTP/1.1 302 Found
Location: https://auth.example.com/authorize?
    client_id=4ad36680810420ed
    &response_type=code
    &scope=https%3A%2F%2Fpurl.imsglobal.org%2Fspec%2Fclr%2Fv1p0%2Fscope%2Fdelete%20https%3A%2F%2Fpurl.imsglobal.org%2Fspec%2Fclr%2Fv1p0%2Fscope%2Freadonly%20https%3A%2F%2Fpurl.imsglobal.org%2Fspec%2Fclr%2Fv1p0%2Fscope%2Freplace%20offline_access
    &redirect_uri=https%3A%2F%2Fconsumer.example.com%2FAuthorize
    &state=26357667-94df-4a14-bcb1-f55449ddd98d
    &code_challenge=XeDw66i9FLjn7XaecT_xaFyUWWfUub02Kw118n-jbEs
    &code_challenge_method=S256    
        

If the Authorization Server does not recognize the Consumers's redirection endpoint from a prior connection with this Consumer, the Authorization Server SHOULD throw an error specifying that the redirection endpoint is not applicable to any registered Consumer and registration should be made before proceeding. If the redirect_uri matches a known client_id, the Authorization Server SHOULD present the User with the option to authorize the request. If the User authorizes the Consumer to access their resources with the requested scopes, the Authorization Server MUST redirect the browser back to the redirect_uri with the code, scope, and state query string parameters. An example response looks like this:

HTTP/1.1 302 Found
Location https://consumer.example.com/Authorize?
    code=dcf95d196ae04d60aad7e19d18b9af755a7b593b680055158b8ad9c2975f0d86
    &scope=https%3A%2F%2Fpurl.imsglobal.org%2Fspec%2Fclr%2Fv1p0%2Fscope%2Fdelete%20https%3A%2F%2Fpurl.imsglobal.org%2Fspec%2Fclr%2Fv1p0%2Fscope%2Freadonly%20https%3A%2F%2Fpurl.imsglobal.org%2Fspec%2Fclr%2Fv1p0%2Fscope%2Freplace%20offline_access
    &state=26357667-94df-4a14-bcb1-f55449ddd98d
        

With the supplied code, the Consumer SHOULD attempt to exchange the code for an access_token. The Consumer makes an authorization grant POST request to the tokenUrl as declared in the Provider's Discovery Document. The HTTP POST request MUST include a Basic authorization header with the client_id and client_secret provided in the registration response. The body of the token request MUST include the following form fields:

Name Required Description
grant_type Yes Value MUST be set to "authorization_code".
code Yes The authorization code received from the authorization server.
redirect_uri Yes The Consumer's redirection endpoint.
scope Yes The scope of the access request.
code_verifier Yes The PKCE code verifier.

An example token request look like this (line breaks are for display purposes only):

POST https://auth.example.com/token HTTP/1.1
Authorization: Basic NDE2ZjI1YjhjMWQ5OThlODoxNWQ5MDA4NTk2NDdkZDlm
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
    &code=7c7a73263ee14b2b48073d0615f286ec74f6636689046cb8dbede0b5e87a1338
    &redirect_uri=https%3A%2F%2Fconsumer.example.com%2FAuthorize
    &scope=https%3A%2F%2Fpurl.imsglobal.org%2Fspec%2Fclr%2Fv1p0%2Fscope%2Fdelete+https%3A%2F%2Fpurl.imsglobal.org%2Fspec%2Fclr%2Fv1p0%2Fscope%2Freadonly+https%3A%2F%2Fpurl.imsglobal.org%2Fspec%2Fclr%2Fv1p0%2Fscope%2Freplace+offline_access
    &code_verifier=mYUQfKNgI1lSbY8EqtvNHLPzu0x%2FcVKO3fpWnX4VE5I%3D
        

If the Authorization Server finds the request to be a valid, it generates and returns an access token and optionally a refresh token.

4.4.3. ACG - Authenticating with Tokens

Sequence diagram for authenticating with tokens when using the ACG flow

Sequence diagram for authenticating with tokens when using the ACG flow

After obtaining an access_token and optionally a refresh_token using the method above, a Consumer MAY request resources controlled by the User from the Provider endpoints using the access_token in the HTTP Authorization header [RFC2617] with a Bearer Token [RFC6750]. For example, a "getClrs" would look like this:

GET https://provider.example.com/ims/clr/v1p0/clrs HTTP/1.1
Accept: application/ld+json, application/json
Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6ImRmMTExNWEyZDZiMWRkOWY4YWFiNzllZjUxZWNhOTE4IiwidHlwIjoiSldUIn0.eyJuYmYiOjE1NjU3MzIzNzUsImV4cCI6MTU2NTczNTk3NSwiaXNzIjoiaHR0cHM6Ly9jbHJhdXRoLmF6dXJld2Vic2l0ZXMubmV0IiwiYXVkIjpbImh0dHBzOi8vY2xyYXV0aC5henVyZXdlYnNpdGVzLm5ldC9yZXNvdXJjZXMiLCJEZWxldGVDbHIiLCJHZXRDbHJzIiwiUmVwbGFjZUNsciJdLCJjbGllbnRfaWQiOiI0MTZmMjViOGMxZDk5OGU4Iiwic3ViIjoiODE4NzI3IiwiYXV0aF90aW1lIjoxNTY1NzIwMjAyLCJpZHAiOiJsb2NhbCIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL2VtYWlsYWRkcmVzcyI6IkFsaWNlU21pdGhAZW1haWwuY29tIiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZSI6IkFsaWNlIFNtaXRoIiwic2NvcGUiOlsiaHR0cHM6Ly9wdXJsLmltc2dsb2JhbC5vcmcvc3BlYy9jbHIvdjFwMC9zY29wZS9kZWxldGUiLCJodHRwczovL3B1cmwuaW1zZ2xvYmFsLm9yZy9zcGVjL2Nsci92MXAwL3Njb3BlL3JlYWRvbmx5IiwiaHR0cHM6Ly9wdXJsLmltc2dsb2JhbC5vcmcvc3BlYy9jbHIvdjFwMC9zY29wZS9yZXBsYWNlIiwib2ZmbGluZV9hY2Nlc3MiXSwiYW1yIjpbInB3ZCJdfQ.Bbe1uZVO-2PU541mRyAda8kLk6iU8QA9GSotaEdRZYZmxDxMIa1hiLVqCzB998R4mb7gWayES5yKu6Tn0y0-bcAMm3lBZuIUXkdHmCB7hdczHmYhQT-mcQ6y9v7SAvsmy5pAL4o1CoQEJRFj9T_kWbzqk-mBPmfZRsV-eA6NcOwZVO8N_9GtXkLgLgXdWQUBHOwX7_5IFdLvieTFyMW9NDRf4QHV1etIDs3iu1_Izix7Hi1YE4BmOoSsll07cmAxtilf061pTKLRV6zobrQQ2GO4vdi2nxUrUzcvYd7NV8xSEf_xPpsL_yBqvA2LRf1mt3JZKIjC3arIXlWaJUflJQ
        

If the Provider accepts the request, it will respond with the appropriate payload. For example, the response to the request above may look like this ( clrs is an empty list for brevity):

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

{
    "type": "ClrSet",
    "clrs": []
}
        

If the access_token is expired or about to expire, and the Consumer received a refresh_token, the Consumer can use OAuth 2.0 Token Refresh [RFC6749] to get a new access_token and refresh_token without repeating the process described in Obtaining Tokens.

toc | top

5. JSON Payloads

This Section is NOT NORMATIVE.

5.1 "deleteClr" Request Payload

There is no payload for this request.

5.2 "deleteClr" Response Payloads

5.2.1 Response Payloads for the HTTP Codes (204)

There is no payload for these responses i.e. only a HTTP response header is returned.

5.2.2 Response Payloads for the HTTP Codes (400, 401, 403, 404, default)

A tabular description of the response payload is shown in the Table below.

Table 5.2.2 - Tabular representation of the JSON payload for "400, 401, 403, 404, default" response messages for a "deleteClr" operation.
Property Name Multiplicity JSON Data-type Description
    imsx_codeMajor [1..1] Enumeration The code major value (from the corresponding enumerated vocabulary).
    imsx_severity [1..1] Enumeration The severity value (from the corresponding enumerated vocabulary).
    imsx_description [0..1] String A human readable description supplied by the entity creating the status code information.
    imsx_codeMinor [0..1] Object The set of reported code minor status codes.
            imsx_codeMinorField [1..*] Array [ Object ] Each reported code minor status code.
                    imsx_codeMinorFieldName [1..1] String Tiis should contain the identity of the system that has produced the code minor status code report.
                    imsx_codeMinorFieldValue [1..1] Enumeration The code minor status code (this is a value from the corresponding enumerated vocabulary).

An example of the response JSON payload is shown in the code block below. The JSON Schema file that can be used to validate this payload is given in Appendix ** ERROR **.

Code 5.2.2 - JSON payload example for "400, 401, 403, 404, default" response messages for a "deleteClr" operation.
    {
        "imsx_codeMajor" : "success"|"failure"|"processing"|"unsupported",
        "imsx_severity" : "status"|"warning"|"error",
        "imsx_description" : "..String..",
        "imsx_codeMinor" : {
            "imsx_codeMinorField" : [
                {
                    "imsx_codeMinorFieldName" : "..NormalizedString..",
                    "imsx_codeMinorFieldValue" : "forbidden"|"fullsuccess"|"internal_server_error"|"invalid_data"|"invalid_query_parameter"|"server_busy"|"unauthorizedrequest"
                },
                {...},
                {...}
            ]
        }
    }
                        

5.3 "getAssertion" Request Payload

There is no payload for this request.

5.4 "getAssertion" Response Payloads

5.4.1 Response Payloads for the HTTP Codes (200)

A tabular description of the response payload is shown in the Table below.

Table 5.4.1 - Tabular representation of the JSON payload for "200" response messages for a "getAssertion" operation.
Property Name Multiplicity JSON Data-type Description
    id [1..1] String Unique IRI for the Assertion.
    type [1..1] String The JSON-LD type of this object. Normally 'Assertion'.
    achievement [0..1] Object The achievement being asserted.
            id [1..1] String Unique IRI for the Achievement.
            type [1..1] Enumeration The JSON-LD type of this object. Normally 'Achievement'.
            alignments [0..*] Array [ Object ] Alignment objects describe an alignment between this achievement and a node in an educational framework.
                    id [0..1] String Unique IRI for the object.
                    type [0..1] String The JSON-LD type of this entity. Normally 'Alignment'.
                    educationalFramework [0..1] String The framework to which the resource being described is aligned.
                    targetCode [0..1] String If applicable, a locally unique string identifier that identifies the alignment target within its framework.
                    targetDescription [0..1] String Short description of the alignment target.
                    targetName [1..1] String The name of a node in an established educational framework.
                    targetUrl [1..1] String (Format: uri) The URL of a node in an established educational framework.
            creditsAvailable [0..1] Float Credit hours associated with this entity, or credit hours possible. For example '3.0'.
            description [0..1] String A short description of the achievement. May be the same as name if no description is available.
            endorsements [0..*] Array [ Object ] Allows endorsers to make specific claims about the Achievement.
                    id [0..1] String Unique IRI for the object.
                    type [1..1] Enumeration The type of the endorsement object. Use the type to recast the object to the appropriate sub-class.
                    extensions [0..*] Set of Proprietary Properties The endorsement objects can be extended with additional properties.
            humanCode [0..1] String The code, generally human readable, associated with an achievement.
            name [1..1] String The name of the achievement.
            fieldOfStudy [0..1] String Category, subject, area of study, discipline, or general branch of knowledge. Examples include Business, Education, Psychology, and Technology.
            image [0..1] String IRI of an image representing the achievement. May be a Data URI or the URL where the image may be found.
            issuer [1..1] Object A profile describing the individual or organization that issues assertions of this achievement.
                    id [1..1] String Unique IRI for the Profile.
                    type [0..1] String The JSON-LD type of this object. Normally 'Profile'.
                    address [0..1] Object An address for the individual or organization.
                            id [0..1] String Unique IRI for the Address.
                            type [0..1] String The JSON-LD type of this object. Normally 'Address'.
                            addressCountry [0..1] String The country. For example, USA. You can also provide the two-letter ISO 3166-1 alpha-2 country code.
                            addressLocality [0..1] String The locality. For example, Mountain View.
                            addressRegion [0..1] String The region. For example, CA.
                            postalCode [0..1] String The postal code. For example, 94043.
                            postOfficeBoxNumber [0..1] String The post office box number for PO box addresses.
                            streetAddress [0..1] String The street address. For example, 1600 Amphitheatre Pkwy.
                    description [0..1] String A short description of the individual or organization.
                    email [0..1] String A contact email address for the individual or organization.
                    endorsements [0..*] Array [ Object ] Allows endorsers to make specific claims about the individual or organization represented by this profile.
                            id [0..1] String Unique IRI for the object.
                            type [1..1] Enumeration The type of the endorsement object. Use the type to recast the object to the appropriate sub-class.
                            extensions [0..*] Set of Proprietary Properties The endorsement objects can be extended with additional properties.
                    image [0..1] String IRI of an image representing the individual or organization. May be a DATA URI or the URL where the image may be found.
                    name [1..1] String The name of the individual or organization.
                    publicKey [0..1] Object The CrytographicKey object used to verify signed assertions and signed endorsements.
                            id [1..1] String The URI of the CryptographicKey document. Used during signed verification.
                            type [0..1] String The JSON-LD type of this object. Normally 'CryptographicKey'.
                            owner [0..1] String The identifier for the Profile that owns this key.
                            publicKeyPem [0..1] String The PEM key encoding is a widely-used method to express public keys, compatible with almost every Secure Sockets Layer library implementation.
                    revocationList [0..1] Object The list of revoked assertions and endorsements issued by the individual or organization represented by this profile.
                            id [1..1] String Unique IRI for the RevocationList.
                            type [0..1] String The JSON-LD type of this entity. Normally 'RevocationList'.
                            issuer [0..1] String The id of the Issuer.
                            revokedAssertions [0..*] Array [ String ] The id of an assertion that has been revoked.
                    sourcedId [0..1] String The individual's unique 'sourcedId' value, which is used for providing interoperability with IMS Learning Information Services (LIS).
                    studentId [0..1] String An institution's student identifier for the person. This is frequently issued through a Student Information System.
                    telephone [0..1] String Primary phone number for the individual or organization.
                    url [0..1] String (Format: uri) Web resource that uniquely represents or belongs to the individual. This may be a resource about the individual, hosting provided by the instution to the individual, or an web resource independently controlled by the individual.
                    verification [0..1] Object Instructions for how to verify assertions and endorsements issued by the individual or organization represented by this profile.
                            id [0..1] String Unique IRI for the Verification.
                            type [1..1] Enumeration The JSON-LD type of this object. The strongly typed value indicates the verification method.
                            allowedOrigins [0..*] Array [ String ] The host registered name subcomponent of an allowed origin. Any given id URI will be considered valid.
                            creator [0..1] String (Format: uri) The URI of the CryptographicKey with the public key used to verify the signed Assertion. If not present, verifiers will check publicKey property of the referenced issuer Profile. If present, the URI must match the CryptographicKey id in the issuer Profile as well.
                            startsWith [0..*] Array [ String ] The URI fragment that the verification property must start with. Valid Assertions must have an id within this scope. Multiple values allowed, and Assertions will be considered valid if their id starts with one of these values.
                            verificationProperty [0..1] String The property to be used for verification. Only 'id' is supported. Verifiers will consider 'id' the default value if verificationProperty is omitted or if an issuer Profile has no explicit verification instructions, so it may be safely omitted.
                    extensions [0..*] Set of Proprietary Properties The Profile object can be extended with additional properties.
            level [0..1] String Text that describes the level of achievement apart from how the achievement was performed or demonstrated. Examples would include 'Level 1', 'Level 2', 'Level 3', or 'Bachelors', 'Masters', 'Doctoral'.
            requirement [0..1] Object Criteria object describing how to earn the achievement.
                    id [1..1] String The URI of a webpage that describes in a human-readable format the criteria for the Achievement.
                    type [0..1] String The JSON-LD type of this object. Normally 'Criteria'.
                    narrative [0..1] String A narrative of what is needed to earn the achievement. Markdown allowed.
                    extensions [0..*] Set of Proprietary Properties Criteria can be extended with additional properties.
            resultDescriptions [0..*] Array [ Object ] The types of result that may be asserted with this achievement.
                    id [0..1] String Unique IRI for the ResultDescription.
                    type [1..1] Enumeration The JSON-LD type of this object. The strongly typed value identifies the type of result.
                    name [0..1] String The name of the result.
                    resultMin [0..1] String The minimum possible result that may be asserted.
                    resultMax [0..1] String The maximum possible result that may be asserted.
            specialization [0..1] String Name given to the focus, concentration, or specific area of study defined in the achievement. Examples include Entrepreneurship, Technical Communication, and Finance.
            tags [0..*] Array [ String ] Tags that describe the type of achievement.
            typeLabel [1..1] String The type of achievement matching one from an IMS recommended taxonomy of achievement types, or any text string.
            extensions [0..*] Set of Proprietary Properties The Achievement object can be extended with additional properties.
    creditsEarned [0..1] Float The number of credits earned, generally in semester or quarter credit hours. This field correlates with the Achievement creditsAvailable field.
    endDate [0..1] String (Format: date-time) If present, the assertion is not valid after this date.
    endorsements [0..*] Array [ Object ] Allows endorsers to make specific claims about the assertion.
            id [0..1] String Unique IRI for the object.
            type [1..1] Enumeration The type of the endorsement object. Use the type to recast the object to the appropriate sub-class.
            extensions [0..*] Set of Proprietary Properties The endorsement objects can be extended with additional properties.
    evidence [0..*] Array [ Object ] Evidence describing the work that the recipient did to earn the achievement. This can be a webpage that links out to other pages if linking directly to the work is infeasible.
            id [0..1] String The URI of a webpage presenting evidence of achievement.
            type [0..1] String The JSON-LD type of this entity. Normally 'Evidence'.
            artifacts [0..*] Array [ Object ] Artifacts that are part of the evidence.
                    type [0..1] String The JSON-LD type of the object. Normally 'Artifact'.
                    description [0..1] String A description of the artifact.
                    name [1..1] String The name of the artifact.
                    url [0..1] String (Format: uri) IRI of the artifact. May be a Data URI or the URL where the artifact may be found.
            audience [0..1] String A description of the intended audience for a piece of evidence.
            description [0..1] String A longer description of the evidence.
            genre [0..1] String A string that describes the type of evidence. For example, Poetry, Prose, Film.
            name [1..1] String The name of the evidence.
            narrative [0..1] String A narrative that describes the evidence and process of achievement that led to an assertion. Markdown allowed.
    image [0..1] String IRI of an image representing the assertion. May be a Data URI or the URL where the image may be found. If the object is an Open Badges 2.0 assertion, the image is a 'Baked Image' as defined by the Open Badges 2.0 specification.
    issuedOn [0..1] String (Format: date-time) Timestamp of when the achievement was awarded. Required unless the assertion is revoked.
    licenseNumber [0..1] String The license number that was issued with this assertion.
    narrative [0..1] String A narrative that describes the connection between multiple pieces of evidence. Likely only present if evidence is a multi-value array. Markdown allowed.
    recipient [0..1] Object The recipient of the achievement. Required unless the assertion is revoked.
            id [0..1] String Unique IRI for the Identity.
            type [1..1] String The JSON-LD type of this entity. The type should identify the property by which the recipient of an Assertion is identified. This value should be an IRI mapped in the present context. For example, email maps to 'clr:email' and indicates that the identity of the IdentityObject will represent a value of a Profile’s email property. Currently the only supported value for many platforms that implement CLR is email, but other properties are available.
            identity [1..1] String Either the hash of the identity or the plaintext value. If it's possible that the plaintext transmission and storage of the identity value would leak personally identifiable information where there is an expectation of privacy, it is strongly recommended that an IdentityHash be used.
            hashed [1..1] Boolean Whether or not the identity value is hashed.
            salt [0..1] String If the recipient is hashed, this should contain the string used to salt the hash. If this value is not provided, it should be assumed that the hash was not salted.
    results [0..*] Array [ Object ] The results being asserted.
            id [0..1] String Unique IRI for the object.
            type [1..1] Enumeration The JSON-LD type of this object. The strongly typed value identifies the type of result.
            name [0..1] String The name of the result.
            value [1..1] String A grade or value representing the result of the performance, or demonstration, of the achievement. For example, 'A' if the recipient received a grade of A in the class.
    revocationReason [0..1] String Optional published reason for revocation, if revoked.
    revoked [0..1] Boolean Defaults to false if Assertion is not referenced from a revokedAssertions list and may be omitted. See RevocationList. If revoked is true, only revoked and id are required properties, and many issuers strip a hosted Assertion down to only those properties when revoked.
    role [0..1] String Role, position, or title of the learner when demonstrating or performing the achievement or evidence of learning being asserted. Examples include 'Student President', 'Intern', 'Captain', etc.
    startDate [0..1] String (Format: date-time) If present, the assertion is not valid before this date.
    term [0..1] String The academic term in which this assertion was achieved.
    verification [0..1] Object Instructions for third parties to verify this assertion. (Alias “verify” may be used in context.)
            id [0..1] String Unique IRI for the Verification.
            type [1..1] Enumeration The JSON-LD type of this object. The strongly typed value indicates the verification method.
            allowedOrigins [0..*] Array [ String ] The host registered name subcomponent of an allowed origin. Any given id URI will be considered valid.
            creator [0..1] String (Format: uri) The URI of the CryptographicKey with the public key used to verify the signed Assertion. If not present, verifiers will check publicKey property of the referenced issuer Profile. If present, the URI must match the CryptographicKey id in the issuer Profile as well.
            startsWith [0..*] Array [ String ] The URI fragment that the verification property must start with. Valid Assertions must have an id within this scope. Multiple values allowed, and Assertions will be considered valid if their id starts with one of these values.
            verificationProperty [0..1] String The property to be used for verification. Only 'id' is supported. Verifiers will consider 'id' the default value if verificationProperty is omitted or if an issuer Profile has no explicit verification instructions, so it may be safely omitted.
    extensions [0..*] Set of Proprietary Properties The assertion object can be extended with additional properties.

An example of the response JSON payload is shown in the code block below. The JSON Schema file that can be used to validate this payload is given in Appendix ** ERROR **.

Code 5.4.1 - JSON payload example for "200" response messages for a "getAssertion" operation.
    {
        "id" : "..NormalizedString..",
        "type" : "..NormalizedString..",
        "achievement" : {
            "id" : "..NormalizedString..",
            "type" : "Achievement"|"BadgeClass"|"CASECompetencyStatement"|"CTDLCredential"|"IMSAssessmentResult"|"PESCTranscript",
            "alignments" : [
                {
                    "id" : "..NormalizedString..",
                    "type" : "..NormalizedString..",
                    "educationalFramework" : "..String..",
                    "targetCode" : "..String..",
                    "targetDescription" : "..String..",
                    "targetName" : "..String..",
                    "targetUrl" : "..URI.."
                },
                {...},
                {...}
            ],
            "creditsAvailable" : ..Number(Float)..,
            "description" : "..String..",
            "endorsements" : [
                {
                    "id" : "..NormalizedString..",
                    "type" : "Endorsement"|"SignedEndorsement",
                    "..permitted extension point.." : "..user defined value.."
                },
                {...},
                {...}
            ],
            "humanCode" : "..String..",
            "name" : "..String..",
            "fieldOfStudy" : "..String..",
            "image" : "..NormalizedString..",
            "issuer" : {
                "id" : "..NormalizedString..",
                "type" : "..NormalizedString..",
                "address" : {
                    "id" : "..NormalizedString..",
                    "type" : "..NormalizedString..",
                    "addressCountry" : "..String..",
                    "addressLocality" : "..String..",
                    "addressRegion" : "..String..",
                    "postalCode" : "..String..",
                    "postOfficeBoxNumber" : "..String..",
                    "streetAddress" : "..String.."
                },
                "description" : "..String..",
                "email" : "..String..",
                "endorsements" : [
                    {
                        "id" : "..NormalizedString..",
                        "type" : "Endorsement"|"SignedEndorsement",
                        "..permitted extension point.." : "..user defined value.."
                    },
                    {...},
                    {...}
                ],
                "image" : "..NormalizedString..",
                "name" : "..String..",
                "publicKey" : {
                    "id" : "..NormalizedString..",
                    "type" : "..NormalizedString..",
                    "owner" : "..NormalizedString..",
                    "publicKeyPem" : "..String.."
                },
                "revocationList" : {
                    "id" : "..NormalizedString..",
                    "type" : "..NormalizedString..",
                    "issuer" : "..NormalizedString..",
                    "revokedAssertions" : [ "..NormalizedString..", ..., "..NormalizedString.." ]
                },
                "sourcedId" : "..String..",
                "studentId" : "..String..",
                "telephone" : "..String..",
                "url" : "..URI..",
                "verification" : {
                    "id" : "..NormalizedString..",
                    "type" : "Hosted"|"HostedAssertion"|"Signed"|"SignedAssertion"|"Verification",
                    "allowedOrigins" : [ "..String..", ..., "..String.." ],
                    "creator" : "..URI..",
                    "startsWith" : [ "..String..", ..., "..String.." ],
                    "verificationProperty" : "..String.."
                },
                "..permitted extension point.." : "..user defined value.."
            },
            "level" : "..String..",
            "requirement" : {
                "id" : "..NormalizedString..",
                "type" : "..NormalizedString..",
                "narrative" : "..String..",
                "..permitted extension point.." : "..user defined value.."
            },
            "resultDescriptions" : [
                {
                    "id" : "..NormalizedString..",
                    "type" : "GradePointAverage"|"LetterGrade"|"Percent"|"PerformanceLevel"|"PredictedScore"|"Result"|"RawScore"|"RubricScore"|"ScaledScore",
                    "name" : "..String..",
                    "resultMin" : "..String..",
                    "resultMax" : "..String.."
                },
                {...},
                {...}
            ],
            "specialization" : "..String..",
            "tags" : [ "..String..", ..., "..String.." ],
            "typeLabel" : "..String..",
            "..permitted extension point.." : "..user defined value.."
        },
        "creditsEarned" : ..Number(Float)..,
        "endDate" : "..Date/Time..",
        "endorsements" : [
            {
                "id" : "..NormalizedString..",
                "type" : "Endorsement"|"SignedEndorsement",
                "..permitted extension point.." : "..user defined value.."
            },
            {...},
            {...}
        ],
        "evidence" : [
            {
                "id" : "..NormalizedString..",
                "type" : "..NormalizedString..",
                "artifacts" : [
                    {
                        "type" : "..NormalizedString..",
                        "description" : "..String..",
                        "name" : "..String..",
                        "url" : "..URI.."
                    },
                    {...},
                    {...}
                ],
                "audience" : "..String..",
                "description" : "..String..",
                "genre" : "..String..",
                "name" : "..String..",
                "narrative" : "..String.."
            },
            {...},
            {...}
        ],
        "image" : "..NormalizedString..",
        "issuedOn" : "..Date/Time..",
        "licenseNumber" : "..String..",
        "narrative" : "..String..",
        "recipient" : {
            "id" : "..NormalizedString..",
            "type" : "..NormalizedString..",
            "identity" : "..String..",
            "hashed" : "..Boolean..",
            "salt" : "..String.."
        },
        "results" : [
            {
                "id" : "..NormalizedString..",
                "type" : "GradePointAverage"|"LetterGrade"|"Percent"|"PerformanceLevel"|"PredictedScore"|"Result"|"RawScore"|"RubricScore"|"ScaledScore",
                "name" : "..String..",
                "value" : "..String.."
            },
            {...},
            {...}
        ],
        "revocationReason" : "..String..",
        "revoked" : "..Boolean..",
        "role" : "..String..",
        "startDate" : "..Date/Time..",
        "term" : "..String..",
        "verification" : {
            "id" : "..NormalizedString..",
            "type" : "Hosted"|"HostedAssertion"|"Signed"|"SignedAssertion"|"Verification",
            "allowedOrigins" : [ "..String..", ..., "..String.." ],
            "creator" : "..URI..",
            "startsWith" : [ "..String..", ..., "..String.." ],
            "verificationProperty" : "..String.."
        },
        "..permitted extension point.." : "..user defined value.."
    }
                        

5.4.2 Response Payloads for the HTTP Codes (404, default)

There is no payload for these responses i.e. only a HTTP response header is returned.

5.5 "getClrs" Request Payload

There is no payload for this request.

5.6 "getClrs" Response Payloads

5.6.1 Response Payloads for the HTTP Codes (200)

A tabular description of the response payload is shown in the Table below.

Table 5.6.1 - Tabular representation of the JSON payload for "200" response messages for a "getClrs" operation.
Property Name Multiplicity JSON Data-type Description
    id [0..1] String Unique IRI for the ClrSet.
    type [0..1] String The JSON-LD type of this object. Normally 'CLRSet'.
    clrs [0..*] Array [ Object ] An unordered collection of comprehensive learner records.
            id [1..1] String Unique IRI for the CLR.
            type [0..1] String The JSON-LD type of this object. Normally 'CLR'.
            assertions [1..*] Array [ Object ] The learner's asserted achievements.
                    id [0..1] String Unique IRI for the object. Required if the type is Assertion.
                    type [1..1] Enumeration The type of the assertion object. Use the type to recast the object to the appropriate sub-class.
                    extensions [0..*] Set of Proprietary Properties The assertion objects can be extended with additional properties.
            associations [0..*] Array [ Object ] The set of achievement associations in the CLR.
                    id [0..1] String Unique IRI for the Association.
                    type [0..1] String The JSON-LD type of this object. Normally 'Association'.
                    associationType [1..1] Enumeration The type of the relationship, used to define the alignment between two achievements.
                    identifier [0..1] String An unambiguous, synthetic, globally unique identifier for the Association. This is the primary way in which the exchange identification is achieved.
                    lastChangeDateTime [0..1] String (Format: date-time) A system generated timestamp of the most recent change to this association.
                    sequenceNumber [0..1] Integer This is used to order associated objects. Associations can be created through mapping rather than strict hierarchy. As such the presentation of the list cannot be ordered by the objects in the list. They may be different based on the parent being viewed.
                    sourceId [1..1] String The 'id' of an Achievement or source of the association.
                    targetId [1..1] String The 'id' of another Achievement, or target of the association.
            issuedOn [1..1] String (Format: date-time) Timestamp of when the CLR was published.
            learner [1..1] Object A profile describing the recipient of the achievements.
                    id [1..1] String Unique IRI for the Profile.
                    type [0..1] String The JSON-LD type of this object. Normally 'Profile'.
                    address [0..1] Object An address for the individual or organization.
                            id [0..1] String Unique IRI for the Address.
                            type [0..1] String The JSON-LD type of this object. Normally 'Address'.
                            addressCountry [0..1] String The country. For example, USA. You can also provide the two-letter ISO 3166-1 alpha-2 country code.
                            addressLocality [0..1] String The locality. For example, Mountain View.
                            addressRegion [0..1] String The region. For example, CA.
                            postalCode [0..1] String The postal code. For example, 94043.
                            postOfficeBoxNumber [0..1] String The post office box number for PO box addresses.
                            streetAddress [0..1] String The street address. For example, 1600 Amphitheatre Pkwy.
                    description [0..1] String A short description of the individual or organization.
                    email [0..1] String A contact email address for the individual or organization.
                    endorsements [0..*] Array [ Object ] Allows endorsers to make specific claims about the individual or organization represented by this profile.
                            id [0..1] String Unique IRI for the object.
                            type [1..1] Enumeration The type of the endorsement object. Use the type to recast the object to the appropriate sub-class.
                            extensions [0..*] Set of Proprietary Properties The endorsement objects can be extended with additional properties.
                    image [0..1] String IRI of an image representing the individual or organization. May be a DATA URI or the URL where the image may be found.
                    name [1..1] String The name of the individual or organization.
                    publicKey [0..1] Object The CrytographicKey object used to verify signed assertions and signed endorsements.
                            id [1..1] String The URI of the CryptographicKey document. Used during signed verification.
                            type [0..1] String The JSON-LD type of this object. Normally 'CryptographicKey'.
                            owner [0..1] String The identifier for the Profile that owns this key.
                            publicKeyPem [0..1] String The PEM key encoding is a widely-used method to express public keys, compatible with almost every Secure Sockets Layer library implementation.
                    revocationList [0..1] Object The list of revoked assertions and endorsements issued by the individual or organization represented by this profile.
                            id [1..1] String Unique IRI for the RevocationList.
                            type [0..1] String The JSON-LD type of this entity. Normally 'RevocationList'.
                            issuer [0..1] String The id of the Issuer.
                            revokedAssertions [0..*] Array [ String ] The id of an assertion that has been revoked.
                    sourcedId [0..1] String The individual's unique 'sourcedId' value, which is used for providing interoperability with IMS Learning Information Services (LIS).
                    studentId [0..1] String An institution's student identifier for the person. This is frequently issued through a Student Information System.
                    telephone [0..1] String Primary phone number for the individual or organization.
                    url [0..1] String (Format: uri) Web resource that uniquely represents or belongs to the individual. This may be a resource about the individual, hosting provided by the instution to the individual, or an web resource independently controlled by the individual.
                    verification [0..1] Object Instructions for how to verify assertions and endorsements issued by the individual or organization represented by this profile.
                            id [0..1] String Unique IRI for the Verification.
                            type [1..1] Enumeration The JSON-LD type of this object. The strongly typed value indicates the verification method.
                            allowedOrigins [0..*] Array [ String ] The host registered name subcomponent of an allowed origin. Any given id URI will be considered valid.
                            creator [0..1] String (Format: uri) The URI of the CryptographicKey with the public key used to verify the signed Assertion. If not present, verifiers will check publicKey property of the referenced issuer Profile. If present, the URI must match the CryptographicKey id in the issuer Profile as well.
                            startsWith [0..*] Array [ String ] The URI fragment that the verification property must start with. Valid Assertions must have an id within this scope. Multiple values allowed, and Assertions will be considered valid if their id starts with one of these values.
                            verificationProperty [0..1] String The property to be used for verification. Only 'id' is supported. Verifiers will consider 'id' the default value if verificationProperty is omitted or if an issuer Profile has no explicit verification instructions, so it may be safely omitted.
                    extensions [0..*] Set of Proprietary Properties The Profile object can be extended with additional properties.
            publisher [1..1] Object A profile describing the publisher of the CLR.
                    id [1..1] String Unique IRI for the Profile.
                    type [0..1] String The JSON-LD type of this object. Normally 'Profile'.
                    address [0..1] Object An address for the individual or organization.
                            id [0..1] String Unique IRI for the Address.
                            type [0..1] String The JSON-LD type of this object. Normally 'Address'.
                            addressCountry [0..1] String The country. For example, USA. You can also provide the two-letter ISO 3166-1 alpha-2 country code.
                            addressLocality [0..1] String The locality. For example, Mountain View.
                            addressRegion [0..1] String The region. For example, CA.
                            postalCode [0..1] String The postal code. For example, 94043.
                            postOfficeBoxNumber [0..1] String The post office box number for PO box addresses.
                            streetAddress [0..1] String The street address. For example, 1600 Amphitheatre Pkwy.
                    description [0..1] String A short description of the individual or organization.
                    email [0..1] String A contact email address for the individual or organization.
                    endorsements [0..*] Array [ Object ] Allows endorsers to make specific claims about the individual or organization represented by this profile.
                            id [0..1] String Unique IRI for the object.
                            type [1..1] Enumeration The type of the endorsement object. Use the type to recast the object to the appropriate sub-class.
                            extensions [0..*] Set of Proprietary Properties The endorsement objects can be extended with additional properties.
                    image [0..1] String IRI of an image representing the individual or organization. May be a DATA URI or the URL where the image may be found.
                    name [1..1] String The name of the individual or organization.
                    publicKey [0..1] Object The CrytographicKey object used to verify signed assertions and signed endorsements.
                            id [1..1] String The URI of the CryptographicKey document. Used during signed verification.
                            type [0..1] String The JSON-LD type of this object. Normally 'CryptographicKey'.
                            owner [0..1] String The identifier for the Profile that owns this key.
                            publicKeyPem [0..1] String The PEM key encoding is a widely-used method to express public keys, compatible with almost every Secure Sockets Layer library implementation.
                    revocationList [0..1] Object The list of revoked assertions and endorsements issued by the individual or organization represented by this profile.
                            id [1..1] String Unique IRI for the RevocationList.
                            type [0..1] String The JSON-LD type of this entity. Normally 'RevocationList'.
                            issuer [0..1] String The id of the Issuer.
                            revokedAssertions [0..*] Array [ String ] The id of an assertion that has been revoked.
                    sourcedId [0..1] String The individual's unique 'sourcedId' value, which is used for providing interoperability with IMS Learning Information Services (LIS).
                    studentId [0..1] String An institution's student identifier for the person. This is frequently issued through a Student Information System.
                    telephone [0..1] String Primary phone number for the individual or organization.
                    url [0..1] String (Format: uri) Web resource that uniquely represents or belongs to the individual. This may be a resource about the individual, hosting provided by the instution to the individual, or an web resource independently controlled by the individual.
                    verification [0..1] Object Instructions for how to verify assertions and endorsements issued by the individual or organization represented by this profile.
                            id [0..1] String Unique IRI for the Verification.
                            type [1..1] Enumeration The JSON-LD type of this object. The strongly typed value indicates the verification method.
                            allowedOrigins [0..*] Array [ String ] The host registered name subcomponent of an allowed origin. Any given id URI will be considered valid.
                            creator [0..1] String (Format: uri) The URI of the CryptographicKey with the public key used to verify the signed Assertion. If not present, verifiers will check publicKey property of the referenced issuer Profile. If present, the URI must match the CryptographicKey id in the issuer Profile as well.
                            startsWith [0..*] Array [ String ] The URI fragment that the verification property must start with. Valid Assertions must have an id within this scope. Multiple values allowed, and Assertions will be considered valid if their id starts with one of these values.
                            verificationProperty [0..1] String The property to be used for verification. Only 'id' is supported. Verifiers will consider 'id' the default value if verificationProperty is omitted or if an issuer Profile has no explicit verification instructions, so it may be safely omitted.
                    extensions [0..*] Set of Proprietary Properties The Profile object can be extended with additional properties.

An example of the response JSON payload is shown in the code block below. The JSON Schema file that can be used to validate this payload is given in Appendix ** ERROR **.

Code 5.6.1 - JSON payload example for "200" response messages for a "getClrs" operation.
    {
        "id" : "..NormalizedString..",
        "type" : "..NormalizedString..",
        "clrs" : [
            {
                "id" : "..NormalizedString..",
                "type" : "..NormalizedString..",
                "assertions" : [
                    {
                        "id" : "..NormalizedString..",
                        "type" : "Assertion"|"SignedAssertion"|"SignedBadge",
                        "..permitted extension point.." : "..user defined value.."
                    },
                    {...},
                    {...}
                ],
                "associations" : [
                    {
                        "id" : "..NormalizedString..",
                        "type" : "..NormalizedString..",
                        "associationType" : "exactMatchOf"|"exemplar"|"hasSkillLevel"|"isChildOf"|"isPartOf"|"isPeerOf"|"isRelatedTo"|"precedes"|"replacedBy",
                        "identifier" : "..String..",
                        "lastChangeDateTime" : "..Date/Time..",
                        "sequenceNumber" : ..Number(Integer)..,
                        "sourceId" : "..NormalizedString..",
                        "targetId" : "..NormalizedString.."
                    },
                    {...},
                    {...}
                ],
                "issuedOn" : "..Date/Time..",
                "learner" : {
                    "id" : "..NormalizedString..",
                    "type" : "..NormalizedString..",
                    "address" : {
                        "id" : "..NormalizedString..",
                        "type" : "..NormalizedString..",
                        "addressCountry" : "..String..",
                        "addressLocality" : "..String..",
                        "addressRegion" : "..String..",
                        "postalCode" : "..String..",
                        "postOfficeBoxNumber" : "..String..",
                        "streetAddress" : "..String.."
                    },
                    "description" : "..String..",
                    "email" : "..String..",
                    "endorsements" : [
                        {
                            "id" : "..NormalizedString..",
                            "type" : "Endorsement"|"SignedEndorsement",
                            "..permitted extension point.." : "..user defined value.."
                        },
                        {...},
                        {...}
                    ],
                    "image" : "..NormalizedString..",
                    "name" : "..String..",
                    "publicKey" : {
                        "id" : "..NormalizedString..",
                        "type" : "..NormalizedString..",
                        "owner" : "..NormalizedString..",
                        "publicKeyPem" : "..String.."
                    },
                    "revocationList" : {
                        "id" : "..NormalizedString..",
                        "type" : "..NormalizedString..",
                        "issuer" : "..NormalizedString..",
                        "revokedAssertions" : [ "..NormalizedString..", ..., "..NormalizedString.." ]
                    },
                    "sourcedId" : "..String..",
                    "studentId" : "..String..",
                    "telephone" : "..String..",
                    "url" : "..URI..",
                    "verification" : {
                        "id" : "..NormalizedString..",
                        "type" : "Hosted"|"HostedAssertion"|"Signed"|"SignedAssertion"|"Verification",
                        "allowedOrigins" : [ "..String..", ..., "..String.." ],
                        "creator" : "..URI..",
                        "startsWith" : [ "..String..", ..., "..String.." ],
                        "verificationProperty" : "..String.."
                    },
                    "..permitted extension point.." : "..user defined value.."
                },
                "publisher" : {
                    "id" : "..NormalizedString..",
                    "type" : "..NormalizedString..",
                    "address" : {
                        "id" : "..NormalizedString..",
                        "type" : "..NormalizedString..",
                        "addressCountry" : "..String..",
                        "addressLocality" : "..String..",
                        "addressRegion" : "..String..",
                        "postalCode" : "..String..",
                        "postOfficeBoxNumber" : "..String..",
                        "streetAddress" : "..String.."
                    },
                    "description" : "..String..",
                    "email" : "..String..",
                    "endorsements" : [
                        {
                            "id" : "..NormalizedString..",
                            "type" : "Endorsement"|"SignedEndorsement",
                            "..permitted extension point.." : "..user defined value.."
                        },
                        {...},
                        {...}
                    ],
                    "image" : "..NormalizedString..",
                    "name" : "..String..",
                    "publicKey" : {
                        "id" : "..NormalizedString..",
                        "type" : "..NormalizedString..",
                        "owner" : "..NormalizedString..",
                        "publicKeyPem" : "..String.."
                    },
                    "revocationList" : {
                        "id" : "..NormalizedString..",
                        "type" : "..NormalizedString..",
                        "issuer" : "..NormalizedString..",
                        "revokedAssertions" : [ "..NormalizedString..", ..., "..NormalizedString.." ]
                    },
                    "sourcedId" : "..String..",
                    "studentId" : "..String..",
                    "telephone" : "..String..",
                    "url" : "..URI..",
                    "verification" : {
                        "id" : "..NormalizedString..",
                        "type" : "Hosted"|"HostedAssertion"|"Signed"|"SignedAssertion"|"Verification",
                        "allowedOrigins" : [ "..String..", ..., "..String.." ],
                        "creator" : "..URI..",
                        "startsWith" : [ "..String..", ..., "..String.." ],
                        "verificationProperty" : "..String.."
                    },
                    "..permitted extension point.." : "..user defined value.."
                }
            },
            {...},
            {...}
        ]
    }
                        

5.6.2 Response Payloads for the HTTP Codes (400, 401, 403, 404, default)

A tabular description of the response payload is shown in the Table below.

Table 5.6.2 - Tabular representation of the JSON payload for "400, 401, 403, 404, default" response messages for a "getClrs" operation.
Property Name Multiplicity JSON Data-type Description
    imsx_codeMajor [1..1] Enumeration The code major value (from the corresponding enumerated vocabulary).
    imsx_severity [1..1] Enumeration The severity value (from the corresponding enumerated vocabulary).
    imsx_description [0..1] String A human readable description supplied by the entity creating the status code information.
    imsx_codeMinor [0..1] Object The set of reported code minor status codes.
            imsx_codeMinorField [1..*] Array [ Object ] Each reported code minor status code.
                    imsx_codeMinorFieldName [1..1] String Tiis should contain the identity of the system that has produced the code minor status code report.
                    imsx_codeMinorFieldValue [1..1] Enumeration The code minor status code (this is a value from the corresponding enumerated vocabulary).

An example of the response JSON payload is shown in the code block below. The JSON Schema file that can be used to validate this payload is given in Appendix ** ERROR **.

Code 5.6.2 - JSON payload example for "400, 401, 403, 404, default" response messages for a "getClrs" operation.
    {
        "imsx_codeMajor" : "success"|"failure"|"processing"|"unsupported",
        "imsx_severity" : "status"|"warning"|"error",
        "imsx_description" : "..String..",
        "imsx_codeMinor" : {
            "imsx_codeMinorField" : [
                {
                    "imsx_codeMinorFieldName" : "..NormalizedString..",
                    "imsx_codeMinorFieldValue" : "forbidden"|"fullsuccess"|"internal_server_error"|"invalid_data"|"invalid_query_parameter"|"server_busy"|"unauthorizedrequest"
                },
                {...},
                {...}
            ]
        }
    }
                        

5.7 "getDiscoveryDocument" Request Payload

There is no payload for this request.

5.8 "getDiscoveryDocument" Response Payloads

5.8.1 Response Payloads for the HTTP Codes (200)

A tabular description of the response payload is shown in the Table below.

Table 5.8.1 - Tabular representation of the JSON payload for "200" response messages for a "getDiscoveryDocument" operation.
Property Name Multiplicity JSON Data-type Description
    authorizationUrl [1..1] String (Format: uri) A fully qualifed URL to the provider's OAuth 2.0 Authorization endpoint.
    image [0..1] String An image representing the provider. May be a Data URI or the URL where the image may be found.
    name [1..1] String The user-facing name of the platform providing CLR services.
    privacyPolicyUrl [1..1] String (Format: uri) A fully qualified URL to the provider's privacy policy.
    registrationUrl [1..1] String (Format: uri) A fully qualified URL to the provider's OAuth 2.0 Registration endpoint.
    scopesOffered [1..*] Array [ String (Format: uri) ] An array of OAuth 2.0 Scopes supported by the provider.
    termsOfServiceUrl [1..1] String (Format: uri) A fully qualified URL to the provider's terms of service.
    tokenUrl [1..1] String (Format: uri) A fully qualified URL to the provider's OAuth 2.0 Token endpoint.

An example of the response JSON payload is shown in the code block below. The JSON Schema file that can be used to validate this payload is given in Appendix ** ERROR **.

Code 5.8.1 - JSON payload example for "200" response messages for a "getDiscoveryDocument" operation.
    {
        "authorizationUrl" : "..URI..",
        "image" : "..NormalizedString..",
        "name" : "..String..",
        "privacyPolicyUrl" : "..URI..",
        "registrationUrl" : "..URI..",
        "scopesOffered" : [ "..URI..", ..., "..URI.." ],
        "termsOfServiceUrl" : "..URI..",
        "tokenUrl" : "..URI.."
    }
                        

5.8.2 Response Payloads for the HTTP Codes (404, 421, default)

There is no payload for these responses i.e. only a HTTP response header is returned.

5.9 "getEndorsement" Request Payload

There is no payload for this request.

5.10 "getEndorsement" Response Payloads

5.10.1 Response Payloads for the HTTP Codes (200)

A tabular description of the response payload is shown in the Table below.

Table 5.10.1 - Tabular representation of the JSON payload for "200" response messages for a "getEndorsement" operation.
Property Name Multiplicity JSON Data-type Description
    id [1..1] String Unique IRI for the Endorsement.
    type [1..1] String The JSON-LD type of this entity. Normally 'Endorsement'.
    claim [0..1] Object An entity, identified by an id and additional properties that the endorser would like to claim about that entity.
            id [1..1] String The 'id' of the Profile, Achievement, or Assertion being endorsed.
            type [0..1] String The JSON-LD type of this entity. Normally 'EndorsementClaim'.
            endorsementComment [0..1] String An endorer's comment about the quality or fitness of the endorsed entity. Markdown allowed.
            extensions [0..*] Set of Proprietary Properties The EndorsementClaim object can be extended with additional properties.
    issuedOn [1..1] String (Format: date-time) Timestamp of when the endorsement was published.
    issuer [1..1] Object The issuer's Profile.
            id [1..1] String Unique IRI for the Profile.
            type [1..1] String The JSON-LD type of this entity. Normally 'Profile'.
            address [0..1] Object An address for the individual or organization.
                    id [0..1] String Unique IRI for the Address.
                    type [0..1] String The JSON-LD type of this object. Normally 'Address'.
                    addressCountry [0..1] String The country. For example, USA. You can also provide the two-letter ISO 3166-1 alpha-2 country code.
                    addressLocality [0..1] String The locality. For example, Mountain View.
                    addressRegion [0..1] String The region. For example, CA.
                    postalCode [0..1] String The postal code. For example, 94043.
                    postOfficeBoxNumber [0..1] String The post office box number for PO box addresses.
                    streetAddress [0..1] String The street address. For example, 1600 Amphitheatre Pkwy.
            description [0..1] String A short description of the individual or organization.
            email [0..1] String A contact email address for the individual or organization.
            image [0..1] String Image representing the individual or organization.
            name [1..1] String The name of the individual or organization.
            publicKey [0..1] Object The URI for the public key used to verify signed Assertions. If present, the URI must resolve to a CryptographicKey document.
                    id [1..1] String The URI of the CryptographicKey document. Used during signed verification.
                    type [0..1] String The JSON-LD type of this object. Normally 'CryptographicKey'.
                    owner [0..1] String The identifier for the Profile that owns this key.
                    publicKeyPem [0..1] String The PEM key encoding is a widely-used method to express public keys, compatible with almost every Secure Sockets Layer library implementation.
            revocationList [0..1] String The URI of the Revocation List used for marking revocation of signed Assertions.
            sourcedId [0..1] String The individual's unique 'sourcedId' value, which is used for providing interoperability with IMS Learning Information Services (LIS).
            studentId [0..1] String An institution's student identifier for the person. This is frequently issued through a Student Information System.
            telephone [0..1] String Primary phone number for the individual or organization.
            url [0..1] String (Format: uri) Web resource that uniquely represents or belongs to the individual. This may be a resource about the individual, hosting provided by the instution to the individual, or an web resource independently controlled by the individual.
            verification [0..1] Object Instructions for how to verify Assertion issued by this Profile.
                    id [0..1] String Unique IRI for the Verification.
                    type [1..1] Enumeration The JSON-LD type of this object. The strongly typed value indicates the verification method.
                    allowedOrigins [0..*] Array [ String ] The host registered name subcomponent of an allowed origin. Any given id URI will be considered valid.
                    creator [0..1] String (Format: uri) The URI of the CryptographicKey with the public key used to verify the signed Assertion. If not present, verifiers will check publicKey property of the referenced issuer Profile. If present, the URI must match the CryptographicKey id in the issuer Profile as well.
                    startsWith [0..*] Array [ String ] The URI fragment that the verification property must start with. Valid Assertions must have an id within this scope. Multiple values allowed, and Assertions will be considered valid if their id starts with one of these values.
                    verificationProperty [0..1] String The property to be used for verification. Only 'id' is supported. Verifiers will consider 'id' the default value if verificationProperty is omitted or if an issuer Profile has no explicit verification instructions, so it may be safely omitted.
            extensions [0..*] Set of Proprietary Properties Profile can be extended with additional properties.
    verification [0..1] Object Instructions for third parties to verify this assertion of endorsement.
            id [0..1] String Unique IRI for the Verification.
            type [1..1] Enumeration The JSON-LD type of this object. The strongly typed value indicates the verification method.
            allowedOrigins [0..*] Array [ String ] The host registered name subcomponent of an allowed origin. Any given id URI will be considered valid.
            creator [0..1] String (Format: uri) The URI of the CryptographicKey with the public key used to verify the signed Assertion. If not present, verifiers will check publicKey property of the referenced issuer Profile. If present, the URI must match the CryptographicKey id in the issuer Profile as well.
            startsWith [0..*] Array [ String ] The URI fragment that the verification property must start with. Valid Assertions must have an id within this scope. Multiple values allowed, and Assertions will be considered valid if their id starts with one of these values.
            verificationProperty [0..1] String The property to be used for verification. Only 'id' is supported. Verifiers will consider 'id' the default value if verificationProperty is omitted or if an issuer Profile has no explicit verification instructions, so it may be safely omitted.

An example of the response JSON payload is shown in the code block below. The JSON Schema file that can be used to validate this payload is given in Appendix ** ERROR **.

Code 5.10.1 - JSON payload example for "200" response messages for a "getEndorsement" operation.
    {
        "id" : "..NormalizedString..",
        "type" : "..NormalizedString..",
        "claim" : {
            "id" : "..NormalizedString..",
            "type" : "..NormalizedString..",
            "endorsementComment" : "..String..",
            "..permitted extension point.." : "..user defined value.."
        },
        "issuedOn" : "..Date/Time..",
        "issuer" : {
            "id" : "..NormalizedString..",
            "type" : "..NormalizedString..",
            "address" : {
                "id" : "..NormalizedString..",
                "type" : "..NormalizedString..",
                "addressCountry" : "..String..",
                "addressLocality" : "..String..",
                "addressRegion" : "..String..",
                "postalCode" : "..String..",
                "postOfficeBoxNumber" : "..String..",
                "streetAddress" : "..String.."
            },
            "description" : "..String..",
            "email" : "..String..",
            "image" : "..NormalizedString..",
            "name" : "..String..",
            "publicKey" : {
                "id" : "..NormalizedString..",
                "type" : "..NormalizedString..",
                "owner" : "..NormalizedString..",
                "publicKeyPem" : "..String.."
            },
            "revocationList" : "..NormalizedString..",
            "sourcedId" : "..String..",
            "studentId" : "..String..",
            "telephone" : "..String..",
            "url" : "..URI..",
            "verification" : {
                "id" : "..NormalizedString..",
                "type" : "Hosted"|"HostedAssertion"|"Signed"|"SignedAssertion"|"Verification",
                "allowedOrigins" : [ "..String..", ..., "..String.." ],
                "creator" : "..URI..",
                "startsWith" : [ "..String..", ..., "..String.." ],
                "verificationProperty" : "..String.."
            },
            "..permitted extension point.." : "..user defined value.."
        },
        "verification" : {
            "id" : "..NormalizedString..",
            "type" : "Hosted"|"HostedAssertion"|"Signed"|"SignedAssertion"|"Verification",
            "allowedOrigins" : [ "..String..", ..., "..String.." ],
            "creator" : "..URI..",
            "startsWith" : [ "..String..", ..., "..String.." ],
            "verificationProperty" : "..String.."
        }
    }
                        

5.10.2 Response Payloads for the HTTP Codes (404, default)

There is no payload for these responses i.e. only a HTTP response header is returned.

5.11 "getKey" Request Payload

There is no payload for this request.

5.12 "getKey" Response Payloads

5.12.1 Response Payloads for the HTTP Codes (200)

A tabular description of the response payload is shown in the Table below.

Table 5.12.1 - Tabular representation of the JSON payload for "200" response messages for a "getKey" operation.
Property Name Multiplicity JSON Data-type Description
    id [1..1] String The URI of the CryptographicKey document. Used during signed verification.
    type [0..1] String The JSON-LD type of this object. Normally 'CryptographicKey'.
    owner [0..1] String The identifier for the Profile that owns this key.
    publicKeyPem [0..1] String The PEM key encoding is a widely-used method to express public keys, compatible with almost every Secure Sockets Layer library implementation.

An example of the response JSON payload is shown in the code block below. The JSON Schema file that can be used to validate this payload is given in Appendix ** ERROR **.

Code 5.12.1 - JSON payload example for "200" response messages for a "getKey" operation.
    {
        "id" : "..NormalizedString..",
        "type" : "..NormalizedString..",
        "owner" : "..NormalizedString..",
        "publicKeyPem" : "..String.."
    }
                        

5.12.2 Response Payloads for the HTTP Codes (404, default)

There is no payload for these responses i.e. only a HTTP response header is returned.

5.13 "replaceClr" Request Payload

A tabular description of the request payload is shown in the Table below.

Table 5.13.1 - Tabular representation of the JSON payload for the request message for a "replaceClr" operation.
Property Name Multiplicity JSON Data-type Description
    id [1..1] String Unique IRI for the CLR.
    type [0..1] String The JSON-LD type of this object. Normally 'CLR'.
    assertions [1..*] Array [ Object ] The learner's asserted achievements.
            id [0..1] String Unique IRI for the object. Required if the type is Assertion.
            type [1..1] Enumeration The type of the assertion object. Use the type to recast the object to the appropriate sub-class.
            extensions [0..*] Set of Proprietary Properties The assertion objects can be extended with additional properties.
    associations [0..*] Array [ Object ] The set of achievement associations in the CLR.
            id [0..1] String Unique IRI for the Association.
            type [0..1] String The JSON-LD type of this object. Normally 'Association'.
            associationType [1..1] Enumeration The type of the relationship, used to define the alignment between two achievements.
            identifier [0..1] String An unambiguous, synthetic, globally unique identifier for the Association. This is the primary way in which the exchange identification is achieved.
            lastChangeDateTime [0..1] String (Format: date-time) A system generated timestamp of the most recent change to this association.
            sequenceNumber [0..1] Integer This is used to order associated objects. Associations can be created through mapping rather than strict hierarchy. As such the presentation of the list cannot be ordered by the objects in the list. They may be different based on the parent being viewed.
            sourceId [1..1] String The 'id' of an Achievement or source of the association.
            targetId [1..1] String The 'id' of another Achievement, or target of the association.
    issuedOn [1..1] String (Format: date-time) Timestamp of when the CLR was published.
    learner [1..1] Object A profile describing the recipient of the achievements.
            id [1..1] String Unique IRI for the Profile.
            type [0..1] String The JSON-LD type of this object. Normally 'Profile'.
            address [0..1] Object An address for the individual or organization.
                    id [0..1] String Unique IRI for the Address.
                    type [0..1] String The JSON-LD type of this object. Normally 'Address'.
                    addressCountry [0..1] String The country. For example, USA. You can also provide the two-letter ISO 3166-1 alpha-2 country code.
                    addressLocality [0..1] String The locality. For example, Mountain View.
                    addressRegion [0..1] String The region. For example, CA.
                    postalCode [0..1] String The postal code. For example, 94043.
                    postOfficeBoxNumber [0..1] String The post office box number for PO box addresses.
                    streetAddress [0..1] String The street address. For example, 1600 Amphitheatre Pkwy.
            description [0..1] String A short description of the individual or organization.
            email [0..1] String A contact email address for the individual or organization.
            endorsements [0..*] Array [ Object ] Allows endorsers to make specific claims about the individual or organization represented by this profile.
                    id [0..1] String Unique IRI for the object.
                    type [1..1] Enumeration The type of the endorsement object. Use the type to recast the object to the appropriate sub-class.
                    extensions [0..*] Set of Proprietary Properties The endorsement objects can be extended with additional properties.
            image [0..1] String IRI of an image representing the individual or organization. May be a DATA URI or the URL where the image may be found.
            name [1..1] String The name of the individual or organization.
            publicKey [0..1] Object The CrytographicKey object used to verify signed assertions and signed endorsements.
                    id [1..1] String The URI of the CryptographicKey document. Used during signed verification.
                    type [0..1] String The JSON-LD type of this object. Normally 'CryptographicKey'.
                    owner [0..1] String The identifier for the Profile that owns this key.
                    publicKeyPem [0..1] String The PEM key encoding is a widely-used method to express public keys, compatible with almost every Secure Sockets Layer library implementation.
            revocationList [0..1] Object The list of revoked assertions and endorsements issued by the individual or organization represented by this profile.
                    id [1..1] String Unique IRI for the RevocationList.
                    type [0..1] String The JSON-LD type of this entity. Normally 'RevocationList'.
                    issuer [0..1] String The id of the Issuer.
                    revokedAssertions [0..*] Array [ String ] The id of an assertion that has been revoked.
            sourcedId [0..1] String The individual's unique 'sourcedId' value, which is used for providing interoperability with IMS Learning Information Services (LIS).
            studentId [0..1] String An institution's student identifier for the person. This is frequently issued through a Student Information System.
            telephone [0..1] String Primary phone number for the individual or organization.
            url [0..1] String (Format: uri) Web resource that uniquely represents or belongs to the individual. This may be a resource about the individual, hosting provided by the instution to the individual, or an web resource independently controlled by the individual.
            verification [0..1] Object Instructions for how to verify assertions and endorsements issued by the individual or organization represented by this profile.
                    id [0..1] String Unique IRI for the Verification.
                    type [1..1] Enumeration The JSON-LD type of this object. The strongly typed value indicates the verification method.
                    allowedOrigins [0..*] Array [ String ] The host registered name subcomponent of an allowed origin. Any given id URI will be considered valid.
                    creator [0..1] String (Format: uri) The URI of the CryptographicKey with the public key used to verify the signed Assertion. If not present, verifiers will check publicKey property of the referenced issuer Profile. If present, the URI must match the CryptographicKey id in the issuer Profile as well.
                    startsWith [0..*] Array [ String ] The URI fragment that the verification property must start with. Valid Assertions must have an id within this scope. Multiple values allowed, and Assertions will be considered valid if their id starts with one of these values.
                    verificationProperty [0..1] String The property to be used for verification. Only 'id' is supported. Verifiers will consider 'id' the default value if verificationProperty is omitted or if an issuer Profile has no explicit verification instructions, so it may be safely omitted.
            extensions [0..*] Set of Proprietary Properties The Profile object can be extended with additional properties.
    publisher [1..1] Object A profile describing the publisher of the CLR.
            id [1..1] String Unique IRI for the Profile.
            type [0..1] String The JSON-LD type of this object. Normally 'Profile'.
            address [0..1] Object An address for the individual or organization.
                    id [0..1] String Unique IRI for the Address.
                    type [0..1] String The JSON-LD type of this object. Normally 'Address'.
                    addressCountry [0..1] String The country. For example, USA. You can also provide the two-letter ISO 3166-1 alpha-2 country code.
                    addressLocality [0..1] String The locality. For example, Mountain View.
                    addressRegion [0..1] String The region. For example, CA.
                    postalCode [0..1] String The postal code. For example, 94043.
                    postOfficeBoxNumber [0..1] String The post office box number for PO box addresses.
                    streetAddress [0..1] String The street address. For example, 1600 Amphitheatre Pkwy.
            description [0..1] String A short description of the individual or organization.
            email [0..1] String A contact email address for the individual or organization.
            endorsements [0..*] Array [ Object ] Allows endorsers to make specific claims about the individual or organization represented by this profile.
                    id [0..1] String Unique IRI for the object.
                    type [1..1] Enumeration The type of the endorsement object. Use the type to recast the object to the appropriate sub-class.
                    extensions [0..*] Set of Proprietary Properties The endorsement objects can be extended with additional properties.
            image [0..1] String IRI of an image representing the individual or organization. May be a DATA URI or the URL where the image may be found.
            name [1..1] String The name of the individual or organization.
            publicKey [0..1] Object The CrytographicKey object used to verify signed assertions and signed endorsements.
                    id [1..1] String The URI of the CryptographicKey document. Used during signed verification.
                    type [0..1] String The JSON-LD type of this object. Normally 'CryptographicKey'.
                    owner [0..1] String The identifier for the Profile that owns this key.
                    publicKeyPem [0..1] String The PEM key encoding is a widely-used method to express public keys, compatible with almost every Secure Sockets Layer library implementation.
            revocationList [0..1] Object The list of revoked assertions and endorsements issued by the individual or organization represented by this profile.
                    id [1..1] String Unique IRI for the RevocationList.
                    type [0..1] String The JSON-LD type of this entity. Normally 'RevocationList'.
                    issuer [0..1] String The id of the Issuer.
                    revokedAssertions [0..*] Array [ String ] The id of an assertion that has been revoked.
            sourcedId [0..1] String The individual's unique 'sourcedId' value, which is used for providing interoperability with IMS Learning Information Services (LIS).
            studentId [0..1] String An institution's student identifier for the person. This is frequently issued through a Student Information System.
            telephone [0..1] String Primary phone number for the individual or organization.
            url [0..1] String (Format: uri) Web resource that uniquely represents or belongs to the individual. This may be a resource about the individual, hosting provided by the instution to the individual, or an web resource independently controlled by the individual.
            verification [0..1] Object Instructions for how to verify assertions and endorsements issued by the individual or organization represented by this profile.
                    id [0..1] String Unique IRI for the Verification.
                    type [1..1] Enumeration The JSON-LD type of this object. The strongly typed value indicates the verification method.
                    allowedOrigins [0..*] Array [ String ] The host registered name subcomponent of an allowed origin. Any given id URI will be considered valid.
                    creator [0..1] String (Format: uri) The URI of the CryptographicKey with the public key used to verify the signed Assertion. If not present, verifiers will check publicKey property of the referenced issuer Profile. If present, the URI must match the CryptographicKey id in the issuer Profile as well.
                    startsWith [0..*] Array [ String ] The URI fragment that the verification property must start with. Valid Assertions must have an id within this scope. Multiple values allowed, and Assertions will be considered valid if their id starts with one of these values.
                    verificationProperty [0..1] String The property to be used for verification. Only 'id' is supported. Verifiers will consider 'id' the default value if verificationProperty is omitted or if an issuer Profile has no explicit verification instructions, so it may be safely omitted.
            extensions [0..*] Set of Proprietary Properties The Profile object can be extended with additional properties.

An example of the request payload is shown in the code block below.

Code 5.13.1 - JSON payload example for the request message for a "replaceClr" operation.
    {
        "id" : "..NormalizedString..",
        "type" : "..NormalizedString..",
        "assertions" : [
            {
                "id" : "..NormalizedString..",
                "type" : "Assertion"|"SignedAssertion"|"SignedBadge",
                "..permitted extension point.." : "..user defined value.."
            },
            {...},
            {...}
        ],
        "associations" : [
            {
                "id" : "..NormalizedString..",
                "type" : "..NormalizedString..",
                "associationType" : "exactMatchOf"|"exemplar"|"hasSkillLevel"|"isChildOf"|"isPartOf"|"isPeerOf"|"isRelatedTo"|"precedes"|"replacedBy",
                "identifier" : "..String..",
                "lastChangeDateTime" : "..Date/Time..",
                "sequenceNumber" : ..Number(Integer)..,
                "sourceId" : "..NormalizedString..",
                "targetId" : "..NormalizedString.."
            },
            {...},
            {...}
        ],
        "issuedOn" : "..Date/Time..",
        "learner" : {
            "id" : "..NormalizedString..",
            "type" : "..NormalizedString..",
            "address" : {
                "id" : "..NormalizedString..",
                "type" : "..NormalizedString..",
                "addressCountry" : "..String..",
                "addressLocality" : "..String..",
                "addressRegion" : "..String..",
                "postalCode" : "..String..",
                "postOfficeBoxNumber" : "..String..",
                "streetAddress" : "..String.."
            },
            "description" : "..String..",
            "email" : "..String..",
            "endorsements" : [
                {
                    "id" : "..NormalizedString..",
                    "type" : "Endorsement"|"SignedEndorsement",
                    "..permitted extension point.." : "..user defined value.."
                },
                {...},
                {...}
            ],
            "image" : "..NormalizedString..",
            "name" : "..String..",
            "publicKey" : {
                "id" : "..NormalizedString..",
                "type" : "..NormalizedString..",
                "owner" : "..NormalizedString..",
                "publicKeyPem" : "..String.."
            },
            "revocationList" : {
                "id" : "..NormalizedString..",
                "type" : "..NormalizedString..",
                "issuer" : "..NormalizedString..",
                "revokedAssertions" : [ "..NormalizedString..", ..., "..NormalizedString.." ]
            },
            "sourcedId" : "..String..",
            "studentId" : "..String..",
            "telephone" : "..String..",
            "url" : "..URI..",
            "verification" : {
                "id" : "..NormalizedString..",
                "type" : "Hosted"|"HostedAssertion"|"Signed"|"SignedAssertion"|"Verification",
                "allowedOrigins" : [ "..String..", ..., "..String.." ],
                "creator" : "..URI..",
                "startsWith" : [ "..String..", ..., "..String.." ],
                "verificationProperty" : "..String.."
            },
            "..permitted extension point.." : "..user defined value.."
        },
        "publisher" : {
            "id" : "..NormalizedString..",
            "type" : "..NormalizedString..",
            "address" : {
                "id" : "..NormalizedString..",
                "type" : "..NormalizedString..",
                "addressCountry" : "..String..",
                "addressLocality" : "..String..",
                "addressRegion" : "..String..",
                "postalCode" : "..String..",
                "postOfficeBoxNumber" : "..String..",
                "streetAddress" : "..String.."
            },
            "description" : "..String..",
            "email" : "..String..",
            "endorsements" : [
                {
                    "id" : "..NormalizedString..",
                    "type" : "Endorsement"|"SignedEndorsement",
                    "..permitted extension point.." : "..user defined value.."
                },
                {...},
                {...}
            ],
            "image" : "..NormalizedString..",
            "name" : "..String..",
            "publicKey" : {
                "id" : "..NormalizedString..",
                "type" : "..NormalizedString..",
                "owner" : "..NormalizedString..",
                "publicKeyPem" : "..String.."
            },
            "revocationList" : {
                "id" : "..NormalizedString..",
                "type" : "..NormalizedString..",
                "issuer" : "..NormalizedString..",
                "revokedAssertions" : [ "..NormalizedString..", ..., "..NormalizedString.." ]
            },
            "sourcedId" : "..String..",
            "studentId" : "..String..",
            "telephone" : "..String..",
            "url" : "..URI..",
            "verification" : {
                "id" : "..NormalizedString..",
                "type" : "Hosted"|"HostedAssertion"|"Signed"|"SignedAssertion"|"Verification",
                "allowedOrigins" : [ "..String..", ..., "..String.." ],
                "creator" : "..URI..",
                "startsWith" : [ "..String..", ..., "..String.." ],
                "verificationProperty" : "..String.."
            },
            "..permitted extension point.." : "..user defined value.."
        }
    }
                        

5.14 "replaceClr" Response Payloads

5.14.1 Response Payloads for the HTTP Codes (200, 201)

A tabular description of the response payload is shown in the Table below.

Table 5.14.1 - Tabular representation of the JSON payload for "200, 201" response messages for a "replaceClr" operation.
Property Name Multiplicity JSON Data-type Description
    id [1..1] String Unique IRI for the CLR.
    type [0..1] String The JSON-LD type of this object. Normally 'CLR'.
    assertions [1..*] Array [ Object ] The learner's asserted achievements.
            id [0..1] String Unique IRI for the object. Required if the type is Assertion.
            type [1..1] Enumeration The type of the assertion object. Use the type to recast the object to the appropriate sub-class.
            extensions [0..*] Set of Proprietary Properties The assertion objects can be extended with additional properties.
    associations [0..*] Array [ Object ] The set of achievement associations in the CLR.
            id [0..1] String Unique IRI for the Association.
            type [0..1] String The JSON-LD type of this object. Normally 'Association'.
            associationType [1..1] Enumeration The type of the relationship, used to define the alignment between two achievements.
            identifier [0..1] String An unambiguous, synthetic, globally unique identifier for the Association. This is the primary way in which the exchange identification is achieved.
            lastChangeDateTime [0..1] String (Format: date-time) A system generated timestamp of the most recent change to this association.
            sequenceNumber [0..1] Integer This is used to order associated objects. Associations can be created through mapping rather than strict hierarchy. As such the presentation of the list cannot be ordered by the objects in the list. They may be different based on the parent being viewed.
            sourceId [1..1] String The 'id' of an Achievement or source of the association.
            targetId [1..1] String The 'id' of another Achievement, or target of the association.
    issuedOn [1..1] String (Format: date-time) Timestamp of when the CLR was published.
    learner [1..1] Object A profile describing the recipient of the achievements.
            id [1..1] String Unique IRI for the Profile.
            type [0..1] String The JSON-LD type of this object. Normally 'Profile'.
            address [0..1] Object An address for the individual or organization.
                    id [0..1] String Unique IRI for the Address.
                    type [0..1] String The JSON-LD type of this object. Normally 'Address'.
                    addressCountry [0..1] String The country. For example, USA. You can also provide the two-letter ISO 3166-1 alpha-2 country code.
                    addressLocality [0..1] String The locality. For example, Mountain View.
                    addressRegion [0..1] String The region. For example, CA.
                    postalCode [0..1] String The postal code. For example, 94043.
                    postOfficeBoxNumber [0..1] String The post office box number for PO box addresses.
                    streetAddress [0..1] String The street address. For example, 1600 Amphitheatre Pkwy.
            description [0..1] String A short description of the individual or organization.
            email [0..1] String A contact email address for the individual or organization.
            endorsements [0..*] Array [ Object ] Allows endorsers to make specific claims about the individual or organization represented by this profile.
                    id [0..1] String Unique IRI for the object.
                    type [1..1] Enumeration The type of the endorsement object. Use the type to recast the object to the appropriate sub-class.
                    extensions [0..*] Set of Proprietary Properties The endorsement objects can be extended with additional properties.
            image [0..1] String IRI of an image representing the individual or organization. May be a DATA URI or the URL where the image may be found.
            name [1..1] String The name of the individual or organization.
            publicKey [0..1] Object The CrytographicKey object used to verify signed assertions and signed endorsements.
                    id [1..1] String The URI of the CryptographicKey document. Used during signed verification.
                    type [0..1] String The JSON-LD type of this object. Normally 'CryptographicKey'.
                    owner [0..1] String The identifier for the Profile that owns this key.
                    publicKeyPem [0..1] String The PEM key encoding is a widely-used method to express public keys, compatible with almost every Secure Sockets Layer library implementation.
            revocationList [0..1] Object The list of revoked assertions and endorsements issued by the individual or organization represented by this profile.
                    id [1..1] String Unique IRI for the RevocationList.
                    type [0..1] String The JSON-LD type of this entity. Normally 'RevocationList'.
                    issuer [0..1] String The id of the Issuer.
                    revokedAssertions [0..*] Array [ String ] The id of an assertion that has been revoked.
            sourcedId [0..1] String The individual's unique 'sourcedId' value, which is used for providing interoperability with IMS Learning Information Services (LIS).
            studentId [0..1] String An institution's student identifier for the person. This is frequently issued through a Student Information System.
            telephone [0..1] String Primary phone number for the individual or organization.
            url [0..1] String (Format: uri) Web resource that uniquely represents or belongs to the individual. This may be a resource about the individual, hosting provided by the instution to the individual, or an web resource independently controlled by the individual.
            verification [0..1] Object Instructions for how to verify assertions and endorsements issued by the individual or organization represented by this profile.
                    id [0..1] String Unique IRI for the Verification.
                    type [1..1] Enumeration The JSON-LD type of this object. The strongly typed value indicates the verification method.
                    allowedOrigins [0..*] Array [ String ] The host registered name subcomponent of an allowed origin. Any given id URI will be considered valid.
                    creator [0..1] String (Format: uri) The URI of the CryptographicKey with the public key used to verify the signed Assertion. If not present, verifiers will check publicKey property of the referenced issuer Profile. If present, the URI must match the CryptographicKey id in the issuer Profile as well.
                    startsWith [0..*] Array [ String ] The URI fragment that the verification property must start with. Valid Assertions must have an id within this scope. Multiple values allowed, and Assertions will be considered valid if their id starts with one of these values.
                    verificationProperty [0..1] String The property to be used for verification. Only 'id' is supported. Verifiers will consider 'id' the default value if verificationProperty is omitted or if an issuer Profile has no explicit verification instructions, so it may be safely omitted.
            extensions [0..*] Set of Proprietary Properties The Profile object can be extended with additional properties.
    publisher [1..1] Object A profile describing the publisher of the CLR.
            id [1..1] String Unique IRI for the Profile.
            type [0..1] String The JSON-LD type of this object. Normally 'Profile'.
            address [0..1] Object An address for the individual or organization.
                    id [0..1] String Unique IRI for the Address.
                    type [0..1] String The JSON-LD type of this object. Normally 'Address'.
                    addressCountry [0..1] String The country. For example, USA. You can also provide the two-letter ISO 3166-1 alpha-2 country code.
                    addressLocality [0..1] String The locality. For example, Mountain View.
                    addressRegion [0..1] String The region. For example, CA.
                    postalCode [0..1] String The postal code. For example, 94043.
                    postOfficeBoxNumber [0..1] String The post office box number for PO box addresses.
                    streetAddress [0..1] String The street address. For example, 1600 Amphitheatre Pkwy.
            description [0..1] String A short description of the individual or organization.
            email [0..1] String A contact email address for the individual or organization.
            endorsements [0..*] Array [ Object ] Allows endorsers to make specific claims about the individual or organization represented by this profile.
                    id [0..1] String Unique IRI for the object.
                    type [1..1] Enumeration The type of the endorsement object. Use the type to recast the object to the appropriate sub-class.
                    extensions [0..*] Set of Proprietary Properties The endorsement objects can be extended with additional properties.
            image [0..1] String IRI of an image representing the individual or organization. May be a DATA URI or the URL where the image may be found.
            name [1..1] String The name of the individual or organization.
            publicKey [0..1] Object The CrytographicKey object used to verify signed assertions and signed endorsements.
                    id [1..1] String The URI of the CryptographicKey document. Used during signed verification.
                    type [0..1] String The JSON-LD type of this object. Normally 'CryptographicKey'.
                    owner [0..1] String The identifier for the Profile that owns this key.
                    publicKeyPem [0..1] String The PEM key encoding is a widely-used method to express public keys, compatible with almost every Secure Sockets Layer library implementation.
            revocationList [0..1] Object The list of revoked assertions and endorsements issued by the individual or organization represented by this profile.
                    id [1..1] String Unique IRI for the RevocationList.
                    type [0..1] String The JSON-LD type of this entity. Normally 'RevocationList'.
                    issuer [0..1] String The id of the Issuer.
                    revokedAssertions [0..*] Array [ String ] The id of an assertion that has been revoked.
            sourcedId [0..1] String The individual's unique 'sourcedId' value, which is used for providing interoperability with IMS Learning Information Services (LIS).
            studentId [0..1] String An institution's student identifier for the person. This is frequently issued through a Student Information System.
            telephone [0..1] String Primary phone number for the individual or organization.
            url [0..1] String (Format: uri) Web resource that uniquely represents or belongs to the individual. This may be a resource about the individual, hosting provided by the instution to the individual, or an web resource independently controlled by the individual.
            verification [0..1] Object Instructions for how to verify assertions and endorsements issued by the individual or organization represented by this profile.
                    id [0..1] String Unique IRI for the Verification.
                    type [1..1] Enumeration The JSON-LD type of this object. The strongly typed value indicates the verification method.
                    allowedOrigins [0..*] Array [ String ] The host registered name subcomponent of an allowed origin. Any given id URI will be considered valid.
                    creator [0..1] String (Format: uri) The URI of the CryptographicKey with the public key used to verify the signed Assertion. If not present, verifiers will check publicKey property of the referenced issuer Profile. If present, the URI must match the CryptographicKey id in the issuer Profile as well.
                    startsWith [0..*] Array [ String ] The URI fragment that the verification property must start with. Valid Assertions must have an id within this scope. Multiple values allowed, and Assertions will be considered valid if their id starts with one of these values.
                    verificationProperty [0..1] String The property to be used for verification. Only 'id' is supported. Verifiers will consider 'id' the default value if verificationProperty is omitted or if an issuer Profile has no explicit verification instructions, so it may be safely omitted.
            extensions [0..*] Set of Proprietary Properties The Profile object can be extended with additional properties.

An example of the response JSON payload is shown in the code block below. The JSON Schema file that can be used to validate this payload is given in Appendix ** ERROR **.

Code 5.14.1 - JSON payload example for "200, 201" response messages for a "replaceClr" operation.
    {
        "id" : "..NormalizedString..",
        "type" : "..NormalizedString..",
        "assertions" : [
            {
                "id" : "..NormalizedString..",
                "type" : "Assertion"|"SignedAssertion"|"SignedBadge",
                "..permitted extension point.." : "..user defined value.."
            },
            {...},
            {...}
        ],
        "associations" : [
            {
                "id" : "..NormalizedString..",
                "type" : "..NormalizedString..",
                "associationType" : "exactMatchOf"|"exemplar"|"hasSkillLevel"|"isChildOf"|"isPartOf"|"isPeerOf"|"isRelatedTo"|"precedes"|"replacedBy",
                "identifier" : "..String..",
                "lastChangeDateTime" : "..Date/Time..",
                "sequenceNumber" : ..Number(Integer)..,
                "sourceId" : "..NormalizedString..",
                "targetId" : "..NormalizedString.."
            },
            {...},
            {...}
        ],
        "issuedOn" : "..Date/Time..",
        "learner" : {
            "id" : "..NormalizedString..",
            "type" : "..NormalizedString..",
            "address" : {
                "id" : "..NormalizedString..",
                "type" : "..NormalizedString..",
                "addressCountry" : "..String..",
                "addressLocality" : "..String..",
                "addressRegion" : "..String..",
                "postalCode" : "..String..",
                "postOfficeBoxNumber" : "..String..",
                "streetAddress" : "..String.."
            },
            "description" : "..String..",
            "email" : "..String..",
            "endorsements" : [
                {
                    "id" : "..NormalizedString..",
                    "type" : "Endorsement"|"SignedEndorsement",
                    "..permitted extension point.." : "..user defined value.."
                },
                {...},
                {...}
            ],
            "image" : "..NormalizedString..",
            "name" : "..String..",
            "publicKey" : {
                "id" : "..NormalizedString..",
                "type" : "..NormalizedString..",
                "owner" : "..NormalizedString..",
                "publicKeyPem" : "..String.."
            },
            "revocationList" : {
                "id" : "..NormalizedString..",
                "type" : "..NormalizedString..",
                "issuer" : "..NormalizedString..",
                "revokedAssertions" : [ "..NormalizedString..", ..., "..NormalizedString.." ]
            },
            "sourcedId" : "..String..",
            "studentId" : "..String..",
            "telephone" : "..String..",
            "url" : "..URI..",
            "verification" : {
                "id" : "..NormalizedString..",
                "type" : "Hosted"|"HostedAssertion"|"Signed"|"SignedAssertion"|"Verification",
                "allowedOrigins" : [ "..String..", ..., "..String.." ],
                "creator" : "..URI..",
                "startsWith" : [ "..String..", ..., "..String.." ],
                "verificationProperty" : "..String.."
            },
            "..permitted extension point.." : "..user defined value.."
        },
        "publisher" : {
            "id" : "..NormalizedString..",
            "type" : "..NormalizedString..",
            "address" : {
                "id" : "..NormalizedString..",
                "type" : "..NormalizedString..",
                "addressCountry" : "..String..",
                "addressLocality" : "..String..",
                "addressRegion" : "..String..",
                "postalCode" : "..String..",
                "postOfficeBoxNumber" : "..String..",
                "streetAddress" : "..String.."
            },
            "description" : "..String..",
            "email" : "..String..",
            "endorsements" : [
                {
                    "id" : "..NormalizedString..",
                    "type" : "Endorsement"|"SignedEndorsement",
                    "..permitted extension point.." : "..user defined value.."
                },
                {...},
                {...}
            ],
            "image" : "..NormalizedString..",
            "name" : "..String..",
            "publicKey" : {
                "id" : "..NormalizedString..",
                "type" : "..NormalizedString..",
                "owner" : "..NormalizedString..",
                "publicKeyPem" : "..String.."
            },
            "revocationList" : {
                "id" : "..NormalizedString..",
                "type" : "..NormalizedString..",
                "issuer" : "..NormalizedString..",
                "revokedAssertions" : [ "..NormalizedString..", ..., "..NormalizedString.." ]
            },
            "sourcedId" : "..String..",
            "studentId" : "..String..",
            "telephone" : "..String..",
            "url" : "..URI..",
            "verification" : {
                "id" : "..NormalizedString..",
                "type" : "Hosted"|"HostedAssertion"|"Signed"|"SignedAssertion"|"Verification",
                "allowedOrigins" : [ "..String..", ..., "..String.." ],
                "creator" : "..URI..",
                "startsWith" : [ "..String..", ..., "..String.." ],
                "verificationProperty" : "..String.."
            },
            "..permitted extension point.." : "..user defined value.."
        }
    }
                        

5.14.2 Response Payloads for the HTTP Codes (304)

There is no payload for these responses i.e. only a HTTP response header is returned.

5.14.3 Response Payloads for the HTTP Codes (400, 401, 403, 404, default)

A tabular description of the response payload is shown in the Table below.

Table 5.14.3 - Tabular representation of the JSON payload for "400, 401, 403, 404, default" response messages for a "replaceClr" operation.
Property Name Multiplicity JSON Data-type Description
    imsx_codeMajor [1..1] Enumeration The code major value (from the corresponding enumerated vocabulary).
    imsx_severity [1..1] Enumeration The severity value (from the corresponding enumerated vocabulary).
    imsx_description [0..1] String A human readable description supplied by the entity creating the status code information.
    imsx_codeMinor [0..1] Object The set of reported code minor status codes.
            imsx_codeMinorField [1..*] Array [ Object ] Each reported code minor status code.
                    imsx_codeMinorFieldName [1..1] String Tiis should contain the identity of the system that has produced the code minor status code report.
                    imsx_codeMinorFieldValue [1..1] Enumeration The code minor status code (this is a value from the corresponding enumerated vocabulary).

An example of the response JSON payload is shown in the code block below. The JSON Schema file that can be used to validate this payload is given in Appendix ** ERROR **.

Code 5.14.3 - JSON payload example for "400, 401, 403, 404, default" response messages for a "replaceClr" operation.
    {
        "imsx_codeMajor" : "success"|"failure"|"processing"|"unsupported",
        "imsx_severity" : "status"|"warning"|"error",
        "imsx_description" : "..String..",
        "imsx_codeMinor" : {
            "imsx_codeMinorField" : [
                {
                    "imsx_codeMinorFieldName" : "..NormalizedString..",
                    "imsx_codeMinorFieldValue" : "forbidden"|"fullsuccess"|"internal_server_error"|"invalid_data"|"invalid_query_parameter"|"server_busy"|"unauthorizedrequest"
                },
                {...},
                {...}
            ]
        }
    }
                        

toc | top

6. Service OpenAPI Description

This Section is NORMATIVE

6.1 General Information

The set of General Information defined in the OpenAPI description, and realised in both the JSON and YAML instances, are listed in Tables 6.1a (version 2) and 6.1b (version 3). The syntax and semantics for this information are described in Appendix A2.1.

Table 6.1a - The Set of General Information Defined in the OpenAPI(2) Description.
Swagger Version 2.0
Specification Title Comprehensive Learner Record Service
Specification Version 1.0
Description The Comprehensive Learner Record Service enables the exchange of data about users and their achievements between a Comprehensive Learner Record Service Provider and the consumers of the associated data. This service has been described using the IMS Model Driven Specification development approach, this being the Platform Specific Model (PSM) of the service.
Terms of Service Permission is granted to all parties to use excerpts from this document as needed in producing requests for proposals. The limited permissions granted above are perpetual and will not be revoked by IMS or its successors or assigns. THIS API DEFINITION IS BEING OFFERED WITHOUT ANY WARRANTY WHATSOEVER, AND IN PARTICULAR, ANY WARRANTY OF NONINFRINGEMENT IS EXPRESSLY DISCLAIMED. ANY USE OF THIS SPECIFICATION SHALL BE MADE ENTIRELY AT THE IMPLEMENTERS OWN RISK, AND NEITHER THE CONSORTIUM, NOR ANY OF ITS MEMBERS OR SUBMITTERS, SHALL HAVE ANY LIABILITY WHATSOEVER TO ANY IMPLEMENTER OR THIRD PARTY FOR ANY DAMAGES OF ANY NATURE WHATSOEVER, DIRECTLY OR INDIRECTLY, ARISING FROM THE USE OF THIS API DEFINITION.
Contact Lisa Mattson (COO), IMS Global (http://www.imsglobal.org). Email: lmattson@imsglobal.org.
License IMS Global - https://www.imsglobal.org/license.html
Host www.imsglobal.org
Base Path /ims/clr/v1p0/
Schemes http, https
Consumes application/json
Produces application/json

Table 6.1b - The Set of General Information Defined in the OpenAPI(3) Description.
OpenAPI Version 3.0.0
Specification Title Comprehensive Learner Record Service
Specification Version 1.0
Description The Comprehensive Learner Record Service enables the exchange of data about users and their achievements between a Comprehensive Learner Record Service Provider and the consumers of the associated data. This service has been described using the IMS Model Driven Specification development approach, this being the Platform Specific Model (PSM) of the service.
Terms of Service https://www.imsglobal.org/license.html
Contact Lisa Mattson (COO), IMS Global (http://www.imsglobal.org). Email: lmattson@imsglobal.org.
License IMS Global - https://www.imsglobal.org/license.html
Servers www.imsglobal.org/ims/clr/v1p0/

6.2 Tags Information

The set of Tags defined in the OpenAPI description, and realised in both the JSON and YAML instances, is listed in Table 6.2. The syntax and semantics for these Tags are described in Appendix A2.2.

Table 6.2 - The Set of Tags Defined in the OpenAPI Description.
Tag Name Description
AssertionsManager The set of service operations that manage access to Assertions. The set of endpoints assigned to this tag are:
ClrsManager The set of service operations that manage access to CLRs. The set of endpoints assigned to this tag are:
DiscoveryManager The set of service operations that manage access to the DiscoveryDocument. The set of endpoints assigned to this tag are:
EndorsementsManager The set of service operations that manage access to Endorsements. The set of endpoints assigned to this tag are:
KeysManager The set of service operations that manage access to CryptographicKeys. The set of endpoints assigned to this tag are:

6.3 Security Information

The OAuth 2 security mode is used for this service. Table 6.3 describes the OpenAPI information for the configuration of the OAuth 2.0. The syntax and semantics for this information are described in Appendix A2.3.

Table 6.3 - The Set of OAuth 2.0 Security Information Defined in the OpenAPI Description.
Security Label OAuth2CCG
Type oauth2
Description OAuth 2.0 Client Credentials authorization per IMS Security Framework.
Flow application
Token URL /token
Scopes
  • https://purl.imsglobal.org/spec/clr/v1p0/scope/delete
  • https://purl.imsglobal.org/spec/clr/v1p0/scope/readonly
  • https://purl.imsglobal.org/spec/clr/v1p0/scope/replace
Global Scope OAuth2CCG : [ https://purl.imsglobal.org/spec/clr/v1p0/scope/delete, https://purl.imsglobal.org/spec/clr/v1p0/scope/readonly, https://purl.imsglobal.org/spec/clr/v1p0/scope/replace ]

6.4 Paths Information

The following Tables describe the OpenAPI information for each of the Paths. The syntax and semantics for these Paths are described in Appendix A2.4.

6.4.1 "/assertions/{id}" Path

The following Table describes the OpenAPI information for the HTTP Verb "GET" on the "/assertions/{id}" Path.

Table 6.4.1a - The Path Details for the 'GET' verb with the '/assertions/{id}' Path.
HTTP Verb: GET
Operation ID getAssertion
Summary The REST "read" request message for the "getAssertion()" API call.
Tags AssertionsManager
Scopes The are no scopes covering access to this endpoint.
Description Returns the current version of the specified Assertion. This operation is used to verify a Hosted Assertion.
Path Placeholders
  • {id} - the unique identifier of the Assertion.
Query Parameters Query parameters are not permitted.
Responses
Name Type Description
200 AssertionDType 'OK' - the resource is returned in the payload.
404 N/A 'Not Found' – there is no resource behind the URI.
default N/A The request was not completed successfully.

6.4.2 "/clrs" Path

The following Table describes the OpenAPI information for the HTTP Verb "GET" on the "/clrs" Path.

Table 6.4.2a - The Path Details for the 'GET' verb with the '/clrs' Path.
HTTP Verb: GET
Operation ID getClrs
Summary The REST "read" request message for the "getClrs()" API call.
Tags ClrsManager
Scopes The scopes that enable access to this endpoint are:
  • https://purl.imsglobal.org/spec/clr/v1p0/scope/readonly
Description The set of CLRs the user is authorized to access are returned in the payload of the response message.
Path Placeholders Path placeholders are not permitted.
Query Parameters
Name Type Multiplicity Default
limit Positive Integer [0..1] 100
offset Non-negative Integer [0..1] -
since Date/Time (ISO 8601) [0..1] -
Responses
Name Type Description
200 CLRSetDType 'OK' - the resource is returned in the payload.
400 imsx_StatusInfoDType 'Bad Request' – the request was invalid or cannot be served. The exact error should be explained in the error payload.
401 imsx_StatusInfoDType 'Unauthorized' – the request requires an user authentication.
403 imsx_StatusInfoDType 'Forbidden' – the server understood the request, but is refusing it or the access is not allowed.
404 imsx_StatusInfoDType 'Not Found' – there are no resources behind the URI.
default imsx_StatusInfoDType The request was not completed successfully. The exact error should be explained in the error payload.

The following Table describes the OpenAPI information for the HTTP Verb "POST" on the "/clrs" Path.

Table 6.4.2b - The Path Details for the 'POST' verb with the '/clrs' Path.
HTTP Verb: POST
Operation ID replaceClr
Summary The REST "createbp" request message for the "replaceClr()" API call.
Tags ClrsManager
Scopes The scopes that enable access to this endpoint are:
  • https://purl.imsglobal.org/spec/clr/v1p0/scope/replace
Description Create or replace a CLR.
Path Placeholders Path placeholders are not permitted.
Query Parameters Query parameters are not permitted.
Responses
Name Type Description
200 CLRDType 'OK' – the resource was successfully replaced.
201 CLRDType 'Created` – the resource was successfully created.
304 N/A 'Not Modified' – the client can use cached data.
400 imsx_StatusInfoDType 'Bad Request' – the request was invalid or cannot be served. The exact error should be explained in the error payload.
401 imsx_StatusInfoDType 'Unauthorized' – the request requires user authentication.
403 imsx_StatusInfoDType 'Forbidden' – the server understood the request, but is refusing it or the access is not allowed.
404 imsx_StatusInfoDType 'Not Found' – there is no resource behind the URI.
default imsx_StatusInfoDType The request was not completed successfully. The exact error should be explained in the error payload.

6.4.3 "/clrs/{id}" Path

The following Table describes the OpenAPI information for the HTTP Verb "DELETE" on the "/clrs/{id}" Path.

Table 6.4.3a - The Path Details for the 'DELETE' verb with the '/clrs/{id}' Path.
HTTP Verb: DELETE
Operation ID deleteClr
Summary The REST "delete" request message for the "deleteClr()" API call.
Tags ClrsManager
Scopes The scopes that enable access to this endpoint are:
  • https://purl.imsglobal.org/spec/clr/v1p0/scope/delete
Description Delete a CLR.
Path Placeholders
  • {id} - the unique identifier of the CLR to delete.
Query Parameters Query parameters are not permitted.
Responses
Name Type Description
204 N/A 'No Content' – The resource was successfully deleted.
400 imsx_StatusInfoDType 'Bad Request' – The request was invalid or cannot be served. The exact error should be explained in the error payload.
401 imsx_StatusInfoDType 'Unauthorized' – The request requires an user authentication.
403 imsx_StatusInfoDType 'Forbidden' – The server understood the request, but is refusing it or the access is not allowed.
404 imsx_StatusInfoDType 'Not found' – There is no resource behind the URI.
default imsx_StatusInfoDType The request was not completed successfully. The exact error should be explained in the error payload.

6.4.4 "/discovery" Path

The following Table describes the OpenAPI information for the HTTP Verb "GET" on the "/discovery" Path.

Table 6.4.4a - The Path Details for the 'GET' verb with the '/discovery' Path.
HTTP Verb: GET
Operation ID getDiscoveryDocument
Summary The REST "read" request message for the "getDiscoveryDocument()" API call.
Tags DiscoveryManager
Scopes The are no scopes covering access to this endpoint.
Description Returns the DiscoveryDocument if the provider supports dynamic CLR consumer registration.
Path Placeholders Path placeholders are not permitted.
Query Parameters Query parameters are not permitted.
Responses
Name Type Description
200 DiscoveryDocumentDType 'OK' - the resource is returned in the payload.
404 N/A 'Not Found' – there is no resource behind the URI.
421 N/A 'Misdirected Request' - the request was not made over secure TLS 1.2 or 1.3 protocol.
default N/A The request was not completed successfully.

6.4.5 "/endorsements/{id}" Path

The following Table describes the OpenAPI information for the HTTP Verb "GET" on the "/endorsements/{id}" Path.

Table 6.4.5a - The Path Details for the 'GET' verb with the '/endorsements/{id}' Path.
HTTP Verb: GET
Operation ID getEndorsement
Summary The REST "read" request message for the "getEndorsement()" API call.
Tags EndorsementsManager
Scopes The are no scopes covering access to this endpoint.
Description Returns the current version of the specified Endorsement. This operation is used to verify a Hosted Endorsements
Path Placeholders
  • {id} - the unique identifier of the Endorsement
Query Parameters Query parameters are not permitted.
Responses
Name Type Description
200 EndorsementDType 'OK' - the resource is returned in the payload.
404 N/A 'Not Found' – there is no resource behind the URI.
default N/A The request was not completed successfully.

6.4.6 "/keys/{id}" Path

The following Table describes the OpenAPI information for the HTTP Verb "GET" on the "/keys/{id}" Path.

Table 6.4.6a - The Path Details for the 'GET' verb with the '/keys/{id}' Path.
HTTP Verb: GET
Operation ID getKey
Summary The REST "read" request message for the "getKey()" API call.
Tags KeysManager
Scopes The are no scopes covering access to this endpoint.
Description Returns the current version of the specified CryptographicKey. This operation is used to help verify a Signed Assertion.
Path Placeholders
  • {id} - the unique identifier of the CryptographicKey.
Query Parameters Query parameters are not permitted.
Responses
Name Type Description
200 CryptographicKeyDType 'OK' - the resource is returned in the payload.
404 N/A 'Not Found' – there is no resource behind the URI.
default N/A The request was not completed successfully.

6.5 Definitions Information

The following Tables describe the OpenAPI information for each of the JSON Schema Definitions. The syntax and semantics for these JSON Schema Definition descriptions are described in Appendix A2.5.

6.5.1 "AchievementDType" Definition

The OpenAPI JSON Schema description for the "AchievementDType" Complex Type is given in Table 6.5.1.

Table 6.5.1 - OpenAPI JSON Schema description for the "AchievementDType" Complex Type.
Annotations An accomplishment such as completing a degree, mastering a competency, or course completion that may be asserted about one or more learners.
Diagram To be supplied in a later release of this document
Model id{1..1} ! type{1..1} ! alignments{0..*} ! creditsAvailable{0..1} ! description{0..1} ! endorsements{0..*} ! humanCode{0..1} ! name{1..1} ! fieldOfStudy{0..1} ! image{0..1} ! issuer{1..1} ! level{0..1} ! requirement{0..1} ! resultDescriptions{0..*} ! specialization{0..1} ! tags{0..*} ! typeLabel{1..1} ! { Namespace Extension }
Source
    "AchievementDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "...",
                "type" : "string",
                "enum" : [ "Achievement","BadgeClass","CASECompetencyStatement","CTDLCredential","IMSAssessmentResult","PESCTranscript" ]
            },
            "alignments" : {
                "description" : "...",
                "type" : "array",
                "minItems" : 0,
                "items" : {
                    "$ref" : "#/definitions/AlignmentDType"
                }
            },
            "creditsAvailable" : {
                "description" : "Model Primitive Datatype = Float. ",
                "type" : "number",
                "format" : "float"
            },
            "description" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "endorsements" : {
                "description" : "...",
                "type" : "array",
                "minItems" : 0,
                "items" : {
                    "$ref" : "#/definitions/EndorsementBaseDType"
                }
            },
            "humanCode" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "name" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "fieldOfStudy" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "image" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "issuer" : {
                "$ref" : "#/definitions/ProfileDType"
            },
            "level" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "requirement" : {
                "$ref" : "#/definitions/CriteriaDType"
            },
            "resultDescriptions" : {
                "description" : "...",
                "type" : "array",
                "minItems" : 0,
                "items" : {
                    "$ref" : "#/definitions/ResultDescriptionDType"
                }
            },
            "specialization" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "tags" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "array",
                "minItems" : 0,
                "items" : {
                    "type" : "string"
                }
            },
            "typeLabel" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
        },
        "required" : [ "id","type","name","issuer","typeLabel" ],
        "additionalProperties" : true
    },
                        

6.5.2 "AddressDType" Definition

The OpenAPI JSON Schema description for the "AddressDType" Complex Type is given in Table 6.5.2.

Table 6.5.2 - OpenAPI JSON Schema description for the "AddressDType" Complex Type.
Annotations Based on schema.org Address object.
Diagram To be supplied in a later release of this document
Model id{0..1} ! type{0..1} ! addressCountry{0..1} ! addressLocality{0..1} ! addressRegion{0..1} ! postalCode{0..1} ! postOfficeBoxNumber{0..1} ! streetAddress{0..1}
Source
    "AddressDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "addressCountry" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "addressLocality" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "addressRegion" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "postalCode" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "postOfficeBoxNumber" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "streetAddress" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
        },
        "additionalProperties" : false
    },
                        

6.5.3 "AlignmentDType" Definition

The OpenAPI JSON Schema description for the "AlignmentDType" Complex Type is given in Table 6.5.3.

Table 6.5.3 - OpenAPI JSON Schema description for the "AlignmentDType" Complex Type.
Annotations Alignment is based on schema.org’s AlignmentObject and uses IRIs from that vocabulary.
Diagram To be supplied in a later release of this document
Model id{0..1} ! type{0..1} ! educationalFramework{0..1} ! targetCode{0..1} ! targetDescription{0..1} ! targetName{1..1} ! targetUrl{1..1}
Source
    "AlignmentDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "educationalFramework" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "targetCode" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "targetDescription" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "targetName" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "targetUrl" : {
                "description" : "Model Primitive Datatype = AnyURI. ",
                "type" : "string",
                "format" : "uri"
            },
        },
        "required" : [ "targetName","targetUrl" ],
        "additionalProperties" : false
    },
                        

6.5.4 "ArtifactDType" Definition

The OpenAPI JSON Schema description for the "ArtifactDType" Complex Type is given in Table 6.5.4.

Table 6.5.4 - OpenAPI JSON Schema description for the "ArtifactDType" Complex Type.
Annotations An artifact that is part of an evidence object.
Diagram To be supplied in a later release of this document
Model type{0..1} ! description{0..1} ! name{1..1} ! url{0..1}
Source
    "ArtifactDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "type" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "description" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "name" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "url" : {
                "description" : "Model Primitive Datatype = AnyURI. ",
                "type" : "string",
                "format" : "uri"
            },
        },
        "required" : [ "name" ],
        "additionalProperties" : false
    },
                        

6.5.5 "AssertionDType" Definition

The OpenAPI JSON Schema description for the "AssertionDType" Complex Type is given in Table 6.5.5.

Table 6.5.5 - OpenAPI JSON Schema description for the "AssertionDType" Complex Type.
Annotations Assertions are representations of an Achievement awarded to a Learner. It is used to share information about the Achievement Assertion, such as a result and verification method. Assertions are packaged for transmission as JSON objects with a set of mandatory and optional properties.
Diagram To be supplied in a later release of this document
Model id{1..1} ! type{1..1} ! achievement{0..1} ! creditsEarned{0..1} ! endDate{0..1} ! endorsements{0..*} ! evidence{0..*} ! image{0..1} ! issuedOn{0..1} ! licenseNumber{0..1} ! narrative{0..1} ! recipient{0..1} ! results{0..*} ! revocationReason{0..1} ! revoked{0..1} ! role{0..1} ! startDate{0..1} ! term{0..1} ! verification{0..1} ! { Namespace Extension }
Source
    "AssertionDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "achievement" : {
                "$ref" : "#/definitions/AchievementDType"
            },
            "creditsEarned" : {
                "description" : "Model Primitive Datatype = Float. ",
                "type" : "number",
                "format" : "float"
            },
            "endDate" : {
                "description" : "Model Primitive Datatype = DateTime. ",
                "type" : "string",
                "format" : "date-time"
            },
            "endorsements" : {
                "description" : "...",
                "type" : "array",
                "minItems" : 0,
                "items" : {
                    "$ref" : "#/definitions/EndorsementBaseDType"
                }
            },
            "evidence" : {
                "description" : "...",
                "type" : "array",
                "minItems" : 0,
                "items" : {
                    "$ref" : "#/definitions/EvidenceDType"
                }
            },
            "image" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "issuedOn" : {
                "description" : "Model Primitive Datatype = DateTime. ",
                "type" : "string",
                "format" : "date-time"
            },
            "licenseNumber" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "narrative" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "recipient" : {
                "$ref" : "#/definitions/IdentityDType"
            },
            "results" : {
                "description" : "...",
                "type" : "array",
                "minItems" : 0,
                "items" : {
                    "$ref" : "#/definitions/ResultDType"
                }
            },
            "revocationReason" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "revoked" : {
                "description" : "Model Primitive Datatype = Boolean. ",
                "type" : "boolean"
            },
            "role" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "startDate" : {
                "description" : "Model Primitive Datatype = DateTime. ",
                "type" : "string",
                "format" : "date-time"
            },
            "term" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "verification" : {
                "$ref" : "#/definitions/VerificationDType"
            },
        },
        "required" : [ "id","type" ],
        "additionalProperties" : true
    },
                        

6.5.6 "AssertionBaseDType" Definition

The OpenAPI JSON Schema description for the "AssertionBaseDType" Complex Type is given in Table 6.5.6.

Table 6.5.6 - OpenAPI JSON Schema description for the "AssertionBaseDType" Complex Type.
Annotations Base class for the two types of assertion objects: Assertion and SignedAssertion.
Diagram To be supplied in a later release of this document
Model id{0..1} ! type{1..1} ! { Namespace Extension }
Source
    "AssertionBaseDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "...",
                "type" : "string",
                "enum" : [ "Assertion","SignedAssertion","SignedBadge" ]
            },
        },
        "required" : [ "type" ],
        "additionalProperties" : true
    },
                        

6.5.7 "AssociationDType" Definition

The OpenAPI JSON Schema description for the "AssociationDType" Complex Type is given in Table 6.5.7.

Table 6.5.7 - OpenAPI JSON Schema description for the "AssociationDType" Complex Type.
Annotations Association is based on the CASE CFAssociation object. An Association associates (relates) one Achievement with another Achievement.
Diagram To be supplied in a later release of this document
Model id{0..1} ! type{0..1} ! associationType{1..1} ! identifier{0..1} ! lastChangeDateTime{0..1} ! sequenceNumber{0..1} ! sourceId{1..1} ! targetId{1..1}
Source
    "AssociationDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "associationType" : {
                "description" : "...",
                "type" : "string",
                "enum" : [ "exactMatchOf","exemplar","hasSkillLevel","isChildOf","isPartOf","isPeerOf","isRelatedTo","precedes","replacedBy" ]
            },
            "identifier" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string",
                "pattern" : "[0-9a-f]{8}-[0-9a-f]{4}-[1-5]{1}[0-9a-f]{3}-[8-9a-b]{1}[0-9a-f]{3}-[0-9a-f]{12}"
            },
            "lastChangeDateTime" : {
                "description" : "Model Primitive Datatype = DateTime. ",
                "type" : "string",
                "format" : "date-time"
            },
            "sequenceNumber" : {
                "description" : "Model Primitive Datatype = Integer. ",
                "type" : "integer",
                "format" : "int32"
            },
            "sourceId" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "targetId" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
        },
        "required" : [ "associationType","sourceId","targetId" ],
        "additionalProperties" : false
    },
                        

6.5.8 "CLRDType" Definition

The OpenAPI JSON Schema description for the "CLRDType" Complex Type is given in Table 6.5.8.

Table 6.5.8 - OpenAPI JSON Schema description for the "CLRDType" Complex Type.
Annotations A collection of assertions for a single person reported by a single publisher.
Diagram To be supplied in a later release of this document
Model id{1..1} ! type{0..1} ! assertions{1..*} ! associations{0..*} ! issuedOn{1..1} ! learner{1..1} ! publisher{1..1}
Source
    "CLRDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "assertions" : {
                "description" : "...",
                "type" : "array",
                "minItems" : 1,
                "items" : {
                    "$ref" : "#/definitions/AssertionBaseDType"
                }
            },
            "associations" : {
                "description" : "...",
                "type" : "array",
                "minItems" : 0,
                "items" : {
                    "$ref" : "#/definitions/AssociationDType"
                }
            },
            "issuedOn" : {
                "description" : "Model Primitive Datatype = DateTime. ",
                "type" : "string",
                "format" : "date-time"
            },
            "learner" : {
                "$ref" : "#/definitions/ProfileDType"
            },
            "publisher" : {
                "$ref" : "#/definitions/ProfileDType"
            },
        },
        "required" : [ "id","assertions","issuedOn","learner","publisher" ],
        "additionalProperties" : false
    },
                        

6.5.9 "CLRSetDType" Definition

The OpenAPI JSON Schema description for the "CLRSetDType" Complex Type is given in Table 6.5.9.

Table 6.5.9 - OpenAPI JSON Schema description for the "CLRSetDType" Complex Type.
Annotations A set of CLRs.
Diagram To be supplied in a later release of this document
Model id{0..1} ! type{0..1} ! clrs{0..*}
Source
    "CLRSetDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "clrs" : {
                "description" : "...",
                "type" : "array",
                "minItems" : 0,
                "items" : {
                    "$ref" : "#/definitions/CLRDType"
                }
            },
        },
        "additionalProperties" : false
    },
                        

6.5.10 "CriteriaDType" Definition

The OpenAPI JSON Schema description for the "CriteriaDType" Complex Type is given in Table 6.5.10.

Table 6.5.10 - OpenAPI JSON Schema description for the "CriteriaDType" Complex Type.
Annotations Descriptive metadata about the achievements necessary to be recognized with an Assertion of a particular AchievementType. This data is added to the AchievementType so that it may be rendered when that AchievementType is displayed, instead of simply a link to human-readable criteria external to the Achievement Assertion. Embedding criteria allows either enhancement of an external criteria page or increased portability and ease of use by allowing issuers to skip hosting the formerly-required external criteria page altogether.
Diagram To be supplied in a later release of this document
Model id{1..1} ! type{0..1} ! narrative{0..1} ! { Namespace Extension }
Source
    "CriteriaDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "narrative" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
        },
        "required" : [ "id" ],
        "additionalProperties" : true
    },
                        

6.5.11 "CryptographicKeyDType" Definition

The OpenAPI JSON Schema description for the "CryptographicKeyDType" Complex Type is given in Table 6.5.11.

Table 6.5.11 - OpenAPI JSON Schema description for the "CryptographicKeyDType" Complex Type.
Annotations Based on the Key class from the W3C Web Payments Community Group Security Vocabulary. A CryptographicKey document identifies and describes a public key used to verify signed Assertions.
Diagram To be supplied in a later release of this document
Model id{1..1} ! type{0..1} ! owner{0..1} ! publicKeyPem{0..1}
Source
    "CryptographicKeyDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "owner" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "publicKeyPem" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
        },
        "required" : [ "id" ],
        "additionalProperties" : false
    },
                        

6.5.12 "DiscoveryDocumentDType" Definition

The OpenAPI JSON Schema description for the "DiscoveryDocumentDType" Complex Type is given in Table 6.5.12.

Table 6.5.12 - OpenAPI JSON Schema description for the "DiscoveryDocumentDType" Complex Type.
Annotations Configuration information about the provider implementation.
Diagram To be supplied in a later release of this document
Model authorizationUrl{1..1} ! image{0..1} ! name{1..1} ! privacyPolicyUrl{1..1} ! registrationUrl{1..1} ! scopesOffered{1..*} ! termsOfServiceUrl{1..1} ! tokenUrl{1..1}
Source
    "DiscoveryDocumentDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "authorizationUrl" : {
                "description" : "Model Primitive Datatype = AnyURI. ",
                "type" : "string",
                "format" : "uri"
            },
            "image" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "name" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "privacyPolicyUrl" : {
                "description" : "Model Primitive Datatype = AnyURI. ",
                "type" : "string",
                "format" : "uri"
            },
            "registrationUrl" : {
                "description" : "Model Primitive Datatype = AnyURI. ",
                "type" : "string",
                "format" : "uri"
            },
            "scopesOffered" : {
                "description" : "Model Primitive Datatype = AnyURI. ",
                "type" : "array",
                "minItems" : 1,
                "items" : {
                    "type" : "string",
                    "format" : "uri"
                }
            },
            "termsOfServiceUrl" : {
                "description" : "Model Primitive Datatype = AnyURI. ",
                "type" : "string",
                "format" : "uri"
            },
            "tokenUrl" : {
                "description" : "Model Primitive Datatype = AnyURI. ",
                "type" : "string",
                "format" : "uri"
            },
        },
        "required" : [ "authorizationUrl","name","privacyPolicyUrl","registrationUrl","scopesOffered","termsOfServiceUrl","tokenUrl" ],
        "additionalProperties" : false
    },
                        

6.5.13 "EndorsementDType" Definition

The OpenAPI JSON Schema description for the "EndorsementDType" Complex Type is given in Table 6.5.13.

Table 6.5.13 - OpenAPI JSON Schema description for the "EndorsementDType" Complex Type.
Annotations An endorsement claim.
Diagram To be supplied in a later release of this document
Model id{1..1} ! type{1..1} ! claim{0..1} ! issuedOn{1..1} ! issuer{1..1} ! verification{0..1}
Source
    "EndorsementDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "claim" : {
                "$ref" : "#/definitions/EndorsementClaimDType"
            },
            "issuedOn" : {
                "description" : "Model Primitive Datatype = DateTime. ",
                "type" : "string",
                "format" : "date-time"
            },
            "issuer" : {
                "$ref" : "#/definitions/EndorsementProfileDType"
            },
            "verification" : {
                "$ref" : "#/definitions/VerificationDType"
            },
        },
        "required" : [ "id","type","issuedOn","issuer" ],
        "additionalProperties" : false
    },
                        

6.5.14 "EndorsementBaseDType" Definition

The OpenAPI JSON Schema description for the "EndorsementBaseDType" Complex Type is given in Table 6.5.14.

Table 6.5.14 - OpenAPI JSON Schema description for the "EndorsementBaseDType" Complex Type.
Annotations Base class for the two types of endorsement objects: Endorsement and SignedEndorsement.
Diagram To be supplied in a later release of this document
Model id{0..1} ! type{1..1} ! { Namespace Extension }
Source
    "EndorsementBaseDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "...",
                "type" : "string",
                "enum" : [ "Endorsement","SignedEndorsement" ]
            },
        },
        "required" : [ "type" ],
        "additionalProperties" : true
    },
                        

6.5.15 "EndorsementClaimDType" Definition

The OpenAPI JSON Schema description for the "EndorsementClaimDType" Complex Type is given in Table 6.5.15.

Table 6.5.15 - OpenAPI JSON Schema description for the "EndorsementClaimDType" Complex Type.
Annotations An entity, identified by an id and additional properties that the endorser would like to claim about that entity.
Diagram To be supplied in a later release of this document
Model id{1..1} ! type{0..1} ! endorsementComment{0..1} ! { Namespace Extension }
Source
    "EndorsementClaimDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "endorsementComment" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
        },
        "required" : [ "id" ],
        "additionalProperties" : true
    },
                        

6.5.16 "EndorsementProfileDType" Definition

The OpenAPI JSON Schema description for the "EndorsementProfileDType" Complex Type is given in Table 6.5.16.

Table 6.5.16 - OpenAPI JSON Schema description for the "EndorsementProfileDType" Complex Type.
Annotations A Profile is a collection of information that describes the person or organization using Comprehensive Learner Record (CLR). Publishers, learners, and issuers must be represented as profiles. Recipients, endorsers, or other entities may also be represented using this vocabulary. An EndorsementProfile cannot have endorsements.
Diagram To be supplied in a later release of this document
Model id{1..1} ! type{1..1} ! address{0..1} ! description{0..1} ! email{0..1} ! image{0..1} ! name{1..1} ! publicKey{0..1} ! revocationList{0..1} ! sourcedId{0..1} ! studentId{0..1} ! telephone{0..1} ! url{0..1} ! verification{0..1} ! { Namespace Extension }
Source
    "EndorsementProfileDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "address" : {
                "$ref" : "#/definitions/AddressDType"
            },
            "description" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "email" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "image" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "name" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "publicKey" : {
                "$ref" : "#/definitions/CryptographicKeyDType"
            },
            "revocationList" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "sourcedId" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "studentId" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "telephone" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "url" : {
                "description" : "Model Primitive Datatype = AnyURI. ",
                "type" : "string",
                "format" : "uri"
            },
            "verification" : {
                "$ref" : "#/definitions/VerificationDType"
            },
        },
        "required" : [ "id","type","name" ],
        "additionalProperties" : true
    },
                        

6.5.17 "EvidenceDType" Definition

The OpenAPI JSON Schema description for the "EvidenceDType" Complex Type is given in Table 6.5.17.

Table 6.5.17 - OpenAPI JSON Schema description for the "EvidenceDType" Complex Type.
Annotations One or more artifacts that represent supporting evidence for the record. Examples include text, media, websites, etc.
Diagram To be supplied in a later release of this document
Model id{0..1} ! type{0..1} ! artifacts{0..*} ! audience{0..1} ! description{0..1} ! genre{0..1} ! name{1..1} ! narrative{0..1}
Source
    "EvidenceDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "artifacts" : {
                "description" : "...",
                "type" : "array",
                "minItems" : 0,
                "items" : {
                    "$ref" : "#/definitions/ArtifactDType"
                }
            },
            "audience" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "description" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "genre" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "name" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "narrative" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
        },
        "required" : [ "name" ],
        "additionalProperties" : false
    },
                        

6.5.18 "IdentityDType" Definition

The OpenAPI JSON Schema description for the "IdentityDType" Complex Type is given in Table 6.5.18.

Table 6.5.18 - OpenAPI JSON Schema description for the "IdentityDType" Complex Type.
Annotations A collection of information about the recipient of an achievement assertion.
Diagram To be supplied in a later release of this document
Model id{0..1} ! type{1..1} ! identity{1..1} ! hashed{1..1} ! salt{0..1}
Source
    "IdentityDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "identity" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "hashed" : {
                "description" : "Model Primitive Datatype = Boolean. ",
                "type" : "boolean"
            },
            "salt" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
        },
        "required" : [ "type","identity","hashed" ],
        "additionalProperties" : false
    },
                        

6.5.19 "ProfileDType" Definition

The OpenAPI JSON Schema description for the "ProfileDType" Complex Type is given in Table 6.5.19.

Table 6.5.19 - OpenAPI JSON Schema description for the "ProfileDType" Complex Type.
Annotations A Profile is a collection of information that describes the person or organization using Comprehensive Learner Record (CLR). Publishers, learners, and issuers must be represented as profiles. Recipients, endorsers, or other entities may also be represented using this vocabulary.
Diagram To be supplied in a later release of this document
Model id{1..1} ! type{0..1} ! address{0..1} ! description{0..1} ! email{0..1} ! endorsements{0..*} ! image{0..1} ! name{1..1} ! publicKey{0..1} ! revocationList{0..1} ! sourcedId{0..1} ! studentId{0..1} ! telephone{0..1} ! url{0..1} ! verification{0..1} ! { Namespace Extension }
Source
    "ProfileDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "address" : {
                "$ref" : "#/definitions/AddressDType"
            },
            "description" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "email" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "endorsements" : {
                "description" : "...",
                "type" : "array",
                "minItems" : 0,
                "items" : {
                    "$ref" : "#/definitions/EndorsementBaseDType"
                }
            },
            "image" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "name" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "publicKey" : {
                "$ref" : "#/definitions/CryptographicKeyDType"
            },
            "revocationList" : {
                "$ref" : "#/definitions/RevocationListDType"
            },
            "sourcedId" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "studentId" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "telephone" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "url" : {
                "description" : "Model Primitive Datatype = AnyURI. ",
                "type" : "string",
                "format" : "uri"
            },
            "verification" : {
                "$ref" : "#/definitions/VerificationDType"
            },
        },
        "required" : [ "id","name" ],
        "additionalProperties" : true
    },
                        

6.5.20 "ResultDType" Definition

The OpenAPI JSON Schema description for the "ResultDType" Complex Type is given in Table 6.5.20.

Table 6.5.20 - OpenAPI JSON Schema description for the "ResultDType" Complex Type.
Annotations Describes a result of an achievement.
Diagram To be supplied in a later release of this document
Model id{0..1} ! type{1..1} ! name{0..1} ! value{1..1}
Source
    "ResultDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "...",
                "type" : "string",
                "enum" : [ "GradePointAverage","LetterGrade","Percent","PerformanceLevel","PredictedScore","Result","RawScore","RubricScore","ScaledScore" ]
            },
            "name" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "value" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
        },
        "required" : [ "type","value" ],
        "additionalProperties" : false
    },
                        

6.5.21 "ResultDescriptionDType" Definition

The OpenAPI JSON Schema description for the "ResultDescriptionDType" Complex Type is given in Table 6.5.21.

Table 6.5.21 - OpenAPI JSON Schema description for the "ResultDescriptionDType" Complex Type.
Annotations Describes a possible achievement result.
Diagram To be supplied in a later release of this document
Model id{0..1} ! type{1..1} ! name{0..1} ! resultMin{0..1} ! resultMax{0..1}
Source
    "ResultDescriptionDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "...",
                "type" : "string",
                "enum" : [ "GradePointAverage","LetterGrade","Percent","PerformanceLevel","PredictedScore","Result","RawScore","RubricScore","ScaledScore" ]
            },
            "name" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "resultMin" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "resultMax" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
        },
        "required" : [ "type" ],
        "additionalProperties" : false
    },
                        

6.5.22 "RevocationListDType" Definition

The OpenAPI JSON Schema description for the "RevocationListDType" Complex Type is given in Table 6.5.22.

Table 6.5.22 - OpenAPI JSON Schema description for the "RevocationListDType" Complex Type.
Annotations The Revocation List is a document that describes Assertions an Issuer has revoked that used the signed verification method. If you find the Assertion in the revokedAssertions list, it has been revoked.
Diagram To be supplied in a later release of this document
Model id{1..1} ! type{0..1} ! issuer{0..1} ! revokedAssertions{0..*}
Source
    "RevocationListDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "issuer" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "revokedAssertions" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "array",
                "minItems" : 0,
                "items" : {
                    "type" : "string"
                }
            },
        },
        "required" : [ "id" ],
        "additionalProperties" : false
    },
                        

6.5.23 "SignedAssertionDType" Definition

The OpenAPI JSON Schema description for the "SignedAssertionDType" Complex Type is given in Table 6.5.23.

Table 6.5.23 - OpenAPI JSON Schema description for the "SignedAssertionDType" Complex Type.
Annotations A signed assertion object.
Diagram To be supplied in a later release of this document
Model id{0..1} ! type{1..1} ! compactJws{1..1}
Source
    "SignedAssertionDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "compactJws" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
        },
        "required" : [ "type","compactJws" ],
        "additionalProperties" : false
    },
                        

6.5.24 "SignedEndorsementDType" Definition

The OpenAPI JSON Schema description for the "SignedEndorsementDType" Complex Type is given in Table 6.5.24.

Table 6.5.24 - OpenAPI JSON Schema description for the "SignedEndorsementDType" Complex Type.
Annotations A signed endorsement object.
Diagram To be supplied in a later release of this document
Model id{0..1} ! type{1..1} ! compactJws{1..1}
Source
    "SignedEndorsementDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "compactJws" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
        },
        "required" : [ "type","compactJws" ],
        "additionalProperties" : false
    },
                        

6.5.25 "VerificationDType" Definition

The OpenAPI JSON Schema description for the "VerificationDType" Complex Type is given in Table 6.5.25.

Table 6.5.25 - OpenAPI JSON Schema description for the "VerificationDType" Complex Type.
Annotations A collection of information allowing an inspector to verify an Assertion.
Diagram To be supplied in a later release of this document
Model id{0..1} ! type{1..1} ! allowedOrigins{0..*} ! creator{0..1} ! startsWith{0..*} ! verificationProperty{0..1}
Source
    "VerificationDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "id" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "type" : {
                "description" : "...",
                "type" : "string",
                "enum" : [ "Hosted","HostedAssertion","Signed","SignedAssertion","Verification" ]
            },
            "allowedOrigins" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "array",
                "minItems" : 0,
                "items" : {
                    "type" : "string"
                }
            },
            "creator" : {
                "description" : "Model Primitive Datatype = AnyURI. ",
                "type" : "string",
                "format" : "uri"
            },
            "startsWith" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "array",
                "minItems" : 0,
                "items" : {
                    "type" : "string"
                }
            },
            "verificationProperty" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
        },
        "required" : [ "type" ],
        "additionalProperties" : false
    },
                        

6.5.26 "imsx_CodeMinorDType" Definition

The OpenAPI JSON Schema description for the "imsx_CodeMinorDType" Complex Type is given in Table 6.5.26.

Table 6.5.26 - OpenAPI JSON Schema description for the "imsx_CodeMinorDType" Complex Type.
Annotations This is the container for the set of code minor status codes reported in the responses from the Service Provider.
Diagram To be supplied in a later release of this document
Model imsx_codeMinorField{1..*}
Source
    "imsx_CodeMinorDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "imsx_codeMinorField" : {
                "description" : "...",
                "type" : "array",
                "minItems" : 1,
                "items" : {
                    "$ref" : "#/definitions/imsx_CodeMinorFieldDType"
                }
            },
        },
        "required" : [ "imsx_codeMinorField" ],
        "additionalProperties" : false
    },
                        

6.5.27 "imsx_CodeMinorFieldDType" Definition

The OpenAPI JSON Schema description for the "imsx_CodeMinorFieldDType" Complex Type is given in Table 6.5.27.

Table 6.5.27 - OpenAPI JSON Schema description for the "imsx_CodeMinorFieldDType" Complex Type.
Annotations This is the container for a single code minor status code.
Diagram To be supplied in a later release of this document
Model imsx_codeMinorFieldName{1..1}, imsx_codeMinorFieldValue{1..1}
Source
    "imsx_CodeMinorFieldDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "imsx_codeMinorFieldName" : {
                "description" : "Model Primitive Datatype = NormalizedString. ",
                "type" : "string"
            },
            "imsx_codeMinorFieldValue" : {
                "description" : "...",
                "type" : "string",
                "enum" : [ "forbidden","fullsuccess","internal_server_error","invalid_data","invalid_query_parameter","server_busy","unauthorizedrequest" ]
            },
        },
        "required" : [ "imsx_codeMinorFieldName","imsx_codeMinorFieldValue" ],
        "additionalProperties" : false
    },
                        

6.5.28 "imsx_StatusInfoDType" Definition

The OpenAPI JSON Schema description for the "imsx_StatusInfoDType" Complex Type is given in Table 6.5.28.

Table 6.5.28 - OpenAPI JSON Schema description for the "imsx_StatusInfoDType" Complex Type.
Annotations This is the container for the status code and associated information returned within the HTTP messages received from the Service Provider.
Diagram To be supplied in a later release of this document
Model imsx_codeMajor{1..1}, imsx_severity{1..1}, imsx_description{0..1}, imsx_codeMinor{0..1}
Source
    "imsx_StatusInfoDType" : {
        "description" : "...",
        "type" : "object",
        "properties" : {
            "imsx_codeMajor" : {
                "description" : "...",
                "type" : "string",
                "enum" : [ "success","failure","processing","unsupported" ]
            },
            "imsx_severity" : {
                "description" : "...",
                "type" : "string",
                "enum" : [ "status","warning","error" ]
            },
            "imsx_description" : {
                "description" : "Model Primitive Datatype = String. ",
                "type" : "string"
            },
            "imsx_codeMinor" : {
                "$ref" : "#/definitions/imsx_CodeMinorDType"
            },
        },
        "required" : [ "imsx_codeMajor","imsx_severity" ],
        "additionalProperties" : false
    },
                        

toc | top

7. Extending and Profiling the Service

7.1. Extending the Service

Proprietary extensions of the service are based upon two approaches:

It is NOT permitted to change the behavior of the current set of operations. Such changes MUST be supported by the creation of new operations.

7.1.1. Proprietary Operations

The definition of new operations should follow the same format as adopted herein. The new operations should be defined using a new interface type. Every operation must result in the return of a status code that describes the final state of the request on the target end system.

An example of creating such an extension is given in the accompanying implementation guide [CLR, 19c].

7.1.2. Proprietary Data Elements

The payload MAY be enriched with additional data. Any extension MUST be done by adding a new parameter to the JSON object. The key name MUST be a URI that uniquely identifies the property. The value MUST be any valid JSON data. For example, if wanting to show the extension of field "classification", with value "private" that was added/provided by "ims", the name/value pair is: "ims:classification":"private".

It is RECOMMENDED that where extensions are used, whenever possible the name/value pairs are based upon vocabulary controlled files. This eliminates a proliferation of free text equivalencies from entering the data (e.g. "Florida" vs "FL", vs "Florida, USA". In such cases either the attribute, or the value (or both) MUST be a URI that references the attribute and/or value from an appropriate vocabulary file. For example:

"http://www.nbrs.org" : "FL"

7.2. Profiling the Service

This Service can be profiled. In general, Profiling is used to:

Valid Profiles must be restrictive i.e. optional features can be removed or constraints increased but new features must not be added. A Profile of this service is made by annotating the UML supplied with the documentation for the specification.

It is strongly recommended that a profile of this specification is undertaken either by, or with the close support, of IMS Global. However, no matter who is responsible for creating the profile artefacts (documents, OpenAPI files, XSDs, etc.), it is strongly recommended that the IMS specification tools are used. This will ensure that the artefacts are consistent with the base specifications and that useful support documentation is automatically produced e.g. creation of a document that summarises the differences between the base specification and the profile. Organizations wishing to produce a profile of this specification should contact Lisa Mattson (IMS Global Chief Operations Officer) at: lmattson@imsglobal.org.

toc | top

References

[CLR, 19a] IMS Comprehensive Learner Record REST/JSON Binding Version 1.0, Jeff Bohrer (IMS Global), Andy Miller (IMS Global), IMS Global Learning Consortium, Inc., 26 August 2019, http://www.imsglobal.org/clr.
[CLR, 19b] IMS Comprehensive Learner Record Conformance and Certification Version 1.0, Jeff Bohrer (IMS Global), Dereck Haskins (IMS Global), Chris Houston (eLumen), Andy Miller (IMS Global), Greg Nadeau (PCG), IMS Global Learning Consortium, Inc., 26 August 2019, http://www.imsglobal.org/clr.
[CLR, 19c] IMS Comprehensive Learner Record Implemetation Guide Version 1.0, Jeff Bohrer (IMS Global), Chris Houston (eLumen), Greg Nadeau (PCG), IMS Global Learning Consortium, Inc., 26 August 2019, http://www.imsglobal.org/clr.
[CLR, 19d] IMS Comprehensive Learner Record Information Model Version 1.0, Jeff Bohrer (IMS Global), Andy Miller (IMS Global), IMS Global Learning Consortium, Inc., 26 August 2019, http://imsglobal.org/clr.
[I-BAT, 06] IMS Binding Auto-generation Toolkit (I-BAT), Colin Smythe, IMS Global, IMS Global Learning Consortium, Inc., July 2016.
[JSON-LD, 14a] JSON-LD 1.0, Manu Sporny, Digital Bazaar, Dave Longley, Digital Bazaar, Gregg Kellogg, Kellogg Associates, Markus Lanthaler, Graz University of Technology, Niklas Lindstrom, W3C, 16 January 2014, https://www.w3.org/TR/json-ld/.
[RFC2119] Key words for use in RFCs to Indicate Requirement Levels, S. Bradner, IETF, March 1997, https://tools.ietf.org/html/rfc2119.
[RFC2617] HTTP Authentication: Basic and Digest Access Authentication, J. Franks, P. Hallam-Baker, J. Hostetler, S. Lawrence, P. Leach, A. Luotonen, L. Stewart, IETF, June 1999, https://tools.ietf.org/html/rfc2617.
[RFC6749] The OAuth 2.0 Authorization Framework, D. Hardt, IETF, October 2012, https://tools.ietf.org/html/rfc6749.
[RFC6750] The OAuth 2.0 Authorization Framework: Bearer Token Usage, M. Jones, D. Hardt, IETF, October 2012, https://tools.ietf.org/html/rfc6750.
[RFC7591] OAuth 2.0 Dynamic Client Registration Protocol, M. Jones, J. Bradley, M. Machulak, P. Hunt, IETF, July 2015, https://tools.ietf.org/html/rfc7591.
[SECURITY FRAMEWORK, 19a] IMS Security Framework, Mark McKell, Nathan Mills, Colin Smythe, Claude Verboort, IMS Global, 15 May 2019, https://imsglobal.org/spec/security/v1p0/.

toc | top

Appendix A REST/JSON Modelling Terms

A1 REST Endpoint Description Explanations

A1.1 REST Endpoint Mapping Table Explanation

Table A1.1 provides the key to the descriptions of the mapping between a service calls and its REST endpoint URL-leaf.

Table A1.1 The key to the descriptions of the mapping between a service calls and its REST endpoint URL-leaf.
Category Definition and Usage
Service Call The name of the service call as defined in the associated Behavioral Model.
REST Endpoint The REST endpoint URL leaf that is used to complete the request URL. This value must be appended to the host server (defined by the implementation) and API Root URL and version (defined in the specification).
HTTP Verb The HTTP verb that must be used for the request message. This is enumerated as: GET, PUT, POST and DELETE. The rules of mapping are:
  • GET - request to read the identified resource from the service provider;
  • PUT - request to write the supplied resource on the service provider using the given resource identifier;
  • POST - request to write the supplied resource on the service provider and the service provider must assign the unique identifier;
  • DELETE - request to delete the identified resource.

toc | top

A1.2 Query Parameter Table Explanation

Table A1.2 provides the key to the descriptions of the query parameters that are permitted for an endpoint.

Table A1.2 The key to the descriptions of the data attribute/characteristic tables.
Category Definition and Usage
Parameter Name The name given to the query parameter being described.
Data Type This is the data-type of the parameter. The data-type can take many forms:
  • Enumeration - a list of the permitted values;
  • Primitive Data-types from:-
    • AnyTypeLax - the namespace data-type i.e. defining data from any context (this is used for allowing any form of extension);
    • AnyURI - the AnyURI data-type (absolute or relative URI);
    • Base - the base data-type for defining a base URI/URL link reference;
    • Boolean - the boolean data-type (with permitted values of "true" and "false");
    • Date - the date data-type (using the [ISO 8601] format);
    • DateTime - the date/time data-type (using the [ISO 8601] format);
    • Decimal - the decimal data-type (a variable precision number that is either positive or negative);
    • Double - the double data-type (double precision floating point number - 64bit);
    • Duration - the duration data-type (using the [ISO 8601] format)
    • Empty - the associated instance must be empty;
    • Float - the float data-type (single precision floating point number - 32bit);
    • ID - the unique identifier data-type;
    • IDREF - the reference to a previously defined unique identifier data-type (ID);
    • IDREFS - a list, whitespace separated, of references to a previously defined unique identifier data-type (ID);
    • Int - the int data-type (this is derived from the "decimal" data-type);
    • Integer - the integer data-type (using the);
    • Language - the language data-type as defined in [RFC 3066];
    • Namespace - the namespace data-type i.e. defining data from a context other than that as the default for the data model (this is used for importing other data models);
    • NamespaceLax - the namespace data-type i.e. defining data from a context other than that as the default for the data model (this is used for importing other data models but being lax on the validation);
    • NonNegativeInteger - the non-negative integer data-type (this is derived from the "integer" data-type) i.e. an integer that is zero or higher;
    • NCName - the NCName data-type (derived from the Name data-type);
    • NormalizedString - the normalized string data type (strings with line feeds, carriage returns and tab characters removed);
    • PositiveInteger - the positive integer data-type (this is derived from the "nonNegativeinteger" data-type) i.e. an integer that is one or higher;
    • String - the normalized string data type;
    • Time - the time data-type (using the [ISO 8601] format).
Value Space The range of valid values for this parameter (including any default value). If the value space is unspecified, it is not known or is not important. This value space must be defined in terms of the associated data-type.
Multiplicity A property of the parameter indicating the number of values that may be assigned to the parameter (this occurs as a comma separated list). The values of this property are expressed as a range or shorthand for a range using the notation:
  • "0..1" [optional; restricted]
  • "0..*" [optional; unrestricted]
  • "1" [mandatory; restricted]
  • "1..*" [mandatory; unrestricted]
Description Contains descriptions relating to the query parameter and its values space.

toc | top

A1.3 HTTP Codes and Handling for each Endpoint Table Explanation

Table A1.3 provides the key to the descriptions of the list of HTTP codes and handling for each endpoint.

Table A1.3 The key to the descriptions of the list of HTTP codes and handling for each endpoint.
Category Definition and Usage
REST Endpoint The REST endpoint URL leaf that is used to complete the request URL. This value must be appended to the host server (defined by the implementation) and API Root URL and version (defined in the specification).
HTTP Verb The HTTP verb that must be used for the request message. This is enumerated as: GET, PUT, POST and DELETE. The rules of mapping are:
  • GET - request to read the identified resource from the service provider;
  • PUT - request to write the supplied resource on the service provider using the given resource identifier;
  • POST - request to write the supplied resource on the service provider and the service provider must assign the unique identifier;
  • DELETE - request to delete the identified resource.
HTTP Codes and Handling The list of HTTP codes that may be returned by the service provider. A description of the cause of the HTTP code is supplied along with a link to the definition of the associated JSON payload structure that contains the detailed status information.

toc | top

A2 OpenAPI Descriptions Explanations

These definitions are with respect to the OpenAPI version 2 [OAS, 14] and version 3 [OAS, 17] specifications.

A2.1 OpenAPI General Information Table Explanation

Tables A2.1a and A2.1b provide the key to the OpenAPI(2) and OpenAPI(3) general information respectively.

Table A2.1a The key to the tabular description of the OpenAPI(2) general information.
Category Definition and Usage
Swagger Version The version of the OpenAPI/Swagger specification for this OpenAPI description (this must be set as 2.0).
Specification Title The title of the specification being described.
Specification Version The version of the specification being described.
Description A short, human readable description of the specification being described using OpenAPI.
Terms of Service The Terms of Service for the API.
Contact The contact information for the API. For the IMS OpenAPI released files this will be set as "Lisa Mattson (IMS COO)". When used for an implementation this should be changed to the actual contact person.
License The URL for the associated IMS License for the use of this OpenAPI description.
Host The host (name or ip) serving the API. For the IMS OpenAPI(2) released files this will be set as "www.imsglobal.org". When used for an implementation this should be changed to the actual host.
Base Path The base path that MUST be used in the endpoint URLs (this is relative to the host).
Schemes The set of transfer protocols that are supported using this API. This is a comma separated list.
Consumes A list of MIME types the APIs can consume. This is a comma separated list.
Produces A list of MIME types the APIs can produce. This is a comma separated list.

Table A2.1b The key to the tabular description of the OpenAPI(3) general information.
Category Definition and Usage
OpenAPI Version The version of the OpenAPI specification for this OpenAPI description (this must be set as 3.0.0).
Specification Title The title of the specification being described.
Specification Version The version of the specification being described.
Description A short, human readable description of the specification being described using OpenAPI.
Terms of Service The URL for the associated Terms of Service for the use of this OpenAPI description.
Contact The contact information for the API. For the IMS OpenAPI released files this will be set as "Lisa Mattson (IMS COO)". When used for an implementation this should be changed to the actual contact person.
License The URL for the associated IMS License for the use of this OpenAPI description.
Servers The host (name or ip) serving the API. For the IMS OpenAPI(3) released files this will be set as "www.imsglobal.org/{base-path}". When used for an implementation this should be changed to the actual host.

toc | top

A2.2 OpenAPI Tags Table Explanation

Table A2.2 provides the key to the tabular description of the OpenAPI tags information (versions 2 and 3).

Table A2.2 The key to the tabular description of the OpenAPI tags information.
Category Definition and Usage
Tag Name The title of the tag (this must be unique). The tags are derived from the set of Interfaces defined in the Behavioral Model.
Description A human readable description of the tag. This is the comment associated with the Interface in the Behavioral Model. The list of associated endpoints assigned to this tag are listed with links to the OpenAPI description of those endpoints.

toc | top

A2.3 OpenAPI Security Table Explanation

Table A2.3 provides the key to the tabular description of the OpenAPI security information.

Table A2.3 The key to the tabular description of the OpenAPI security information.
Category Definition and Usage
Security Label The label by which this mode is identified within the OpenAPI file.
Type The security mode supported. The permitted values are:
  • "basic" - use of basic authentication
  • "apikey" - use of an API key (in the header or as a query parameter)
  • "oauth2" - use of OAuth 2.0
Description A human readable description of the usage of this security scheme.
Flow The flow used by the OAuth2 security scheme. The permitted values are:
  • "implicit" - implicit grant type is used to obtain access tokens (see [RFC 6749] sub-section 4.2)
  • "password" - resource owner password credentials grant type (see [RFC 6749] sub-section 4.3)
  • "application" - client credentials grant type (see [RFC 6749] sub-section 4.4)
  • "accessCode" - authorization code grant type (see [RFC 6749] sub-section 4.1)
Token URL The token URL to be used for this flow. A value must be supplied for the "password", "application" and "accessMode" flows in OAuth 2
Scopes The set of labels by which the global scope will be identified.
Global Scope The default identification of the security mode to be applied to an endpoint.

toc | top

A2.4 OpenAPI Paths Table Explanation

Table A2.4 provides the key to the OpenAPI paths information for an HTTP Verb.

Table A2.4 The key to the tabular description of the OpenAPI paths information for an HTTP Verb.
Category Definition and Usage
Operation ID A unique identifier for the service operation. This is the name of the operation defined in the Behavioral Model.
Summary A human readable summary of the objective of the service operation.
Tags The tag which has been assigned to this operation. The tag is determined by the Interface under which the operation is defined in the Behavioral Model.
Scopes The list of scopes that MUST be used enable access to this endpoint.
Description A human readable summary of the objective of the service operation. This is derived from the associated description of the operation supplied in the Behavioral Model.
Path Placeholders The set of placeholders, and their meaning, in the URL path that will be replaced by the appropriate values in the request calls.
Query Parameters The set of query parameters that are permitted on the request calls. For each query parameter the following information is supplied:
  • Name - the name of the parameter;
  • Type - the data type for the parameter;
  • Multiplicity - the permitted multiplicity of the parameter. This takes the form of:-
    • "0..1" [optional; restricted]
    • "0..*" [optional; unrestricted] - this will normally be achieved as a comma separated list
    • "1" [mandatory; restricted]
    • "1..*" [mandatory; unrestricted] - this will normally be achieved as a comma separated list
  • Default - the default value for the parameter.
Responses The set of query responses that are permitted for the request. For each response the following information is supplied:
  • Name - the name of the response (this is either a valid HTTP code or the value "default");
  • Type - the data type for the response payload (this is linked to the corresponding OpenAPI definition). If there is no payload then this will be denoted by "N/A";
  • Description - the description of the response including any specific status code values.

toc | top

A2.5 OpenAPI Definitions Table Explanation

Table A2.5 provides the key to the OpenAPI definitions information.

Table A2.5 The key to the tabular description of the OpenAPI definitions information.
Category Definition and Usage
Annotations The definition of the complex-type as supplied in the data model definition for the associated class.
Diagram A visual representation of the definition of the complex-type. These diagrams will be supplied in later versions of the specficiation.
Type Hierachy The identification of the superclass upon which this type is based (the superclass is shown on the top line). This indicates the source of the inherited set of JSON properties (this line is only displayed when there is a type hierarchy).
Model The set of child properties. This is an ordered list of properties (as per the implied or actual sequence in the object) and accompanied by their multiplicity. In the case where the type is an enumeration or primitiveType then the value is "N/A". The value may also be "Empty" to indicate that no children are permitted. In some situations the value may be "None" denoting that there are no children defined e.g. for a base class from which other classes are derived and which may have children as part of the extension.
Source The equivalent JSON Schema (OpenAPI dialect) code for the declaration of the complex-type. This is the full declaration. See the corresponding OpenAPI documentation [OAS, 14] for the description of the permitted contents for this declaration.

toc | top

Appendix B OpenAPI Listings

B1 Comprehensive Learner Record Service OpenAPI JSON Definition Listing

B1.1 OpenAPI 2.0 JSON Listing

The OpenAPI 2 (JSON) listing (based upon [OAS, 14]) is shown below (the OpenAPI JSON is available at: https://purl.imsglobal.org/spec/clr/v1p0/schema/openapi/imsclr_v1p0.json).

{
    "swagger" : "2.0",
    "info" : {
        "version" : "1.0",
        "title" : "Comprehensive Learner Record Service OpenAPI (JSON) Definition",
        "description" : "The Comprehensive Learner Record Service enables the exchange of data about users and their achievements between a Comprehensive Learner Record Service Provider and the consumers of the associated data. This service has been described using the IMS Model Driven Specification development approach, this being the Platform Specific Model (PSM) of the service.",
        "termsOfService" : "Permission is granted to all parties to use excerpts from this document as needed in producing requests for proposals. The limited permissions granted above are perpetual and will not be revoked by IMS or its successors or assigns. THIS API DEFINITION IS BEING OFFERED WITHOUT ANY WARRANTY WHATSOEVER, AND IN PARTICULAR, ANY WARRANTY OF NONINFRINGEMENT IS EXPRESSLY DISCLAIMED. ANY USE OF THIS SPECIFICATION SHALL BE MADE ENTIRELY AT THE IMPLEMENTERS OWN RISK, AND NEITHER THE  CONSORTIUM, NOR ANY OF ITS MEMBERS OR SUBMITTERS, SHALL HAVE ANY LIABILITY WHATSOEVER TO ANY IMPLEMENTER OR THIRD PARTY FOR ANY DAMAGES OF ANY NATURE WHATSOEVER,  DIRECTLY OR INDIRECTLY, ARISING FROM THE USE OF THIS API DEFINITION.",
        "contact" : {
            "name" : "Lisa Mattson (COO), IMS Global ",
            "url" : "http://www.imsglobal.org",
            "email" : "lmattson@imsglobal.org"
        },
        "license" : {
            "name" : "IMS Global",
            "url" : "https://www.imsglobal.org/license.html"
        }
    },
    "host" : "www.imsglobal.org",
    "basePath" : "/ims/clr/v1p0/",
    "schemes" : [ "http","https" ],
    "tags" : [
        {
            "name" : "AssertionsManager",
            "description" : "The set of service operations that manage access to Assertions."
        },
        {
            "name" : "ClrsManager",
            "description" : "The set of service operations that manage access to CLRs."
        },
        {
            "name" : "DiscoveryManager",
            "description" : "The set of service operations that manage access to the DiscoveryDocument."
        },
        {
            "name" : "EndorsementsManager",
            "description" : "The set of service operations that manage access to Endorsements."
        },
        {
            "name" : "KeysManager",
            "description" : "The set of service operations that manage access to CryptographicKeys."
        }
    ],
    "securityDefinitions" : {
        "OAuth2CCG" : {
            "type" : "oauth2",
            "description" : "OAuth 2.0 Client Credentials authorization per IMS Security Framework.",
            "flow" : "application",
            "tokenUrl" : "/token",
            "scopes" : {
                "https://purl.imsglobal.org/spec/clr/v1p0/scope/delete" : "Grants the app permission to delete your comprehensive learner records on this host.",
                "https://purl.imsglobal.org/spec/clr/v1p0/scope/readonly" : "Grants the app permission to read your comprehensive learner records on this host.",
                "https://purl.imsglobal.org/spec/clr/v1p0/scope/replace" : "Grants the app permission to create or replace your comprehensive learner records on this host."
            }
        }
    },
    "paths" : {
        "/assertions/{id}" : {
            "get" : {
                "operationId" : "getAssertion",
                "summary" : "The REST read request message for the getAssertion() API call.",
                "tags" : [ "AssertionsManager" ],
                "description" : "Returns the current version of the specified Assertion. This operation is used to verify a Hosted Assertion.",
                "parameters" : [
                    {
                        "name" : "id",
                        "in" : "path",
                        "description" : "The unique identifier of the Assertion.",
                        "required" : true,
                        "type" : "string"
                    }
                ],
                "security" : [
                    {
                        "OAuth2CCG" : [

                        ]
                    }
                ],
                "responses" : {
                    "200" : {
                        "description" : "'OK' - the resource is returned in the payload.",
                        "schema" : {
                            "$ref" : "#/definitions/AssertionDType"
                        }
                    },
                    "404" : {
                        "description" : "'Not Found' – there is no resource behind the URI."
                    },
                    "default" : {
                        "description" : "The request was not completed successfully."
                    }
                }
            }
        },
        "/clrs" : {
            "get" : {
                "operationId" : "getClrs",
                "summary" : "The REST read request message for the getClrs() API call.",
                "tags" : [ "ClrsManager" ],
                "description" : "The set of CLRs the user is authorized to access are returned in the payload of the response message.",
                "parameters" : [
                    {
                        "name" : "limit",
                        "in" : "query",
                        "description" : "The number of results to return.",
                        "required" : false,
                        "type" : "integer",
                        "format" : "int32",
                        "default" : 100,
                        "minimum" : 1,
                        "allowEmptyValue" : false
                    },
                    {
                        "name" : "offset",
                        "in" : "query",
                        "description" : "The index of the first record to return. (zero indexed)",
                        "required" : false,
                        "type" : "integer",
                        "format" : "int32",
                        "minimum" : 0,
                        "allowEmptyValue" : false
                    },
                    {
                        "name" : "since",
                        "in" : "query",
                        "description" : "Retrieve CLRs that were issued after the provided timestamp. Must be an ISO 8601 compatible timestamp with a time zone indicator.",
                        "required" : false,
                        "type" : "string",
                        "format" : "date-time",
                        "allowEmptyValue" : false
                    }
                ],
                "security" : [
                    {
                        "OAuth2CCG" : [
                            "https://purl.imsglobal.org/spec/clr/v1p0/scope/readonly"
                        ]
                    }
                ],
                "responses" : {
                    "200" : {
                        "description" : "'OK' - the resource is returned in the payload.",
                        "schema" : {
                            "$ref" : "#/definitions/CLRSetDType"
                        }
                    },
                    "400" : {
                        "description" : "'Bad Request' – the request was invalid or cannot be served. The exact error should be explained in the error payload.",
                        "schema" : {
                            "$ref" : "#/definitions/imsx_StatusInfoDType"
                        }
                    },
                    "401" : {
                        "description" : "'Unauthorized' – the request requires an user authentication.",
                        "schema" : {
                            "$ref" : "#/definitions/imsx_StatusInfoDType"
                        }
                    },
                    "403" : {
                        "description" : "'Forbidden' – the server understood the request, but is refusing it or the access is not allowed.",
                        "schema" : {
                            "$ref" : "#/definitions/imsx_StatusInfoDType"
                        }
                    },
                    "404" : {
                        "description" : "'Not Found' – there are no resources behind the URI.",
                        "schema" : {
                            "$ref" : "#/definitions/imsx_StatusInfoDType"
                        }
                    },
                    "default" : {
                        "description" : "The request was not completed successfully. The exact error should be explained in the error payload.",
                        "schema" : {
                            "$ref" : "#/definitions/imsx_StatusInfoDType"
                        }
                    }
                }
            },
            "post" : {
                "operationId" : "replaceClr",
                "summary" : "The REST createbp request message for the replaceClr() API call.",
                "tags" : [ "ClrsManager" ],
                "description" : "Create or replace a CLR.",
                "parameters" : [
                    {
                        "name" : "clrIn",
                        "in" : "body",
                        "description" : "The CLR to be created or replaced.",
                        "required" : true,
                        "schema" : {
                            "$ref" : "#/definitions/CLRDType"
                        }
                    }
                ],
                "security" : [
                    {
                        "OAuth2CCG" : [
                            "https://purl.imsglobal.org/spec/clr/v1p0/scope/replace"
                        ]
                    }
                ],
                "responses" : {
                    "200" : {
                        "description" : "'OK' – the resource was successfully replaced.",
                        "schema" : {
                            "$ref" : "#/definitions/CLRDType"
                        }
                    },
                    "201" : {
                        "description" : "'Created` – the resource was successfully created.",
                        "schema" : {
                            "$ref" : "#/definitions/CLRDType"
                        }
                    },
                    "304" : {
                        "description" : "'Not Modified' – the client can use cached data."
                    },
                    "400" : {
                        "description" : "'Bad Request' – the request was invalid or cannot be served. The exact error should be explained in the error payload.",
                        "schema" : {
                            "$ref" : "#/definitions/imsx_StatusInfoDType"
                        }
                    },
                    "401" : {
                        "description" : "'Unauthorized' – the request requires user authentication.",
                        "schema" : {
                            "$ref" : "#/definitions/imsx_StatusInfoDType"
                        }
                    },
                    "403" : {
                        "description" : "'Forbidden' – the server understood the request, but is refusing it or the access is not allowed.",
                        "schema" : {
                            "$ref" : "#/definitions/imsx_StatusInfoDType"
                        }
                    },
                    "404" : {
                        "description" : "'Not Found' – there is no resource behind the URI.",
                        "schema" : {
                            "$ref" : "#/definitions/imsx_StatusInfoDType"
                        }
                    },
                    "default" : {
                        "description" : "The request was not completed successfully. The exact error should be explained in the error payload.",
                        "schema" : {
                            "$ref" : "#/definitions/imsx_StatusInfoDType"
                        }
                    }
                }
            }
        },
        "/clrs/{id}" : {
            "delete" : {
                "operationId" : "deleteClr",
                "summary" : "The REST delete request message for the deleteClr() API call.",
                "tags" : [ "ClrsManager" ],
                "description" : "Delete a CLR.",
                "parameters" : [
                    {
                        "name" : "id",
                        "in" : "path",
                        "description" : "The unique identifier of the CLR to delete.",
                        "required" : true,
                        "type" : "string"
                    }
                ],
                "security" : [
                    {
                        "OAuth2CCG" : [
                            "https://purl.imsglobal.org/spec/clr/v1p0/scope/delete"
                        ]
                    }
                ],
                "responses" : {
                    "204" : {
                        "description" : "'No Content' – The resource was successfully deleted."
                    },
                    "400" : {
                        "description" : "'Bad Request' – The request was invalid or cannot be served. The exact error should be explained in the error payload.",
                        "schema" : {
                            "$ref" : "#/definitions/imsx_StatusInfoDType"
                        }
                    },
                    "401" : {
                        "description" : "'Unauthorized' – The request requires an user authentication.",
                        "schema" : {
                            "$ref" : "#/definitions/imsx_StatusInfoDType"
                        }
                    },
                    "403" : {
                        "description" : "'Forbidden' – The server understood the request, but is refusing it or the access is not allowed.",
                        "schema" : {
                            "$ref" : "#/definitions/imsx_StatusInfoDType"
                        }
                    },
                    "404" : {
                        "description" : "'Not found' – There is no resource behind the URI.",
                        "schema" : {
                            "$ref" : "#/definitions/imsx_StatusInfoDType"
                        }
                    },
                    "default" : {
                        "description" : "The request was not completed successfully. The exact error should be explained in the error payload.",
                        "schema" : {
                            "$ref" : "#/definitions/imsx_StatusInfoDType"
                        }
                    }
                }
            }
        },
        "/discovery" : {
            "get" : {
                "operationId" : "getDiscoveryDocument",
                "summary" : "The REST read request message for the getDiscoveryDocument() API call.",
                "tags" : [ "DiscoveryManager" ],
                "description" : "Returns the DiscoveryDocument if the provider supports dynamic CLR consumer registration.",
                "security" : [
                    {
                        "OAuth2CCG" : [

                        ]
                    }
                ],
                "responses" : {
                    "200" : {
                        "description" : "'OK' - the resource is returned in the payload.",
                        "schema" : {
                            "$ref" : "#/definitions/DiscoveryDocumentDType"
                        }
                    },
                    "404" : {
                        "description" : "'Not Found' – there is no resource behind the URI."
                    },
                    "421" : {
                        "description" : "'Misdirected Request' - the request was not made over secure TLS 1.2 or 1.3 protocol."
                    },
                    "default" : {
                        "description" : "The request was not completed successfully."
                    }
                }
            }
        },
        "/endorsements/{id}" : {
            "get" : {
                "operationId" : "getEndorsement",
                "summary" : "The REST read request message for the getEndorsement() API call.",
                "tags" : [ "EndorsementsManager" ],
                "description" : "Returns the current version of the specified Endorsement. This operation is used to verify a Hosted Endorsements",
                "parameters" : [
                    {
                        "name" : "id",
                        "in" : "path",
                        "description" : "The unique identifier of the Endorsement",
                        "required" : true,
                        "type" : "string"
                    }
                ],
                "security" : [
                    {
                        "OAuth2CCG" : [

                        ]
                    }
                ],
                "responses" : {
                    "200" : {
                        "description" : "'OK' - the resource is returned in the payload.",
                        "schema" : {
                            "$ref" : "#/definitions/EndorsementDType"
                        }
                    },
                    "404" : {
                        "description" : "'Not Found' – there is no resource behind the URI."
                    },
                    "default" : {
                        "description" : "The request was not completed successfully."
                    }
                }
            }
        },
        "/keys/{id}" : {
            "get" : {
                "operationId" : "getKey",
                "summary" : "The REST read request message for the getKey() API call.",
                "tags" : [ "KeysManager" ],
                "description" : "Returns the current version of the specified CryptographicKey. This operation is used to help verify a Signed Assertion.",
                "parameters" : [
                    {
                        "name" : "id",
                        "in" : "path",
                        "description" : "The unique identifier of the CryptographicKey.",
                        "required" : true,
                        "type" : "string"
                    }
                ],
                "security" : [
                    {
                        "OAuth2CCG" : [

                        ]
                    }
                ],
                "responses" : {
                    "200" : {
                        "description" : "'OK' - the resource is returned in the payload.",
                        "schema" : {
                            "$ref" : "#/definitions/CryptographicKeyDType"
                        }
                    },
                    "404" : {
                        "description" : "'Not Found' – there is no resource behind the URI."
                    },
                    "default" : {
                        "description" : "The request was not completed successfully."
                    }
                }
            }
        }
    },
    "definitions" : {
        "AchievementDType" : {
            "description" : "An accomplishment such as completing a degree, mastering a competency, or course completion that may be asserted about one or more learners.",
            "type" : "object",
            "properties" : {
                "id" : {
                    "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the Achievement.",
                    "type" : "string"
                },
                "type" : {
                    "description" : "The JSON-LD type of this object. Normally 'Achievement'.",
                    "type" : "string",
                    "enum" : [ "Achievement","BadgeClass","CASECompetencyStatement","CTDLCredential","IMSAssessmentResult","PESCTranscript" ]
                },
                "alignments" : {
                    "description" : "Alignment objects describe an alignment between this achievement and a node in an educational framework.",
                    "type" : "array",
                    "minItems" : 0,
                    "items" : {
                        "$ref" : "#/definitions/AlignmentDType"
                    }
                },
                "creditsAvailable" : {
                    "description" : "Model Primitive Datatype = Float. Credit hours associated with this entity, or credit hours possible. For example '3.0'.",
                    "type" : "number",
                    "format" : "float"
                },
                "description" : {
                    "description" : "Model Primitive Datatype = String. A short description of the achievement. May be the same as name if no description is available.",
                    "type" : "string"
                },
                "endorsements" : {
                    "description" : "Allows endorsers to make specific claims about the Achievement.",
                    "type" : "array",
                    "minItems" : 0,
                    "items" : {
                        "$ref" : "#/definitions/EndorsementBaseDType"
                    }
                },
                "humanCode" : {
                    "description" : "Model Primitive Datatype = String. The code, generally human readable, associated with an achievement.",
                    "type" : "string"
                },
                "name" : {
                    "description" : "Model Primitive Datatype = String. The name of the achievement.",
                    "type" : "string"
                },
                "fieldOfStudy" : {
                    "description" : "Model Primitive Datatype = String. Category, subject, area of study,  discipline, or general branch of knowledge. Examples include Business, Education, Psychology, and Technology. ",
                    "type" : "string"
                },
                "image" : {
                    "description" : "Model Primitive Datatype = NormalizedString. IRI of an image representing the achievement. May be a Data URI or the URL where the image may be found.",
                    "type" : "string"
                },
                "issuer" : {
                    "$ref" : "#/definitions/ProfileDType"
                },
                "level" : {
                    "description" : "Model Primitive Datatype = String. Text that describes the level of achievement apart from how the achievement was performed or demonstrated. Examples would include 'Level 1', 'Level 2', 'Level 3', or 'Bachelors', 'Masters', 'Doctoral'.",
                    "type" : "string"
                },
                "requirement" : {
                    "$ref" : "#/definitions/CriteriaDType"
                },
                "resultDescriptions" : {
                    "description" : "The types of result that may be asserted with this achievement.",
                    "type" : "array",
                    "minItems" : 0,
                    "items" : {
                        "$ref" : "#/definitions/ResultDescriptionDType"
                    }
                },
                "specialization" : {
                    "description" : "Model Primitive Datatype = String. Name given to the focus, concentration, or specific area of study defined in the achievement. Examples include Entrepreneurship, Technical Communication, and Finance.",
                    "type" : "string"
                },
                "tags" : {
                    "description" : "Model Primitive Datatype = String. Tags that describe the type of achievement.",
                    "type" : "array",
                    "minItems" : 0,
                    "items" : {
                        "type" : "string"
                    }
                },
                "typeLabel" : {
                    "description" : "Model Primitive Datatype = String. The type of achievement matching one  from an IMS recommended taxonomy of achievement types, or any text string.",
                    "type" : "string"
                }
            },
            "required" : [ "id","type","name","issuer","typeLabel" ],
            "additionalProperties" : true
        },
        "AddressDType" : {
            "description" : "Based on schema.org Address object.",
            "type" : "object",
            "properties" : {
                "id" : {
                    "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the Address.",
                    "type" : "string"
                },
                "type" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this object. Normally 'Address'.",
                    "type" : "string"
                },
                "addressCountry" : {
                    "description" : "Model Primitive Datatype = String. The country. For example, USA. You can also provide the two-letter ISO 3166-1 alpha-2 country code.",
                    "type" : "string"
                },
                "addressLocality" : {
                    "description" : "Model Primitive Datatype = String. The locality. For example, Mountain View.",
                    "type" : "string"
                },
                "addressRegion" : {
                    "description" : "Model Primitive Datatype = String. The region. For example, CA.",
                    "type" : "string"
                },
                "postalCode" : {
                    "description" : "Model Primitive Datatype = String. The postal code. For example, 94043.",
                    "type" : "string"
                },
                "postOfficeBoxNumber" : {
                    "description" : "Model Primitive Datatype = String. The post office box number for PO box addresses.",
                    "type" : "string"
                },
                "streetAddress" : {
                    "description" : "Model Primitive Datatype = String. The street address. For example, 1600 Amphitheatre Pkwy.",
                    "type" : "string"
                }
            },
            "additionalProperties" : false
        },
        "AlignmentDType" : {
            "description" : "Alignment is based on schema.org’s AlignmentObject and uses IRIs from that vocabulary.",
            "type" : "object",
            "properties" : {
                "id" : {
                    "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the object.",
                    "type" : "string"
                },
                "type" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this entity. Normally 'Alignment'.",
                    "type" : "string"
                },
                "educationalFramework" : {
                    "description" : "Model Primitive Datatype = String. The framework to which the resource being described is aligned.",
                    "type" : "string"
                },
                "targetCode" : {
                    "description" : "Model Primitive Datatype = String. If applicable, a locally unique string identifier that identifies the alignment target within its framework.",
                    "type" : "string"
                },
                "targetDescription" : {
                    "description" : "Model Primitive Datatype = String. Short description of the alignment target.",
                    "type" : "string"
                },
                "targetName" : {
                    "description" : "Model Primitive Datatype = String. The name of a node in an established educational framework.",
                    "type" : "string"
                },
                "targetUrl" : {
                    "description" : "Model Primitive Datatype = AnyURI. The URL of a node in an established educational framework.",
                    "type" : "string",
                    "format" : "uri"
                }
            },
            "required" : [ "targetName","targetUrl" ],
            "additionalProperties" : false
        },
        "ArtifactDType" : {
            "description" : "An artifact that is part of an evidence object.",
            "type" : "object",
            "properties" : {
                "type" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of the object. Normally 'Artifact'.",
                    "type" : "string"
                },
                "description" : {
                    "description" : "Model Primitive Datatype = String. A description of the artifact.",
                    "type" : "string"
                },
                "name" : {
                    "description" : "Model Primitive Datatype = String. The name of the artifact.",
                    "type" : "string"
                },
                "url" : {
                    "description" : "Model Primitive Datatype = AnyURI. IRI of the artifact. May be a Data URI or the URL where the artifact may be found.",
                    "type" : "string",
                    "format" : "uri"
                }
            },
            "required" : [ "name" ],
            "additionalProperties" : false
        },
        "AssertionDType" : {
            "description" : "Assertions are representations of an Achievement awarded to a Learner.  It is used to share information about the Achievement Assertion, such as a result and verification method. Assertions are packaged for transmission as JSON objects with a set of mandatory and optional properties.",
            "type" : "object",
            "properties" : {
                "id" : {
                    "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the Assertion.",
                    "type" : "string"
                },
                "type" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this object. Normally 'Assertion'.",
                    "type" : "string"
                },
                "achievement" : {
                    "$ref" : "#/definitions/AchievementDType"
                },
                "creditsEarned" : {
                    "description" : "Model Primitive Datatype = Float. The number of credits earned, generally in semester or quarter credit hours.  This field correlates with the Achievement creditsAvailable field.",
                    "type" : "number",
                    "format" : "float"
                },
                "endDate" : {
                    "description" : "Model Primitive Datatype = DateTime. If present, the assertion is not valid after this date.",
                    "type" : "string",
                    "format" : "date-time"
                },
                "endorsements" : {
                    "description" : "Allows endorsers to make specific claims about the assertion.",
                    "type" : "array",
                    "minItems" : 0,
                    "items" : {
                        "$ref" : "#/definitions/EndorsementBaseDType"
                    }
                },
                "evidence" : {
                    "description" : "Evidence describing the work that the recipient did to earn the achievement. This can be a webpage that links out to other pages if linking directly to the work is infeasible.",
                    "type" : "array",
                    "minItems" : 0,
                    "items" : {
                        "$ref" : "#/definitions/EvidenceDType"
                    }
                },
                "image" : {
                    "description" : "Model Primitive Datatype = NormalizedString. IRI of an image representing the assertion. May be a Data URI or the URL where the image may be found. If the object is an Open Badges 2.0 assertion, the image is a 'Baked Image' as defined by the Open Badges 2.0 specification.",
                    "type" : "string"
                },
                "issuedOn" : {
                    "description" : "Model Primitive Datatype = DateTime. Timestamp of when the achievement was awarded. Required unless the assertion is revoked.",
                    "type" : "string",
                    "format" : "date-time"
                },
                "licenseNumber" : {
                    "description" : "Model Primitive Datatype = String. The license number that was issued with this assertion.",
                    "type" : "string"
                },
                "narrative" : {
                    "description" : "Model Primitive Datatype = String. A narrative that describes the connection between multiple pieces of evidence. Likely only present if evidence is a multi-value array. Markdown allowed.",
                    "type" : "string"
                },
                "recipient" : {
                    "$ref" : "#/definitions/IdentityDType"
                },
                "results" : {
                    "description" : "The results being asserted.",
                    "type" : "array",
                    "minItems" : 0,
                    "items" : {
                        "$ref" : "#/definitions/ResultDType"
                    }
                },
                "revocationReason" : {
                    "description" : "Model Primitive Datatype = String. Optional published reason for revocation, if revoked.",
                    "type" : "string"
                },
                "revoked" : {
                    "description" : "Model Primitive Datatype = Boolean. Defaults to false if Assertion is not referenced from a revokedAssertions list and may be omitted. See RevocationList. If revoked is true, only revoked and id are required properties, and many issuers strip a hosted Assertion down to only those properties when revoked.",
                    "type" : "boolean"
                },
                "role" : {
                    "description" : "Model Primitive Datatype = String. Role, position, or title of the learner when demonstrating or performing the achievement or evidence of learning being asserted. Examples include 'Student President', 'Intern', 'Captain', etc.",
                    "type" : "string"
                },
                "startDate" : {
                    "description" : "Model Primitive Datatype = DateTime. If present, the assertion is not valid before this date.",
                    "type" : "string",
                    "format" : "date-time"
                },
                "term" : {
                    "description" : "Model Primitive Datatype = String. The academic term in which this assertion was achieved.",
                    "type" : "string"
                },
                "verification" : {
                    "$ref" : "#/definitions/VerificationDType"
                }
            },
            "required" : [ "id","type" ],
            "additionalProperties" : true
        },
        "AssertionBaseDType" : {
            "description" : "Base class for the two types of assertion objects: Assertion and SignedAssertion.",
            "type" : "object",
            "properties" : {
                "id" : {
                    "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the object. Required if the type is Assertion.",
                    "type" : "string"
                },
                "type" : {
                    "description" : "The type of the assertion object.  Use the type to recast the object to the appropriate sub-class.",
                    "type" : "string",
                    "enum" : [ "Assertion","SignedAssertion","SignedBadge" ]
                }
            },
            "required" : [ "type" ],
            "additionalProperties" : true
        },
        "AssociationDType" : {
            "description" : "Association is based on the CASE CFAssociation object. An Association associates (relates) one Achievement with another Achievement.",
            "type" : "object",
            "properties" : {
                "id" : {
                    "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the Association.",
                    "type" : "string"
                },
                "type" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this object. Normally 'Association'.",
                    "type" : "string"
                },
                "associationType" : {
                    "description" : "The type of the relationship, used to define the alignment between two achievements.  ",
                    "type" : "string",
                    "enum" : [ "exactMatchOf","exemplar","hasSkillLevel","isChildOf","isPartOf","isPeerOf","isRelatedTo","precedes","replacedBy" ]
                },
                "identifier" : {
                    "description" : "Model Primitive Datatype = String. An unambiguous, synthetic, globally unique identifier for the Association. This is the primary way in which the exchange identification is achieved.",
                    "type" : "string",
                    "pattern" : "[0-9a-f]{8}-[0-9a-f]{4}-[1-5]{1}[0-9a-f]{3}-[8-9a-b]{1}[0-9a-f]{3}-[0-9a-f]{12}"
                },
                "lastChangeDateTime" : {
                    "description" : "Model Primitive Datatype = DateTime. A system generated timestamp of the most recent change to this association.",
                    "type" : "string",
                    "format" : "date-time"
                },
                "sequenceNumber" : {
                    "description" : "Model Primitive Datatype = Integer. This is used to order associated objects. Associations can be created through mapping rather than strict hierarchy. As such the presentation of the list cannot be ordered by the objects in the list. They may be different based on the parent being viewed.",
                    "type" : "integer",
                    "format" : "int32"
                },
                "sourceId" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The 'id' of an Achievement or source of the association.",
                    "type" : "string"
                },
                "targetId" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The 'id' of another Achievement, or target of the association.",
                    "type" : "string"
                }
            },
            "required" : [ "associationType","sourceId","targetId" ],
            "additionalProperties" : false
        },
        "CLRDType" : {
            "description" : "A collection of assertions for a single person reported by a single publisher.",
            "type" : "object",
            "properties" : {
                "id" : {
                    "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the CLR.",
                    "type" : "string"
                },
                "type" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this object. Normally 'CLR'.",
                    "type" : "string"
                },
                "assertions" : {
                    "description" : "The learner's asserted achievements.",
                    "type" : "array",
                    "minItems" : 1,
                    "items" : {
                        "$ref" : "#/definitions/AssertionBaseDType"
                    }
                },
                "associations" : {
                    "description" : "The set of achievement associations in the CLR.",
                    "type" : "array",
                    "minItems" : 0,
                    "items" : {
                        "$ref" : "#/definitions/AssociationDType"
                    }
                },
                "issuedOn" : {
                    "description" : "Model Primitive Datatype = DateTime. Timestamp of when the CLR was published.",
                    "type" : "string",
                    "format" : "date-time"
                },
                "learner" : {
                    "$ref" : "#/definitions/ProfileDType"
                },
                "publisher" : {
                    "$ref" : "#/definitions/ProfileDType"
                }
            },
            "required" : [ "id","assertions","issuedOn","learner","publisher" ],
            "additionalProperties" : false
        },
        "CLRSetDType" : {
            "description" : "A set of CLRs.",
            "type" : "object",
            "properties" : {
                "id" : {
                    "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the ClrSet.",
                    "type" : "string"
                },
                "type" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this object. Normally 'CLRSet'.",
                    "type" : "string"
                },
                "clrs" : {
                    "description" : "An unordered collection of comprehensive learner records.",
                    "type" : "array",
                    "minItems" : 0,
                    "items" : {
                        "$ref" : "#/definitions/CLRDType"
                    }
                }
            },
            "additionalProperties" : false
        },
        "CriteriaDType" : {
            "description" : "Descriptive metadata about the achievements necessary to be recognized with an Assertion of a particular AchievementType. This data is added to the AchievementType so that it may be rendered when that AchievementType is displayed, instead of simply a link to human-readable criteria external to the Achievement Assertion. Embedding criteria allows either enhancement of an external criteria page or increased portability and ease of use by allowing issuers to skip hosting the formerly-required external criteria page altogether.",
            "type" : "object",
            "properties" : {
                "id" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The URI of a webpage that describes in a human-readable format the criteria for the Achievement.",
                    "type" : "string"
                },
                "type" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this object. Normally 'Criteria'.",
                    "type" : "string"
                },
                "narrative" : {
                    "description" : "Model Primitive Datatype = String. A narrative of what is needed to earn the achievement. Markdown allowed.",
                    "type" : "string"
                }
            },
            "required" : [ "id" ],
            "additionalProperties" : true
        },
        "CryptographicKeyDType" : {
            "description" : "Based on the Key class from the W3C Web Payments Community Group Security Vocabulary. A CryptographicKey document identifies and describes a public key used to verify signed Assertions.",
            "type" : "object",
            "properties" : {
                "id" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The URI of the CryptographicKey document. Used during signed verification.",
                    "type" : "string"
                },
                "type" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this object. Normally 'CryptographicKey'.",
                    "type" : "string"
                },
                "owner" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The identifier for the Profile that owns this key.",
                    "type" : "string"
                },
                "publicKeyPem" : {
                    "description" : "Model Primitive Datatype = String. The PEM key encoding is a widely-used method to express public keys, compatible with almost every Secure Sockets Layer library implementation.",
                    "type" : "string"
                }
            },
            "required" : [ "id" ],
            "additionalProperties" : false
        },
        "DiscoveryDocumentDType" : {
            "description" : "Configuration information about the provider implementation.",
            "type" : "object",
            "properties" : {
                "authorizationUrl" : {
                    "description" : "Model Primitive Datatype = AnyURI. A fully qualifed URL to the provider's OAuth 2.0 Authorization endpoint.",
                    "type" : "string",
                    "format" : "uri"
                },
                "image" : {
                    "description" : "Model Primitive Datatype = NormalizedString. An image representing the provider. May be a Data URI or the URL where the image may be found.",
                    "type" : "string"
                },
                "name" : {
                    "description" : "Model Primitive Datatype = String. The user-facing name of the platform providing CLR services.",
                    "type" : "string"
                },
                "privacyPolicyUrl" : {
                    "description" : "Model Primitive Datatype = AnyURI. A fully qualified URL to the provider's privacy policy.",
                    "type" : "string",
                    "format" : "uri"
                },
                "registrationUrl" : {
                    "description" : "Model Primitive Datatype = AnyURI. A fully qualified URL to the provider's OAuth 2.0 Registration endpoint.",
                    "type" : "string",
                    "format" : "uri"
                },
                "scopesOffered" : {
                    "description" : "Model Primitive Datatype = AnyURI. An array of OAuth 2.0 Scopes supported by the provider.",
                    "type" : "array",
                    "minItems" : 1,
                    "items" : {
                        "type" : "string",
                        "format" : "uri"
                    }
                },
                "termsOfServiceUrl" : {
                    "description" : "Model Primitive Datatype = AnyURI. A fully qualified URL to the provider's terms of service.",
                    "type" : "string",
                    "format" : "uri"
                },
                "tokenUrl" : {
                    "description" : "Model Primitive Datatype = AnyURI. A fully qualified URL to the provider's OAuth 2.0 Token endpoint.",
                    "type" : "string",
                    "format" : "uri"
                }
            },
            "required" : [ "authorizationUrl","name","privacyPolicyUrl","registrationUrl","scopesOffered","termsOfServiceUrl","tokenUrl" ],
            "additionalProperties" : false
        },
        "EndorsementDType" : {
            "description" : "An endorsement claim.",
            "type" : "object",
            "properties" : {
                "id" : {
                    "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the Endorsement.",
                    "type" : "string"
                },
                "type" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this entity. Normally 'Endorsement'.",
                    "type" : "string"
                },
                "claim" : {
                    "$ref" : "#/definitions/EndorsementClaimDType"
                },
                "issuedOn" : {
                    "description" : "Model Primitive Datatype = DateTime. Timestamp of when the endorsement was published.",
                    "type" : "string",
                    "format" : "date-time"
                },
                "issuer" : {
                    "$ref" : "#/definitions/EndorsementProfileDType"
                },
                "verification" : {
                    "$ref" : "#/definitions/VerificationDType"
                }
            },
            "required" : [ "id","type","issuedOn","issuer" ],
            "additionalProperties" : false
        },
        "EndorsementBaseDType" : {
            "description" : "Base class for the two types of endorsement objects: Endorsement and SignedEndorsement.",
            "type" : "object",
            "properties" : {
                "id" : {
                    "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the object.",
                    "type" : "string"
                },
                "type" : {
                    "description" : "The type of the endorsement object. Use the type to recast the object to the appropriate sub-class.",
                    "type" : "string",
                    "enum" : [ "Endorsement","SignedEndorsement" ]
                }
            },
            "required" : [ "type" ],
            "additionalProperties" : true
        },
        "EndorsementClaimDType" : {
            "description" : "An entity, identified by an id and additional properties that the endorser would like to claim about that entity.",
            "type" : "object",
            "properties" : {
                "id" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The 'id' of the Profile, Achievement, or Assertion being endorsed.",
                    "type" : "string"
                },
                "type" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this entity. Normally 'EndorsementClaim'.",
                    "type" : "string"
                },
                "endorsementComment" : {
                    "description" : "Model Primitive Datatype = String. An endorer's comment about the quality or fitness of the endorsed entity. Markdown allowed.",
                    "type" : "string"
                }
            },
            "required" : [ "id" ],
            "additionalProperties" : true
        },
        "EndorsementProfileDType" : {
            "description" : "A Profile is a collection of information that describes the person or organization using Comprehensive Learner Record (CLR). Publishers, learners, and issuers must be represented as profiles. Recipients, endorsers, or other entities may also be represented using this vocabulary. An EndorsementProfile cannot have endorsements.",
            "type" : "object",
            "properties" : {
                "id" : {
                    "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the Profile.",
                    "type" : "string"
                },
                "type" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this entity. Normally 'Profile'.",
                    "type" : "string"
                },
                "address" : {
                    "$ref" : "#/definitions/AddressDType"
                },
                "description" : {
                    "description" : "Model Primitive Datatype = String. A short description of the individual or organization.",
                    "type" : "string"
                },
                "email" : {
                    "description" : "Model Primitive Datatype = String. A contact email address for the individual or organization.",
                    "type" : "string"
                },
                "image" : {
                    "description" : "Model Primitive Datatype = NormalizedString. Image representing the individual or organization.",
                    "type" : "string"
                },
                "name" : {
                    "description" : "Model Primitive Datatype = String. The name of the individual or organization.",
                    "type" : "string"
                },
                "publicKey" : {
                    "$ref" : "#/definitions/CryptographicKeyDType"
                },
                "revocationList" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The URI of the Revocation List used for marking revocation of signed Assertions.",
                    "type" : "string"
                },
                "sourcedId" : {
                    "description" : "Model Primitive Datatype = String. The individual's unique 'sourcedId' value, which is used for providing interoperability with IMS Learning Information Services (LIS).",
                    "type" : "string"
                },
                "studentId" : {
                    "description" : "Model Primitive Datatype = String. An institution's student identifier for the person. This is frequently issued through a Student Information System.",
                    "type" : "string"
                },
                "telephone" : {
                    "description" : "Model Primitive Datatype = String. Primary phone number for the individual or organization.",
                    "type" : "string"
                },
                "url" : {
                    "description" : "Model Primitive Datatype = AnyURI. Web resource that uniquely represents or belongs to the individual. This may be a resource about the individual, hosting provided by the instution to the individual, or an web resource independently controlled by the individual.",
                    "type" : "string",
                    "format" : "uri"
                },
                "verification" : {
                    "$ref" : "#/definitions/VerificationDType"
                }
            },
            "required" : [ "id","type","name" ],
            "additionalProperties" : true
        },
        "EvidenceDType" : {
            "description" : "One or more artifacts that represent supporting evidence for the record. Examples include text, media, websites, etc.",
            "type" : "object",
            "properties" : {
                "id" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The URI of a webpage presenting evidence of achievement.",
                    "type" : "string"
                },
                "type" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this entity. Normally 'Evidence'.",
                    "type" : "string"
                },
                "artifacts" : {
                    "description" : "Artifacts that are part of the evidence.",
                    "type" : "array",
                    "minItems" : 0,
                    "items" : {
                        "$ref" : "#/definitions/ArtifactDType"
                    }
                },
                "audience" : {
                    "description" : "Model Primitive Datatype = String. A description of the intended audience for a piece of evidence.",
                    "type" : "string"
                },
                "description" : {
                    "description" : "Model Primitive Datatype = String. A longer description of the evidence.",
                    "type" : "string"
                },
                "genre" : {
                    "description" : "Model Primitive Datatype = String. A string that describes the type of evidence. For example, Poetry, Prose, Film.",
                    "type" : "string"
                },
                "name" : {
                    "description" : "Model Primitive Datatype = String. The name of the evidence.",
                    "type" : "string"
                },
                "narrative" : {
                    "description" : "Model Primitive Datatype = String. A narrative that describes the evidence and process of achievement that led to an assertion. Markdown allowed.",
                    "type" : "string"
                }
            },
            "required" : [ "name" ],
            "additionalProperties" : false
        },
        "IdentityDType" : {
            "description" : "A collection of information about the recipient of an achievement assertion.",
            "type" : "object",
            "properties" : {
                "id" : {
                    "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the Identity.",
                    "type" : "string"
                },
                "type" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this entity. The type should identify the property by which the recipient of an Assertion is identified. This value should be an IRI mapped in the present context. For example, email maps to 'clr:email' and indicates that the identity of the IdentityObject will represent a value of a Profile’s email property. Currently the only supported value for many platforms that implement CLR is email, but other properties are available.",
                    "type" : "string"
                },
                "identity" : {
                    "description" : "Model Primitive Datatype = String. Either the hash of the identity or the plaintext value. If it's possible that the plaintext transmission and storage of the identity value would leak personally identifiable information where there is an expectation of privacy, it is strongly recommended that an IdentityHash be used.",
                    "type" : "string"
                },
                "hashed" : {
                    "description" : "Model Primitive Datatype = Boolean. Whether or not the identity value is hashed.",
                    "type" : "boolean"
                },
                "salt" : {
                    "description" : "Model Primitive Datatype = String. If the recipient is hashed, this should contain the string used to salt the hash. If this value is not provided, it should be assumed that the hash was not salted.",
                    "type" : "string"
                }
            },
            "required" : [ "type","identity","hashed" ],
            "additionalProperties" : false
        },
        "ProfileDType" : {
            "description" : "A Profile is a collection of information that describes the person or organization using Comprehensive Learner Record (CLR). Publishers, learners, and issuers must be represented as profiles. Recipients, endorsers, or other entities may also be represented using this vocabulary.",
            "type" : "object",
            "properties" : {
                "id" : {
                    "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the Profile.",
                    "type" : "string"
                },
                "type" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this object. Normally 'Profile'.",
                    "type" : "string"
                },
                "address" : {
                    "$ref" : "#/definitions/AddressDType"
                },
                "description" : {
                    "description" : "Model Primitive Datatype = String. A short description of the individual or organization.",
                    "type" : "string"
                },
                "email" : {
                    "description" : "Model Primitive Datatype = String. A contact email address for the individual or organization.",
                    "type" : "string"
                },
                "endorsements" : {
                    "description" : "Allows endorsers to make specific claims about the individual or organization represented by this profile.",
                    "type" : "array",
                    "minItems" : 0,
                    "items" : {
                        "$ref" : "#/definitions/EndorsementBaseDType"
                    }
                },
                "image" : {
                    "description" : "Model Primitive Datatype = NormalizedString. IRI of an image representing the individual or organization. May be a DATA URI or the URL where the image may be found.",
                    "type" : "string"
                },
                "name" : {
                    "description" : "Model Primitive Datatype = String. The name of the individual or organization.",
                    "type" : "string"
                },
                "publicKey" : {
                    "$ref" : "#/definitions/CryptographicKeyDType"
                },
                "revocationList" : {
                    "$ref" : "#/definitions/RevocationListDType"
                },
                "sourcedId" : {
                    "description" : "Model Primitive Datatype = String. The individual's unique 'sourcedId' value, which is used for providing interoperability with IMS Learning Information Services (LIS).",
                    "type" : "string"
                },
                "studentId" : {
                    "description" : "Model Primitive Datatype = String. An institution's student identifier for the person. This is frequently issued through a Student Information System.",
                    "type" : "string"
                },
                "telephone" : {
                    "description" : "Model Primitive Datatype = String. Primary phone number for the individual or organization.",
                    "type" : "string"
                },
                "url" : {
                    "description" : "Model Primitive Datatype = AnyURI. Web resource that uniquely represents or belongs to the individual. This may be a resource about the individual, hosting provided by the instution to the individual, or an web resource independently controlled by the individual.",
                    "type" : "string",
                    "format" : "uri"
                },
                "verification" : {
                    "$ref" : "#/definitions/VerificationDType"
                }
            },
            "required" : [ "id","name" ],
            "additionalProperties" : true
        },
        "ResultDType" : {
            "description" : "Describes a result of an achievement.",
            "type" : "object",
            "properties" : {
                "id" : {
                    "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the object.",
                    "type" : "string"
                },
                "type" : {
                    "description" : "The JSON-LD type of this object. The strongly typed value identifies the type of result.",
                    "type" : "string",
                    "enum" : [ "GradePointAverage","LetterGrade","Percent","PerformanceLevel","PredictedScore","Result","RawScore","RubricScore","ScaledScore" ]
                },
                "name" : {
                    "description" : "Model Primitive Datatype = String. The name of the result.",
                    "type" : "string"
                },
                "value" : {
                    "description" : "Model Primitive Datatype = String. A grade or value representing the result of the performance, or demonstration, of the achievement.  For example, 'A' if the recipient received a grade of A in the class. ",
                    "type" : "string"
                }
            },
            "required" : [ "type","value" ],
            "additionalProperties" : false
        },
        "ResultDescriptionDType" : {
            "description" : "Describes a possible achievement result.",
            "type" : "object",
            "properties" : {
                "id" : {
                    "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the ResultDescription.",
                    "type" : "string"
                },
                "type" : {
                    "description" : "The JSON-LD type of this object. The strongly typed value identifies the type of result.",
                    "type" : "string",
                    "enum" : [ "GradePointAverage","LetterGrade","Percent","PerformanceLevel","PredictedScore","Result","RawScore","RubricScore","ScaledScore" ]
                },
                "name" : {
                    "description" : "Model Primitive Datatype = String. The name of the result.",
                    "type" : "string"
                },
                "resultMin" : {
                    "description" : "Model Primitive Datatype = String. The minimum possible result that may be asserted.",
                    "type" : "string"
                },
                "resultMax" : {
                    "description" : "Model Primitive Datatype = String. The maximum possible result that may be asserted.",
                    "type" : "string"
                }
            },
            "required" : [ "type" ],
            "additionalProperties" : false
        },
        "RevocationListDType" : {
            "description" : "The Revocation List is a document that describes Assertions an Issuer has revoked that used the signed verification method. If you find the Assertion in the revokedAssertions list, it has been revoked.",
            "type" : "object",
            "properties" : {
                "id" : {
                    "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the RevocationList.",
                    "type" : "string"
                },
                "type" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this entity. Normally 'RevocationList'.",
                    "type" : "string"
                },
                "issuer" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The id of the Issuer.",
                    "type" : "string"
                },
                "revokedAssertions" : {
                    "description" : "Model Primitive Datatype = NormalizedString. The id of an assertion that has been revoked.",
                    "type" : "array",
                    "minItems" : 0,
                    "items" : {
                        "type" : "string"
                    }
                }
            },
            "required" : [ "id" ],
            "additionalProperties" : false
        },
        "VerificationDType" : {
            "description" : "A collection of information allowing an inspector to verify an Assertion.",
            "type" : "object",
            "properties" : {
                "id" : {
                    "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the Verification.",
                    "type" : "string"
                },
                "type" : {
                    "description" : "The JSON-LD type of this object. The strongly typed value indicates the verification method.",
                    "type" : "string",
                    "enum" : [ "Hosted","HostedAssertion","Signed","SignedAssertion","Verification" ]
                },
                "allowedOrigins" : {
                    "description" : "Model Primitive Datatype = String. The host registered name subcomponent of an allowed origin. Any given id URI will be considered valid.",
                    "type" : "array",
                    "minItems" : 0,
                    "items" : {
                        "type" : "string"
                    }
                },
                "creator" : {
                    "description" : "Model Primitive Datatype = AnyURI. The URI of the CryptographicKey with the public key used to verify the signed Assertion. If not present, verifiers will check publicKey property of the referenced issuer Profile. If present, the URI must match the CryptographicKey id in the issuer Profile as well.",
                    "type" : "string",
                    "format" : "uri"
                },
                "startsWith" : {
                    "description" : "Model Primitive Datatype = String. The URI fragment that the verification property must start with. Valid Assertions must have an id within this scope. Multiple values allowed, and Assertions will be considered valid if their id starts with one of these values.",
                    "type" : "array",
                    "minItems" : 0,
                    "items" : {
                        "type" : "string"
                    }
                },
                "verificationProperty" : {
                    "description" : "Model Primitive Datatype = String. The property to be used for verification. Only 'id' is supported. Verifiers will consider 'id' the default value if verificationProperty is omitted or if an issuer Profile has no explicit verification instructions, so it may be safely omitted.",
                    "type" : "string"
                }
            },
            "required" : [ "type" ],
            "additionalProperties" : false
        },
        "imsx_CodeMinorDType" : {
            "description" : "This is the container for the set of code minor status codes reported in the responses from the Service Provider.",
            "type" : "object",
            "properties" : {
                "imsx_codeMinorField" : {
                    "description" : "Each reported code minor status code.",
                    "type" : "array",
                    "minItems" : 1,
                    "items" : {
                        "$ref" : "#/definitions/imsx_CodeMinorFieldDType"
                    }
                }
            },
            "required" : [ "imsx_codeMinorField" ],
            "additionalProperties" : false
        },
        "imsx_CodeMinorFieldDType" : {
            "description" : "This is the container for a single code minor status code.",
            "type" : "object",
            "properties" : {
                "imsx_codeMinorFieldName" : {
                    "description" : "Model Primitive Datatype = NormalizedString. Tiis should contain the identity of the system that has produced the code minor status code report.",
                    "type" : "string"
                },
                "imsx_codeMinorFieldValue" : {
                    "description" : "The code minor status code (this is a value from the corresponding enumerated vocabulary).",
                    "type" : "string",
                    "enum" : [ "forbidden","fullsuccess","internal_server_error","invalid_data","invalid_query_parameter","server_busy","unauthorizedrequest" ]
                }
            },
            "required" : [ "imsx_codeMinorFieldName","imsx_codeMinorFieldValue" ],
            "additionalProperties" : false
        },
        "imsx_StatusInfoDType" : {
            "description" : "This is the container for the status code and associated information returned within the HTTP messages received from the Service Provider.",
            "type" : "object",
            "properties" : {
                "imsx_codeMajor" : {
                    "description" : "The code major value (from the corresponding enumerated vocabulary).",
                    "type" : "string",
                    "enum" : [ "success","failure","processing","unsupported" ]
                },
                "imsx_severity" : {
                    "description" : "The severity value (from the corresponding enumerated vocabulary).",
                    "type" : "string",
                    "enum" : [ "status","warning","error" ]
                },
                "imsx_description" : {
                    "description" : "Model Primitive Datatype = String. A human readable description supplied by the entity creating the status code information.",
                    "type" : "string"
                },
                "imsx_codeMinor" : {
                    "$ref" : "#/definitions/imsx_CodeMinorDType"
                }
            },
            "required" : [ "imsx_codeMajor","imsx_severity" ],
            "additionalProperties" : false
        }
    },
    "consumes" : [ "application/json" ],
    "produces" : [ "application/json" ]
}
        

B1.2 OpenAPI 3.0 JSON Listing

The OpenAPI 3 (JSON) listing (based upon [OAS, 17]) is shown below (the OpenAPI JSON is available at: https://purl.imsglobal.org/spec/clr/v1p0/schema/openapi/imsclr_v1p0.json).

{
    "openapi" : "3.0.0",
    "info" : {
        "version" : "1.0",
        "title" : "Comprehensive Learner Record Service OpenAPI (JSON) Definition",
        "description" : "The Comprehensive Learner Record Service enables the exchange of data about users and their achievements between a Comprehensive Learner Record Service Provider and the consumers of the associated data. This service has been described using the IMS Model Driven Specification development approach, this being the Platform Specific Model (PSM) of the service.",
        "termsOfService" : "https://www.imsglobal.org/license.html",
        "contact" : {
            "name" : "Lisa Mattson (COO), IMS Global ",
            "url" : "http://www.imsglobal.org",
            "email" : "lmattson@imsglobal.org"
        },
        "license" : {
            "name" : "IMS Global",
            "url" : "https://www.imsglobal.org/license.html"
        }
    },
    "servers" : [
        {
            "url" : "www.imsglobal.org/ims/clr/v1p0/",
            "description" : "The above Server URL should be changed to the actual server location."
        }
    ],
    "tags" : [
        {
            "name" : "AssertionsManager",
            "description" : "The set of service operations that manage access to Assertions."
        },
        {
            "name" : "ClrsManager",
            "description" : "The set of service operations that manage access to CLRs."
        },
        {
            "name" : "DiscoveryManager",
            "description" : "The set of service operations that manage access to the DiscoveryDocument."
        },
        {
            "name" : "EndorsementsManager",
            "description" : "The set of service operations that manage access to Endorsements."
        },
        {
            "name" : "KeysManager",
            "description" : "The set of service operations that manage access to CryptographicKeys."
        }
    ],
    "paths" : {
        "/assertions/{id}" : {
            "get" : {
                "operationId" : "getAssertion",
                "summary" : "The REST read request message for the getAssertion() API call.",
                "tags" : [ "AssertionsManager" ],
                "description" : "Returns the current version of the specified Assertion. This operation is used to verify a Hosted Assertion.",
                "parameters" : [
                    {
                        "name" : "id",
                        "in" : "path",
                        "description" : "The unique identifier of the Assertion.",
                        "required" : true,
                        "schema" : {
                            "type" : "string"
                        },
                        "style" : "simple"
                    }
                ],
                "security" : [
                    {
                        "OAuth2CCG" : [

                        ]
                    }
                ],
                "responses" : {
                    "200" : {
                        "description" : "'OK' - the resource is returned in the payload.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/AssertionDType"
                                }
                            }
                        }
                    },
                    "404" : {
                        "description" : "'Not Found' – there is no resource behind the URI."
                    },
                    "default" : {
                        "description" : "The request was not completed successfully."
                    }
                }
            }
        },
        "/clrs" : {
            "get" : {
                "operationId" : "getClrs",
                "summary" : "The REST read request message for the getClrs() API call.",
                "tags" : [ "ClrsManager" ],
                "description" : "The set of CLRs the user is authorized to access are returned in the payload of the response message.",
                "parameters" : [
                    {
                        "name" : "limit",
                        "in" : "query",
                        "description" : "The number of results to return.",
                        "required" : false,
                        "schema" : {
                            "default" : 100,
                            "minimum" : 1
                        },
                        "style" : "form",
                        "allowEmptyValue" : false
                    },
                    {
                        "name" : "offset",
                        "in" : "query",
                        "description" : "The index of the first record to return. (zero indexed)",
                        "required" : false,
                        "schema" : {
                            "minimum" : 0
                        },
                        "style" : "form",
                        "allowEmptyValue" : false
                    },
                    {
                        "name" : "since",
                        "in" : "query",
                        "description" : "Retrieve CLRs that were issued after the provided timestamp. Must be an ISO 8601 compatible timestamp with a time zone indicator.",
                        "required" : false,
                        "schema" : {
                        },
                        "style" : "form",
                        "allowEmptyValue" : false
                    }
                ],
                "security" : [
                    {
                        "OAuth2CCG" : [
                            "https://purl.imsglobal.org/spec/clr/v1p0/scope/readonly"
                        ]
                    }
                ],
                "responses" : {
                    "200" : {
                        "description" : "'OK' - the resource is returned in the payload.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/CLRSetDType"
                                }
                            }
                        }
                    },
                    "400" : {
                        "description" : "'Bad Request' – the request was invalid or cannot be served. The exact error should be explained in the error payload.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/imsx_StatusInfoDType"
                                }
                            }
                        }
                    },
                    "401" : {
                        "description" : "'Unauthorized' – the request requires an user authentication.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/imsx_StatusInfoDType"
                                }
                            }
                        }
                    },
                    "403" : {
                        "description" : "'Forbidden' – the server understood the request, but is refusing it or the access is not allowed.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/imsx_StatusInfoDType"
                                }
                            }
                        }
                    },
                    "404" : {
                        "description" : "'Not Found' – there are no resources behind the URI.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/imsx_StatusInfoDType"
                                }
                            }
                        }
                    },
                    "default" : {
                        "description" : "The request was not completed successfully. The exact error should be explained in the error payload.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/imsx_StatusInfoDType"
                                }
                            }
                        }
                    }
                }
            },
            "post" : {
                "operationId" : "replaceClr",
                "summary" : "The REST createbp request message for the replaceClr() API call.",
                "tags" : [ "ClrsManager" ],
                "description" : "Create or replace a CLR.",
                "security" : [
                    {
                        "OAuth2CCG" : [
                            "https://purl.imsglobal.org/spec/clr/v1p0/scope/replace"
                        ]
                    }
                ],
                "requestBody" : {
                    "description" : "The CLR to be created or replaced.",
                    "content" : {
                        "application/json" : {
                            "schema" : {
                                "$ref" : "#/components/schemas/CLRDType"
                            }
                        }
                    },
                    "required" : true
                },
                "responses" : {
                    "200" : {
                        "description" : "'OK' – the resource was successfully replaced.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/CLRDType"
                                }
                            }
                        }
                    },
                    "201" : {
                        "description" : "'Created` – the resource was successfully created.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/CLRDType"
                                }
                            }
                        }
                    },
                    "304" : {
                        "description" : "'Not Modified' – the client can use cached data."
                    },
                    "400" : {
                        "description" : "'Bad Request' – the request was invalid or cannot be served. The exact error should be explained in the error payload.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/imsx_StatusInfoDType"
                                }
                            }
                        }
                    },
                    "401" : {
                        "description" : "'Unauthorized' – the request requires user authentication.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/imsx_StatusInfoDType"
                                }
                            }
                        }
                    },
                    "403" : {
                        "description" : "'Forbidden' – the server understood the request, but is refusing it or the access is not allowed.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/imsx_StatusInfoDType"
                                }
                            }
                        }
                    },
                    "404" : {
                        "description" : "'Not Found' – there is no resource behind the URI.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/imsx_StatusInfoDType"
                                }
                            }
                        }
                    },
                    "default" : {
                        "description" : "The request was not completed successfully. The exact error should be explained in the error payload.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/imsx_StatusInfoDType"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/clrs/{id}" : {
            "delete" : {
                "operationId" : "deleteClr",
                "summary" : "The REST delete request message for the deleteClr() API call.",
                "tags" : [ "ClrsManager" ],
                "description" : "Delete a CLR.",
                "parameters" : [
                    {
                        "name" : "id",
                        "in" : "path",
                        "description" : "The unique identifier of the CLR to delete.",
                        "required" : true,
                        "schema" : {
                            "type" : "string"
                        },
                        "style" : "simple"
                    }
                ],
                "security" : [
                    {
                        "OAuth2CCG" : [
                            "https://purl.imsglobal.org/spec/clr/v1p0/scope/delete"
                        ]
                    }
                ],
                "responses" : {
                    "204" : {
                        "description" : "'No Content' – The resource was successfully deleted."
                    },
                    "400" : {
                        "description" : "'Bad Request' – The request was invalid or cannot be served. The exact error should be explained in the error payload.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/imsx_StatusInfoDType"
                                }
                            }
                        }
                    },
                    "401" : {
                        "description" : "'Unauthorized' – The request requires an user authentication.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/imsx_StatusInfoDType"
                                }
                            }
                        }
                    },
                    "403" : {
                        "description" : "'Forbidden' – The server understood the request, but is refusing it or the access is not allowed.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/imsx_StatusInfoDType"
                                }
                            }
                        }
                    },
                    "404" : {
                        "description" : "'Not found' – There is no resource behind the URI.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/imsx_StatusInfoDType"
                                }
                            }
                        }
                    },
                    "default" : {
                        "description" : "The request was not completed successfully. The exact error should be explained in the error payload.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/imsx_StatusInfoDType"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/discovery" : {
            "get" : {
                "operationId" : "getDiscoveryDocument",
                "summary" : "The REST read request message for the getDiscoveryDocument() API call.",
                "tags" : [ "DiscoveryManager" ],
                "description" : "Returns the DiscoveryDocument if the provider supports dynamic CLR consumer registration.",
                "security" : [
                    {
                        "OAuth2CCG" : [

                        ]
                    }
                ],
                "responses" : {
                    "200" : {
                        "description" : "'OK' - the resource is returned in the payload.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/DiscoveryDocumentDType"
                                }
                            }
                        }
                    },
                    "404" : {
                        "description" : "'Not Found' – there is no resource behind the URI."
                    },
                    "421" : {
                        "description" : "'Misdirected Request' - the request was not made over secure TLS 1.2 or 1.3 protocol."
                    },
                    "default" : {
                        "description" : "The request was not completed successfully."
                    }
                }
            }
        },
        "/endorsements/{id}" : {
            "get" : {
                "operationId" : "getEndorsement",
                "summary" : "The REST read request message for the getEndorsement() API call.",
                "tags" : [ "EndorsementsManager" ],
                "description" : "Returns the current version of the specified Endorsement. This operation is used to verify a Hosted Endorsements",
                "parameters" : [
                    {
                        "name" : "id",
                        "in" : "path",
                        "description" : "The unique identifier of the Endorsement",
                        "required" : true,
                        "schema" : {
                            "type" : "string"
                        },
                        "style" : "simple"
                    }
                ],
                "security" : [
                    {
                        "OAuth2CCG" : [

                        ]
                    }
                ],
                "responses" : {
                    "200" : {
                        "description" : "'OK' - the resource is returned in the payload.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/EndorsementDType"
                                }
                            }
                        }
                    },
                    "404" : {
                        "description" : "'Not Found' – there is no resource behind the URI."
                    },
                    "default" : {
                        "description" : "The request was not completed successfully."
                    }
                }
            }
        },
        "/keys/{id}" : {
            "get" : {
                "operationId" : "getKey",
                "summary" : "The REST read request message for the getKey() API call.",
                "tags" : [ "KeysManager" ],
                "description" : "Returns the current version of the specified CryptographicKey. This operation is used to help verify a Signed Assertion.",
                "parameters" : [
                    {
                        "name" : "id",
                        "in" : "path",
                        "description" : "The unique identifier of the CryptographicKey.",
                        "required" : true,
                        "schema" : {
                            "type" : "string"
                        },
                        "style" : "simple"
                    }
                ],
                "security" : [
                    {
                        "OAuth2CCG" : [

                        ]
                    }
                ],
                "responses" : {
                    "200" : {
                        "description" : "'OK' - the resource is returned in the payload.",
                        "content" : {
                            "application/json" : {
                                "schema" : {
                                    "$ref" : "#/components/schemas/CryptographicKeyDType"
                                }
                            }
                        }
                    },
                    "404" : {
                        "description" : "'Not Found' – there is no resource behind the URI."
                    },
                    "default" : {
                        "description" : "The request was not completed successfully."
                    }
                }
            }
        }
    },
    "components" : {
        "securitySchemes" : {
            "OAuth2CCG" : {
                "type" : "oauth2",
                "description" : "OAuth 2.0 Client Credentials authorization per IMS Security Framework.",
                "flows" : {
                    "clientCredentials" : {
                        "tokenUrl" : "/token",
                        "scopes" : {
                            "https://purl.imsglobal.org/spec/clr/v1p0/scope/delete" : "Grants the app permission to delete your comprehensive learner records on this host.",
                            "https://purl.imsglobal.org/spec/clr/v1p0/scope/readonly" : "Grants the app permission to read your comprehensive learner records on this host.",
                            "https://purl.imsglobal.org/spec/clr/v1p0/scope/replace" : "Grants the app permission to create or replace your comprehensive learner records on this host."
                        }
                    }
                }
            },
            "OAuth2ACG" : {
                "type" : "oauth2",
                "description" : "",
                "flows" : {
                    "authorizationCode" : {
                        "tokenUrl" : "/token",
                        "authorizationUrl" : "/authorize",
                        "refreshUrl" : "/token",
                        "scopes" : {
                            "https://purl.imsglobal.org/spec/clr/v1p0/scope/delete" : "Grants the app permission to delete your comprehensive learner records on this host.",
                            "https://purl.imsglobal.org/spec/clr/v1p0/scope/readonly" : "Grants the app permission to read your comprehensive learner records on this host.",
                            "https://purl.imsglobal.org/spec/clr/v1p0/scope/replace" : "Grants the app permission to create or replace your comprehensive learner records on this host."
                        }
                    }
                }
            }
        },
        "schemas" : {
            "AchievementDType" : {
                "description" : "An accomplishment such as completing a degree, mastering a competency, or course completion that may be asserted about one or more learners.",
                "type" : "object",
                "properties" : {
                    "id" : {
                        "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the Achievement.",
                        "type" : "string"
                    },
                    "type" : {
                        "description" : "The JSON-LD type of this object. Normally 'Achievement'.",
                        "type" : "string",
                        "enum" : [ "Achievement","BadgeClass","CASECompetencyStatement","CTDLCredential","IMSAssessmentResult","PESCTranscript" ]
                    },
                    "alignments" : {
                        "description" : "Alignment objects describe an alignment between this achievement and a node in an educational framework.",
                        "type" : "array",
                        "minItems" : 0,
                        "items" : {
                            "$ref" : "#/components/schemas/AlignmentDType"
                        }
                    },
                    "creditsAvailable" : {
                        "description" : "Model Primitive Datatype = Float. Credit hours associated with this entity, or credit hours possible. For example '3.0'.",
                        "type" : "number",
                        "format" : "float"
                    },
                    "description" : {
                        "description" : "Model Primitive Datatype = String. A short description of the achievement. May be the same as name if no description is available.",
                        "type" : "string"
                    },
                    "endorsements" : {
                        "description" : "Allows endorsers to make specific claims about the Achievement.",
                        "type" : "array",
                        "minItems" : 0,
                        "items" : {
                            "$ref" : "#/components/schemas/EndorsementBaseDType"
                        }
                    },
                    "humanCode" : {
                        "description" : "Model Primitive Datatype = String. The code, generally human readable, associated with an achievement.",
                        "type" : "string"
                    },
                    "name" : {
                        "description" : "Model Primitive Datatype = String. The name of the achievement.",
                        "type" : "string"
                    },
                    "fieldOfStudy" : {
                        "description" : "Model Primitive Datatype = String. Category, subject, area of study,  discipline, or general branch of knowledge. Examples include Business, Education, Psychology, and Technology. ",
                        "type" : "string"
                    },
                    "image" : {
                        "description" : "Model Primitive Datatype = NormalizedString. IRI of an image representing the achievement. May be a Data URI or the URL where the image may be found.",
                        "type" : "string"
                    },
                    "issuer" : {
                        "$ref" : "#/components/schemas/ProfileDType"
                    },
                    "level" : {
                        "description" : "Model Primitive Datatype = String. Text that describes the level of achievement apart from how the achievement was performed or demonstrated. Examples would include 'Level 1', 'Level 2', 'Level 3', or 'Bachelors', 'Masters', 'Doctoral'.",
                        "type" : "string"
                    },
                    "requirement" : {
                        "$ref" : "#/components/schemas/CriteriaDType"
                    },
                    "resultDescriptions" : {
                        "description" : "The types of result that may be asserted with this achievement.",
                        "type" : "array",
                        "minItems" : 0,
                        "items" : {
                            "$ref" : "#/components/schemas/ResultDescriptionDType"
                        }
                    },
                    "specialization" : {
                        "description" : "Model Primitive Datatype = String. Name given to the focus, concentration, or specific area of study defined in the achievement. Examples include Entrepreneurship, Technical Communication, and Finance.",
                        "type" : "string"
                    },
                    "tags" : {
                        "description" : "Model Primitive Datatype = String. Tags that describe the type of achievement.",
                        "type" : "array",
                        "minItems" : 0,
                        "items" : {
                            "type" : "string"
                        }
                    },
                    "typeLabel" : {
                        "description" : "Model Primitive Datatype = String. The type of achievement matching one  from an IMS recommended taxonomy of achievement types, or any text string.",
                        "type" : "string"
                    }
                },
                "required" : [ "id","type","name","issuer","typeLabel" ],
                "additionalProperties" : true
            },
            "AddressDType" : {
                "description" : "Based on schema.org Address object.",
                "type" : "object",
                "properties" : {
                    "id" : {
                        "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the Address.",
                        "type" : "string"
                    },
                    "type" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this object. Normally 'Address'.",
                        "type" : "string"
                    },
                    "addressCountry" : {
                        "description" : "Model Primitive Datatype = String. The country. For example, USA. You can also provide the two-letter ISO 3166-1 alpha-2 country code.",
                        "type" : "string"
                    },
                    "addressLocality" : {
                        "description" : "Model Primitive Datatype = String. The locality. For example, Mountain View.",
                        "type" : "string"
                    },
                    "addressRegion" : {
                        "description" : "Model Primitive Datatype = String. The region. For example, CA.",
                        "type" : "string"
                    },
                    "postalCode" : {
                        "description" : "Model Primitive Datatype = String. The postal code. For example, 94043.",
                        "type" : "string"
                    },
                    "postOfficeBoxNumber" : {
                        "description" : "Model Primitive Datatype = String. The post office box number for PO box addresses.",
                        "type" : "string"
                    },
                    "streetAddress" : {
                        "description" : "Model Primitive Datatype = String. The street address. For example, 1600 Amphitheatre Pkwy.",
                        "type" : "string"
                    }
                },
                "additionalProperties" : false
            },
            "AlignmentDType" : {
                "description" : "Alignment is based on schema.org’s AlignmentObject and uses IRIs from that vocabulary.",
                "type" : "object",
                "properties" : {
                    "id" : {
                        "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the object.",
                        "type" : "string"
                    },
                    "type" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this entity. Normally 'Alignment'.",
                        "type" : "string"
                    },
                    "educationalFramework" : {
                        "description" : "Model Primitive Datatype = String. The framework to which the resource being described is aligned.",
                        "type" : "string"
                    },
                    "targetCode" : {
                        "description" : "Model Primitive Datatype = String. If applicable, a locally unique string identifier that identifies the alignment target within its framework.",
                        "type" : "string"
                    },
                    "targetDescription" : {
                        "description" : "Model Primitive Datatype = String. Short description of the alignment target.",
                        "type" : "string"
                    },
                    "targetName" : {
                        "description" : "Model Primitive Datatype = String. The name of a node in an established educational framework.",
                        "type" : "string"
                    },
                    "targetUrl" : {
                        "description" : "Model Primitive Datatype = AnyURI. The URL of a node in an established educational framework.",
                        "type" : "string",
                        "format" : "uri"
                    }
                },
                "required" : [ "targetName","targetUrl" ],
                "additionalProperties" : false
            },
            "ArtifactDType" : {
                "description" : "An artifact that is part of an evidence object.",
                "type" : "object",
                "properties" : {
                    "type" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of the object. Normally 'Artifact'.",
                        "type" : "string"
                    },
                    "description" : {
                        "description" : "Model Primitive Datatype = String. A description of the artifact.",
                        "type" : "string"
                    },
                    "name" : {
                        "description" : "Model Primitive Datatype = String. The name of the artifact.",
                        "type" : "string"
                    },
                    "url" : {
                        "description" : "Model Primitive Datatype = AnyURI. IRI of the artifact. May be a Data URI or the URL where the artifact may be found.",
                        "type" : "string",
                        "format" : "uri"
                    }
                },
                "required" : [ "name" ],
                "additionalProperties" : false
            },
            "AssertionDType" : {
                "description" : "Assertions are representations of an Achievement awarded to a Learner.  It is used to share information about the Achievement Assertion, such as a result and verification method. Assertions are packaged for transmission as JSON objects with a set of mandatory and optional properties.",
                "type" : "object",
                "properties" : {
                    "id" : {
                        "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the Assertion.",
                        "type" : "string"
                    },
                    "type" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this object. Normally 'Assertion'.",
                        "type" : "string"
                    },
                    "achievement" : {
                        "$ref" : "#/components/schemas/AchievementDType"
                    },
                    "creditsEarned" : {
                        "description" : "Model Primitive Datatype = Float. The number of credits earned, generally in semester or quarter credit hours.  This field correlates with the Achievement creditsAvailable field.",
                        "type" : "number",
                        "format" : "float"
                    },
                    "endDate" : {
                        "description" : "Model Primitive Datatype = DateTime. If present, the assertion is not valid after this date.",
                        "type" : "string",
                        "format" : "date-time"
                    },
                    "endorsements" : {
                        "description" : "Allows endorsers to make specific claims about the assertion.",
                        "type" : "array",
                        "minItems" : 0,
                        "items" : {
                            "$ref" : "#/components/schemas/EndorsementBaseDType"
                        }
                    },
                    "evidence" : {
                        "description" : "Evidence describing the work that the recipient did to earn the achievement. This can be a webpage that links out to other pages if linking directly to the work is infeasible.",
                        "type" : "array",
                        "minItems" : 0,
                        "items" : {
                            "$ref" : "#/components/schemas/EvidenceDType"
                        }
                    },
                    "image" : {
                        "description" : "Model Primitive Datatype = NormalizedString. IRI of an image representing the assertion. May be a Data URI or the URL where the image may be found. If the object is an Open Badges 2.0 assertion, the image is a 'Baked Image' as defined by the Open Badges 2.0 specification.",
                        "type" : "string"
                    },
                    "issuedOn" : {
                        "description" : "Model Primitive Datatype = DateTime. Timestamp of when the achievement was awarded. Required unless the assertion is revoked.",
                        "type" : "string",
                        "format" : "date-time"
                    },
                    "licenseNumber" : {
                        "description" : "Model Primitive Datatype = String. The license number that was issued with this assertion.",
                        "type" : "string"
                    },
                    "narrative" : {
                        "description" : "Model Primitive Datatype = String. A narrative that describes the connection between multiple pieces of evidence. Likely only present if evidence is a multi-value array. Markdown allowed.",
                        "type" : "string"
                    },
                    "recipient" : {
                        "$ref" : "#/components/schemas/IdentityDType"
                    },
                    "results" : {
                        "description" : "The results being asserted.",
                        "type" : "array",
                        "minItems" : 0,
                        "items" : {
                            "$ref" : "#/components/schemas/ResultDType"
                        }
                    },
                    "revocationReason" : {
                        "description" : "Model Primitive Datatype = String. Optional published reason for revocation, if revoked.",
                        "type" : "string"
                    },
                    "revoked" : {
                        "description" : "Model Primitive Datatype = Boolean. Defaults to false if Assertion is not referenced from a revokedAssertions list and may be omitted. See RevocationList. If revoked is true, only revoked and id are required properties, and many issuers strip a hosted Assertion down to only those properties when revoked.",
                        "type" : "boolean"
                    },
                    "role" : {
                        "description" : "Model Primitive Datatype = String. Role, position, or title of the learner when demonstrating or performing the achievement or evidence of learning being asserted. Examples include 'Student President', 'Intern', 'Captain', etc.",
                        "type" : "string"
                    },
                    "startDate" : {
                        "description" : "Model Primitive Datatype = DateTime. If present, the assertion is not valid before this date.",
                        "type" : "string",
                        "format" : "date-time"
                    },
                    "term" : {
                        "description" : "Model Primitive Datatype = String. The academic term in which this assertion was achieved.",
                        "type" : "string"
                    },
                    "verification" : {
                        "$ref" : "#/components/schemas/VerificationDType"
                    }
                },
                "required" : [ "id","type" ],
                "additionalProperties" : true
            },
            "AssertionBaseDType" : {
                "description" : "Base class for the two types of assertion objects: Assertion and SignedAssertion.",
                "type" : "object",
                "properties" : {
                    "id" : {
                        "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the object. Required if the type is Assertion.",
                        "type" : "string"
                    },
                    "type" : {
                        "description" : "The type of the assertion object.  Use the type to recast the object to the appropriate sub-class.",
                        "type" : "string",
                        "enum" : [ "Assertion","SignedAssertion","SignedBadge" ]
                    }
                },
                "required" : [ "type" ],
                "additionalProperties" : true
            },
            "AssociationDType" : {
                "description" : "Association is based on the CASE CFAssociation object. An Association associates (relates) one Achievement with another Achievement.",
                "type" : "object",
                "properties" : {
                    "id" : {
                        "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the Association.",
                        "type" : "string"
                    },
                    "type" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this object. Normally 'Association'.",
                        "type" : "string"
                    },
                    "associationType" : {
                        "description" : "The type of the relationship, used to define the alignment between two achievements.  ",
                        "type" : "string",
                        "enum" : [ "exactMatchOf","exemplar","hasSkillLevel","isChildOf","isPartOf","isPeerOf","isRelatedTo","precedes","replacedBy" ]
                    },
                    "identifier" : {
                        "description" : "Model Primitive Datatype = String. An unambiguous, synthetic, globally unique identifier for the Association. This is the primary way in which the exchange identification is achieved.",
                        "type" : "string",
                        "pattern" : "[0-9a-f]{8}-[0-9a-f]{4}-[1-5]{1}[0-9a-f]{3}-[8-9a-b]{1}[0-9a-f]{3}-[0-9a-f]{12}"
                    },
                    "lastChangeDateTime" : {
                        "description" : "Model Primitive Datatype = DateTime. A system generated timestamp of the most recent change to this association.",
                        "type" : "string",
                        "format" : "date-time"
                    },
                    "sequenceNumber" : {
                        "description" : "Model Primitive Datatype = Integer. This is used to order associated objects. Associations can be created through mapping rather than strict hierarchy. As such the presentation of the list cannot be ordered by the objects in the list. They may be different based on the parent being viewed.",
                        "type" : "integer",
                        "format" : "int32"
                    },
                    "sourceId" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The 'id' of an Achievement or source of the association.",
                        "type" : "string"
                    },
                    "targetId" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The 'id' of another Achievement, or target of the association.",
                        "type" : "string"
                    }
                },
                "required" : [ "associationType","sourceId","targetId" ],
                "additionalProperties" : false
            },
            "CLRDType" : {
                "description" : "A collection of assertions for a single person reported by a single publisher.",
                "type" : "object",
                "properties" : {
                    "id" : {
                        "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the CLR.",
                        "type" : "string"
                    },
                    "type" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this object. Normally 'CLR'.",
                        "type" : "string"
                    },
                    "assertions" : {
                        "description" : "The learner's asserted achievements.",
                        "type" : "array",
                        "minItems" : 1,
                        "items" : {
                            "$ref" : "#/components/schemas/AssertionBaseDType"
                        }
                    },
                    "associations" : {
                        "description" : "The set of achievement associations in the CLR.",
                        "type" : "array",
                        "minItems" : 0,
                        "items" : {
                            "$ref" : "#/components/schemas/AssociationDType"
                        }
                    },
                    "issuedOn" : {
                        "description" : "Model Primitive Datatype = DateTime. Timestamp of when the CLR was published.",
                        "type" : "string",
                        "format" : "date-time"
                    },
                    "learner" : {
                        "$ref" : "#/components/schemas/ProfileDType"
                    },
                    "publisher" : {
                        "$ref" : "#/components/schemas/ProfileDType"
                    }
                },
                "required" : [ "id","assertions","issuedOn","learner","publisher" ],
                "additionalProperties" : false
            },
            "CLRSetDType" : {
                "description" : "A set of CLRs.",
                "type" : "object",
                "properties" : {
                    "id" : {
                        "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the ClrSet.",
                        "type" : "string"
                    },
                    "type" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this object. Normally 'CLRSet'.",
                        "type" : "string"
                    },
                    "clrs" : {
                        "description" : "An unordered collection of comprehensive learner records.",
                        "type" : "array",
                        "minItems" : 0,
                        "items" : {
                            "$ref" : "#/components/schemas/CLRDType"
                        }
                    }
                },
                "additionalProperties" : false
            },
            "CriteriaDType" : {
                "description" : "Descriptive metadata about the achievements necessary to be recognized with an Assertion of a particular AchievementType. This data is added to the AchievementType so that it may be rendered when that AchievementType is displayed, instead of simply a link to human-readable criteria external to the Achievement Assertion. Embedding criteria allows either enhancement of an external criteria page or increased portability and ease of use by allowing issuers to skip hosting the formerly-required external criteria page altogether.",
                "type" : "object",
                "properties" : {
                    "id" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The URI of a webpage that describes in a human-readable format the criteria for the Achievement.",
                        "type" : "string"
                    },
                    "type" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this object. Normally 'Criteria'.",
                        "type" : "string"
                    },
                    "narrative" : {
                        "description" : "Model Primitive Datatype = String. A narrative of what is needed to earn the achievement. Markdown allowed.",
                        "type" : "string"
                    }
                },
                "required" : [ "id" ],
                "additionalProperties" : true
            },
            "CryptographicKeyDType" : {
                "description" : "Based on the Key class from the W3C Web Payments Community Group Security Vocabulary. A CryptographicKey document identifies and describes a public key used to verify signed Assertions.",
                "type" : "object",
                "properties" : {
                    "id" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The URI of the CryptographicKey document. Used during signed verification.",
                        "type" : "string"
                    },
                    "type" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this object. Normally 'CryptographicKey'.",
                        "type" : "string"
                    },
                    "owner" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The identifier for the Profile that owns this key.",
                        "type" : "string"
                    },
                    "publicKeyPem" : {
                        "description" : "Model Primitive Datatype = String. The PEM key encoding is a widely-used method to express public keys, compatible with almost every Secure Sockets Layer library implementation.",
                        "type" : "string"
                    }
                },
                "required" : [ "id" ],
                "additionalProperties" : false
            },
            "DiscoveryDocumentDType" : {
                "description" : "Configuration information about the provider implementation.",
                "type" : "object",
                "properties" : {
                    "authorizationUrl" : {
                        "description" : "Model Primitive Datatype = AnyURI. A fully qualifed URL to the provider's OAuth 2.0 Authorization endpoint.",
                        "type" : "string",
                        "format" : "uri"
                    },
                    "image" : {
                        "description" : "Model Primitive Datatype = NormalizedString. An image representing the provider. May be a Data URI or the URL where the image may be found.",
                        "type" : "string"
                    },
                    "name" : {
                        "description" : "Model Primitive Datatype = String. The user-facing name of the platform providing CLR services.",
                        "type" : "string"
                    },
                    "privacyPolicyUrl" : {
                        "description" : "Model Primitive Datatype = AnyURI. A fully qualified URL to the provider's privacy policy.",
                        "type" : "string",
                        "format" : "uri"
                    },
                    "registrationUrl" : {
                        "description" : "Model Primitive Datatype = AnyURI. A fully qualified URL to the provider's OAuth 2.0 Registration endpoint.",
                        "type" : "string",
                        "format" : "uri"
                    },
                    "scopesOffered" : {
                        "description" : "Model Primitive Datatype = AnyURI. An array of OAuth 2.0 Scopes supported by the provider.",
                        "type" : "array",
                        "minItems" : 1,
                        "items" : {
                            "type" : "string",
                            "format" : "uri"
                        }
                    },
                    "termsOfServiceUrl" : {
                        "description" : "Model Primitive Datatype = AnyURI. A fully qualified URL to the provider's terms of service.",
                        "type" : "string",
                        "format" : "uri"
                    },
                    "tokenUrl" : {
                        "description" : "Model Primitive Datatype = AnyURI. A fully qualified URL to the provider's OAuth 2.0 Token endpoint.",
                        "type" : "string",
                        "format" : "uri"
                    }
                },
                "required" : [ "authorizationUrl","name","privacyPolicyUrl","registrationUrl","scopesOffered","termsOfServiceUrl","tokenUrl" ],
                "additionalProperties" : false
            },
            "EndorsementDType" : {
                "description" : "An endorsement claim.",
                "type" : "object",
                "properties" : {
                    "id" : {
                        "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the Endorsement.",
                        "type" : "string"
                    },
                    "type" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this entity. Normally 'Endorsement'.",
                        "type" : "string"
                    },
                    "claim" : {
                        "$ref" : "#/components/schemas/EndorsementClaimDType"
                    },
                    "issuedOn" : {
                        "description" : "Model Primitive Datatype = DateTime. Timestamp of when the endorsement was published.",
                        "type" : "string",
                        "format" : "date-time"
                    },
                    "issuer" : {
                        "$ref" : "#/components/schemas/EndorsementProfileDType"
                    },
                    "verification" : {
                        "$ref" : "#/components/schemas/VerificationDType"
                    }
                },
                "required" : [ "id","type","issuedOn","issuer" ],
                "additionalProperties" : false
            },
            "EndorsementBaseDType" : {
                "description" : "Base class for the two types of endorsement objects: Endorsement and SignedEndorsement.",
                "type" : "object",
                "properties" : {
                    "id" : {
                        "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the object.",
                        "type" : "string"
                    },
                    "type" : {
                        "description" : "The type of the endorsement object. Use the type to recast the object to the appropriate sub-class.",
                        "type" : "string",
                        "enum" : [ "Endorsement","SignedEndorsement" ]
                    }
                },
                "required" : [ "type" ],
                "additionalProperties" : true
            },
            "EndorsementClaimDType" : {
                "description" : "An entity, identified by an id and additional properties that the endorser would like to claim about that entity.",
                "type" : "object",
                "properties" : {
                    "id" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The 'id' of the Profile, Achievement, or Assertion being endorsed.",
                        "type" : "string"
                    },
                    "type" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this entity. Normally 'EndorsementClaim'.",
                        "type" : "string"
                    },
                    "endorsementComment" : {
                        "description" : "Model Primitive Datatype = String. An endorer's comment about the quality or fitness of the endorsed entity. Markdown allowed.",
                        "type" : "string"
                    }
                },
                "required" : [ "id" ],
                "additionalProperties" : true
            },
            "EndorsementProfileDType" : {
                "description" : "A Profile is a collection of information that describes the person or organization using Comprehensive Learner Record (CLR). Publishers, learners, and issuers must be represented as profiles. Recipients, endorsers, or other entities may also be represented using this vocabulary. An EndorsementProfile cannot have endorsements.",
                "type" : "object",
                "properties" : {
                    "id" : {
                        "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the Profile.",
                        "type" : "string"
                    },
                    "type" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this entity. Normally 'Profile'.",
                        "type" : "string"
                    },
                    "address" : {
                        "$ref" : "#/components/schemas/AddressDType"
                    },
                    "description" : {
                        "description" : "Model Primitive Datatype = String. A short description of the individual or organization.",
                        "type" : "string"
                    },
                    "email" : {
                        "description" : "Model Primitive Datatype = String. A contact email address for the individual or organization.",
                        "type" : "string"
                    },
                    "image" : {
                        "description" : "Model Primitive Datatype = NormalizedString. Image representing the individual or organization.",
                        "type" : "string"
                    },
                    "name" : {
                        "description" : "Model Primitive Datatype = String. The name of the individual or organization.",
                        "type" : "string"
                    },
                    "publicKey" : {
                        "$ref" : "#/components/schemas/CryptographicKeyDType"
                    },
                    "revocationList" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The URI of the Revocation List used for marking revocation of signed Assertions.",
                        "type" : "string"
                    },
                    "sourcedId" : {
                        "description" : "Model Primitive Datatype = String. The individual's unique 'sourcedId' value, which is used for providing interoperability with IMS Learning Information Services (LIS).",
                        "type" : "string"
                    },
                    "studentId" : {
                        "description" : "Model Primitive Datatype = String. An institution's student identifier for the person. This is frequently issued through a Student Information System.",
                        "type" : "string"
                    },
                    "telephone" : {
                        "description" : "Model Primitive Datatype = String. Primary phone number for the individual or organization.",
                        "type" : "string"
                    },
                    "url" : {
                        "description" : "Model Primitive Datatype = AnyURI. Web resource that uniquely represents or belongs to the individual. This may be a resource about the individual, hosting provided by the instution to the individual, or an web resource independently controlled by the individual.",
                        "type" : "string",
                        "format" : "uri"
                    },
                    "verification" : {
                        "$ref" : "#/components/schemas/VerificationDType"
                    }
                },
                "required" : [ "id","type","name" ],
                "additionalProperties" : true
            },
            "EvidenceDType" : {
                "description" : "One or more artifacts that represent supporting evidence for the record. Examples include text, media, websites, etc.",
                "type" : "object",
                "properties" : {
                    "id" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The URI of a webpage presenting evidence of achievement.",
                        "type" : "string"
                    },
                    "type" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this entity. Normally 'Evidence'.",
                        "type" : "string"
                    },
                    "artifacts" : {
                        "description" : "Artifacts that are part of the evidence.",
                        "type" : "array",
                        "minItems" : 0,
                        "items" : {
                            "$ref" : "#/components/schemas/ArtifactDType"
                        }
                    },
                    "audience" : {
                        "description" : "Model Primitive Datatype = String. A description of the intended audience for a piece of evidence.",
                        "type" : "string"
                    },
                    "description" : {
                        "description" : "Model Primitive Datatype = String. A longer description of the evidence.",
                        "type" : "string"
                    },
                    "genre" : {
                        "description" : "Model Primitive Datatype = String. A string that describes the type of evidence. For example, Poetry, Prose, Film.",
                        "type" : "string"
                    },
                    "name" : {
                        "description" : "Model Primitive Datatype = String. The name of the evidence.",
                        "type" : "string"
                    },
                    "narrative" : {
                        "description" : "Model Primitive Datatype = String. A narrative that describes the evidence and process of achievement that led to an assertion. Markdown allowed.",
                        "type" : "string"
                    }
                },
                "required" : [ "name" ],
                "additionalProperties" : false
            },
            "IdentityDType" : {
                "description" : "A collection of information about the recipient of an achievement assertion.",
                "type" : "object",
                "properties" : {
                    "id" : {
                        "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the Identity.",
                        "type" : "string"
                    },
                    "type" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this entity. The type should identify the property by which the recipient of an Assertion is identified. This value should be an IRI mapped in the present context. For example, email maps to 'clr:email' and indicates that the identity of the IdentityObject will represent a value of a Profile’s email property. Currently the only supported value for many platforms that implement CLR is email, but other properties are available.",
                        "type" : "string"
                    },
                    "identity" : {
                        "description" : "Model Primitive Datatype = String. Either the hash of the identity or the plaintext value. If it's possible that the plaintext transmission and storage of the identity value would leak personally identifiable information where there is an expectation of privacy, it is strongly recommended that an IdentityHash be used.",
                        "type" : "string"
                    },
                    "hashed" : {
                        "description" : "Model Primitive Datatype = Boolean. Whether or not the identity value is hashed.",
                        "type" : "boolean"
                    },
                    "salt" : {
                        "description" : "Model Primitive Datatype = String. If the recipient is hashed, this should contain the string used to salt the hash. If this value is not provided, it should be assumed that the hash was not salted.",
                        "type" : "string"
                    }
                },
                "required" : [ "type","identity","hashed" ],
                "additionalProperties" : false
            },
            "ProfileDType" : {
                "description" : "A Profile is a collection of information that describes the person or organization using Comprehensive Learner Record (CLR). Publishers, learners, and issuers must be represented as profiles. Recipients, endorsers, or other entities may also be represented using this vocabulary.",
                "type" : "object",
                "properties" : {
                    "id" : {
                        "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the Profile.",
                        "type" : "string"
                    },
                    "type" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this object. Normally 'Profile'.",
                        "type" : "string"
                    },
                    "address" : {
                        "$ref" : "#/components/schemas/AddressDType"
                    },
                    "description" : {
                        "description" : "Model Primitive Datatype = String. A short description of the individual or organization.",
                        "type" : "string"
                    },
                    "email" : {
                        "description" : "Model Primitive Datatype = String. A contact email address for the individual or organization.",
                        "type" : "string"
                    },
                    "endorsements" : {
                        "description" : "Allows endorsers to make specific claims about the individual or organization represented by this profile.",
                        "type" : "array",
                        "minItems" : 0,
                        "items" : {
                            "$ref" : "#/components/schemas/EndorsementBaseDType"
                        }
                    },
                    "image" : {
                        "description" : "Model Primitive Datatype = NormalizedString. IRI of an image representing the individual or organization. May be a DATA URI or the URL where the image may be found.",
                        "type" : "string"
                    },
                    "name" : {
                        "description" : "Model Primitive Datatype = String. The name of the individual or organization.",
                        "type" : "string"
                    },
                    "publicKey" : {
                        "$ref" : "#/components/schemas/CryptographicKeyDType"
                    },
                    "revocationList" : {
                        "$ref" : "#/components/schemas/RevocationListDType"
                    },
                    "sourcedId" : {
                        "description" : "Model Primitive Datatype = String. The individual's unique 'sourcedId' value, which is used for providing interoperability with IMS Learning Information Services (LIS).",
                        "type" : "string"
                    },
                    "studentId" : {
                        "description" : "Model Primitive Datatype = String. An institution's student identifier for the person. This is frequently issued through a Student Information System.",
                        "type" : "string"
                    },
                    "telephone" : {
                        "description" : "Model Primitive Datatype = String. Primary phone number for the individual or organization.",
                        "type" : "string"
                    },
                    "url" : {
                        "description" : "Model Primitive Datatype = AnyURI. Web resource that uniquely represents or belongs to the individual. This may be a resource about the individual, hosting provided by the instution to the individual, or an web resource independently controlled by the individual.",
                        "type" : "string",
                        "format" : "uri"
                    },
                    "verification" : {
                        "$ref" : "#/components/schemas/VerificationDType"
                    }
                },
                "required" : [ "id","name" ],
                "additionalProperties" : true
            },
            "ResultDType" : {
                "description" : "Describes a result of an achievement.",
                "type" : "object",
                "properties" : {
                    "id" : {
                        "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the object.",
                        "type" : "string"
                    },
                    "type" : {
                        "description" : "The JSON-LD type of this object. The strongly typed value identifies the type of result.",
                        "type" : "string",
                        "enum" : [ "GradePointAverage","LetterGrade","Percent","PerformanceLevel","PredictedScore","Result","RawScore","RubricScore","ScaledScore" ]
                    },
                    "name" : {
                        "description" : "Model Primitive Datatype = String. The name of the result.",
                        "type" : "string"
                    },
                    "value" : {
                        "description" : "Model Primitive Datatype = String. A grade or value representing the result of the performance, or demonstration, of the achievement.  For example, 'A' if the recipient received a grade of A in the class. ",
                        "type" : "string"
                    }
                },
                "required" : [ "type","value" ],
                "additionalProperties" : false
            },
            "ResultDescriptionDType" : {
                "description" : "Describes a possible achievement result.",
                "type" : "object",
                "properties" : {
                    "id" : {
                        "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the ResultDescription.",
                        "type" : "string"
                    },
                    "type" : {
                        "description" : "The JSON-LD type of this object. The strongly typed value identifies the type of result.",
                        "type" : "string",
                        "enum" : [ "GradePointAverage","LetterGrade","Percent","PerformanceLevel","PredictedScore","Result","RawScore","RubricScore","ScaledScore" ]
                    },
                    "name" : {
                        "description" : "Model Primitive Datatype = String. The name of the result.",
                        "type" : "string"
                    },
                    "resultMin" : {
                        "description" : "Model Primitive Datatype = String. The minimum possible result that may be asserted.",
                        "type" : "string"
                    },
                    "resultMax" : {
                        "description" : "Model Primitive Datatype = String. The maximum possible result that may be asserted.",
                        "type" : "string"
                    }
                },
                "required" : [ "type" ],
                "additionalProperties" : false
            },
            "RevocationListDType" : {
                "description" : "The Revocation List is a document that describes Assertions an Issuer has revoked that used the signed verification method. If you find the Assertion in the revokedAssertions list, it has been revoked.",
                "type" : "object",
                "properties" : {
                    "id" : {
                        "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the RevocationList.",
                        "type" : "string"
                    },
                    "type" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The JSON-LD type of this entity. Normally 'RevocationList'.",
                        "type" : "string"
                    },
                    "issuer" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The id of the Issuer.",
                        "type" : "string"
                    },
                    "revokedAssertions" : {
                        "description" : "Model Primitive Datatype = NormalizedString. The id of an assertion that has been revoked.",
                        "type" : "array",
                        "minItems" : 0,
                        "items" : {
                            "type" : "string"
                        }
                    }
                },
                "required" : [ "id" ],
                "additionalProperties" : false
            },
            "VerificationDType" : {
                "description" : "A collection of information allowing an inspector to verify an Assertion.",
                "type" : "object",
                "properties" : {
                    "id" : {
                        "description" : "Model Primitive Datatype = NormalizedString. Unique IRI for the Verification.",
                        "type" : "string"
                    },
                    "type" : {
                        "description" : "The JSON-LD type of this object. The strongly typed value indicates the verification method.",
                        "type" : "string",
                        "enum" : [ "Hosted","HostedAssertion","Signed","SignedAssertion","Verification" ]
                    },
                    "allowedOrigins" : {
                        "description" : "Model Primitive Datatype = String. The host registered name subcomponent of an allowed origin. Any given id URI will be considered valid.",
                        "type" : "array",
                        "minItems" : 0,
                        "items" : {
                            "type" : "string"
                        }
                    },
                    "creator" : {
                        "description" : "Model Primitive Datatype = AnyURI. The URI of the CryptographicKey with the public key used to verify the signed Assertion. If not present, verifiers will check publicKey property of the referenced issuer Profile. If present, the URI must match the CryptographicKey id in the issuer Profile as well.",
                        "type" : "string",
                        "format" : "uri"
                    },
                    "startsWith" : {
                        "description" : "Model Primitive Datatype = String. The URI fragment that the verification property must start with. Valid Assertions must have an id within this scope. Multiple values allowed, and Assertions will be considered valid if their id starts with one of these values.",
                        "type" : "array",
                        "minItems" : 0,
                        "items" : {
                            "type" : "string"
                        }
                    },
                    "verificationProperty" : {
                        "description" : "Model Primitive Datatype = String. The property to be used for verification. Only 'id' is supported. Verifiers will consider 'id' the default value if verificationProperty is omitted or if an issuer Profile has no explicit verification instructions, so it may be safely omitted.",
                        "type" : "string"
                    }
                },
                "required" : [ "type" ],
                "additionalProperties" : false
            },
            "imsx_CodeMinorDType" : {
                "description" : "This is the container for the set of code minor status codes reported in the responses from the Service Provider.",
                "type" : "object",
                "properties" : {
                    "imsx_codeMinorField" : {
                        "description" : "Each reported code minor status code.",
                        "type" : "array",
                        "minItems" : 1,
                        "items" : {
                            "$ref" : "#/components/schemas/imsx_CodeMinorFieldDType"
                        }
                    }
                },
                "required" : [ "imsx_codeMinorField" ],
                "additionalProperties" : false
            },
            "imsx_CodeMinorFieldDType" : {
                "description" : "This is the container for a single code minor status code.",
                "type" : "object",
                "properties" : {
                    "imsx_codeMinorFieldName" : {
                        "description" : "Model Primitive Datatype = NormalizedString. Tiis should contain the identity of the system that has produced the code minor status code report.",
                        "type" : "string"
                    },
                    "imsx_codeMinorFieldValue" : {
                        "description" : "The code minor status code (this is a value from the corresponding enumerated vocabulary).",
                        "type" : "string",
                        "enum" : [ "forbidden","fullsuccess","internal_server_error","invalid_data","invalid_query_parameter","server_busy","unauthorizedrequest" ]
                    }
                },
                "required" : [ "imsx_codeMinorFieldName","imsx_codeMinorFieldValue" ],
                "additionalProperties" : false
            },
            "imsx_StatusInfoDType" : {
                "description" : "This is the container for the status code and associated information returned within the HTTP messages received from the Service Provider.",
                "type" : "object",
                "properties" : {
                    "imsx_codeMajor" : {
                        "description" : "The code major value (from the corresponding enumerated vocabulary).",
                        "type" : "string",
                        "enum" : [ "success","failure","processing","unsupported" ]
                    },
                    "imsx_severity" : {
                        "description" : "The severity value (from the corresponding enumerated vocabulary).",
                        "type" : "string",
                        "enum" : [ "status","warning","error" ]
                    },
                    "imsx_description" : {
                        "description" : "Model Primitive Datatype = String. A human readable description supplied by the entity creating the status code information.",
                        "type" : "string"
                    },
                    "imsx_codeMinor" : {
                        "$ref" : "#/components/schemas/imsx_CodeMinorDType"
                    }
                },
                "required" : [ "imsx_codeMajor","imsx_severity" ],
                "additionalProperties" : false
            }
        }
    }
}
        

B2 Comprehensive Learner Record Service OpenAPI YAML Definition Listing

B2.1 OpenAPI 2.0 YAML Listing

The OpenAPI 2 (YAML) listing (based upon [OAS, 14]) is shown below (the OpenAPI YAML is available at: https://purl.imsglobal.org/spec/clr/v1p0/schema/openapi/imsclr_v1p0.yaml).

# #####################################################################################
# YAML File Information
# #####################################################################################
# 
# Author:         Jeff Bohrer (IMS Global), Andy Miller (IMS Global)
# Date:           August 26, 2019
# Version:        2.0
# Status:         IMS Candidate Final
# Description:    The Comprehensive Learner Record Service enables the exchange of data about users and their achievements between a Comprehensive Learner Record Service Provider and the consumers of the associated data. This service has been described using the IMS Model Driven Specification development approach, this being the Platform Specific Model (PSM) of the service.
# 
# History:        This is the second release of the Comprehensive Learner Record Service definition.
# 
# License:        IPR and Distribution Notices
# 
#                 This machine readable file is derived from the IMS Comprehensive Learner Record Service Version 1.0
#                 found at http://www.imsglobal.org/clr and the original IMS Global schema binding or code base
#                 http://www.imsglobal.org/clr.
# 
#                 Recipients of this document are requested to submit, with their comments, notification of any relevant 
#                 patent claims or other intellectual property rights of which they may be aware that might be infringed by
#                 any implementation of the specification set forth in this document, and to provide supporting documentation.
# 
#                 IMS takes no position regarding the validity or scope of any intellectual property or other rights that might
#                 be claimed to pertain to the implementation or use of the technology described in this document or the extent 
#                 to which any license under such rights might or might not be available; neither does it represent that it has 
#                 made any effort to identify any such rights. Information on IMS procedures with respect to rights in IMS 
#                 specifications can be found at the IMS Global Intellectual Property Rights web page: http://www.imsglobal.org/ipr/imsipr_policyFinal.pdf.
# 
#                 Copyright (c) IMS Global Learning Consortium 1999-2019. All Rights Reserved.
# 
#                 Use of this specification to develop products or services is governed by the license with IMS found on the IMS website: http://www.imsglobal.org/license.html.
# 
#                 Permission is granted to all parties to use excerpts from this document as needed in producing requests for proposals.
# 
#                 The limited permissions granted above are perpetual and will not be revoked by IMS or its successors or assigns.
# 
#                 THIS SPECIFICATION IS BEING OFFERED WITHOUT ANY WARRANTY WHATSOEVER, AND IN PARTICULAR, ANY WARRANTY OF NONINFRINGEMENT IS
#                 EXPRESSLY DISCLAIMED. ANY USE OF THIS SPECIFICATION SHALL BE MADE ENTIRELY AT THE IMPLEMENTERS OWN RISK, AND NEITHER THE CONSORTIUM
#                 NOR ANY OF ITS MEMBERS OR SUBMITTERS, SHALL HAVE ANY LIABILITY WHATSOEVER TO ANY IMPLEMENTER OR THIRD PARTY FOR ANY DAMAGES OF
#                 ANY NATURE WHATSOEVER, DIRECTLY OR INDIRECTLY, ARISING FROM THE USE OF THIS SPECIFICATION.
# 
# Source UML File Information
# ===========================
# The source file information must be supplied as an XMI file (without diagram layout information).
# The supported UML authoring tools are:
# (a) Poseidon - v6 (and later)
# (b) Papyrus - v1.1.3 (and later)
# 
# Source XSLT File Information
# ============================
# XSL Generator:    Specificationv1p0_GenerationToolv1.xsl
# XSLT Processor:   Saxon
# Release:          1.0
# Date:             31st July, 2017
# Autogen Engineer: Colin Smythe (IMS Global, UK)
# Autogen Date:     2019-08-21
# 
# IMS Global Auto-generation Binding Tool-kit (I-BAT)
# ===================================================
# This file was auto-generated using the IMS Global Binding Auto-generation Tool-kit (I-BAT).  While every
# attempt has been made to ensure that this tool auto-generates the files correctly, users should be aware
# that this is an experimental tool.  Permission is given to make use of this tool.  IMS Global makes no
# claim on the materials created by third party users of this tool.  Details on how to use this tool
# are contained in the IMS Global "I-BAT" documentation available at the IMS Global web-site:
# http://www.imsglobal.org.
# 
# Tool Copyright:  2012-2019  (c) IMS Global Learning Consortium Inc.  All Rights Reserved.
# 
# #####################################################################################

swagger: '2.0'

#####################################################################################
#                               API Information                                     #
#####################################################################################
info: 
    version: '1.0'
    title: Comprehensive Learner Record Service OpenAPI (YAML) Definition
    description: The Comprehensive Learner Record Service enables the exchange of data about users and their achievements between a Comprehensive Learner Record Service Provider and the consumers of the associated data. This service has been described using the IMS Model Driven Specification development approach, this being the Platform Specific Model (PSM) of the service.
    termsOfService: Permission is granted to all parties to use excerpts from this document as needed in producing requests for proposals. The limited permissions granted above are perpetual and will not be revoked by IMS or its successors or assigns. THIS API DEFINITION IS BEING OFFERED WITHOUT ANY WARRANTY WHATSOEVER, AND IN PARTICULAR, ANY WARRANTY OF NONINFRINGEMENT IS EXPRESSLY DISCLAIMED. ANY USE OF THIS SPECIFICATION SHALL BE MADE ENTIRELY AT THE IMPLEMENTERS OWN RISK, AND NEITHER THE  CONSORTIUM, NOR ANY OF ITS MEMBERS OR SUBMITTERS, SHALL HAVE ANY LIABILITY WHATSOEVER TO ANY IMPLEMENTER OR THIRD PARTY FOR ANY DAMAGES OF ANY NATURE WHATSOEVER,  DIRECTLY OR INDIRECTLY, ARISING FROM THE USE OF THIS API DEFINITION.
    contact: 
        name: Lisa Mattson (COO), IMS Global
        url: http://www.imsglobal.org
        email: lmattson@imsglobal.org
    license: 
        name: IMS Global
        url: https://www.imsglobal.org/license.html

#####################################################################################
#                   Host, Base Path, Schemes and Content Types                      #
#####################################################################################
host: www.imsglobal.org
basePath: /ims/clr/v1p0/
schemes: 
    - http
    - https
consumes: 
    - application/json
produces: 
    - application/json

#####################################################################################
#                                  Tags                                             #
#####################################################################################
tags: 
    - name: AssertionsManager
      description: |
        The set of service operations that manage access to Assertions.
    - name: ClrsManager
      description: |
        The set of service operations that manage access to CLRs.
    - name: DiscoveryManager
      description: |
        The set of service operations that manage access to the DiscoveryDocument.
    - name: EndorsementsManager
      description: |
        The set of service operations that manage access to Endorsements.
    - name: KeysManager
      description: |
        The set of service operations that manage access to CryptographicKeys.

#####################################################################################
#                                 Security                                          #
#####################################################################################
securityDefinitions:
    OAuth2CCG:
        type: oauth2
        description: OAuth 2.0 Client Credentials authorization per IMS Security Framework.
        flow: application
        tokenUrl: /token
        scopes: 
            https://purl.imsglobal.org/spec/clr/v1p0/scope/delete: Grants the app permission to delete your comprehensive learner records on this host.
            https://purl.imsglobal.org/spec/clr/v1p0/scope/readonly: Grants the app permission to read your comprehensive learner records on this host.
            https://purl.imsglobal.org/spec/clr/v1p0/scope/replace: Grants the app permission to create or replace your comprehensive learner records on this host.


#####################################################################################
#                                   Paths                                           #
#####################################################################################
paths: 
    /assertions/{id}:
        get:
            operationId: getAssertion
            summary: The REST read request message for the getAssertion() API call.
            tags: 
                - AssertionsManager
            description: |
                Returns the current version of the specified Assertion. This operation is used to verify a Hosted Assertion.
            parameters: 
                - name: id
                  in: path
                  description: |
                      The unique identifier of the Assertion.
                  required: true
                  type: string
            security:
                - OAuth2CCG:
            responses: 
                "200" : 
                    description: |
                        'OK' - the resource is returned in the payload.
                    schema: 
                        $ref: "#/definitions/AssertionDType"
                "404" : 
                    description: |
                        'Not Found' – there is no resource behind the URI.
                "default" : 
                    description: |
                        The request was not completed successfully.

    /clrs:
        get:
            operationId: getClrs
            summary: The REST read request message for the getClrs() API call.
            tags: 
                - ClrsManager
            description: |
                The set of CLRs the user is authorized to access are returned in the payload of the response message.
            parameters: 
                - name: limit
                  in: query
                  description: |
                      The number of results to return.
                  required: false
                  type: integer
                  format: int32
                  allowEmptyValue: false
                  default: 100
                  minimum: 1
                - name: offset
                  in: query
                  description: |
                      The index of the first record to return. (zero indexed)
                  required: false
                  type: integer
                  format: int32
                  allowEmptyValue: false
                  minimum: 0
                - name: since
                  in: query
                  description: |
                      Retrieve CLRs that were issued after the provided timestamp. Must be an ISO 8601 compatible timestamp with a time zone indicator.
                  required: false
                  type: string
                  format: date-time
                  allowEmptyValue: false
            security:
                - OAuth2CCG:
                    - https://purl.imsglobal.org/spec/clr/v1p0/scope/readonly
            responses: 
                "200" : 
                    description: |
                        'OK' - the resource is returned in the payload.
                    schema: 
                        $ref: "#/definitions/CLRSetDType"
                "400" : 
                    description: |
                        'Bad Request' – the request was invalid or cannot be served. The exact error should be explained in the error payload.
                    schema: 
                        $ref: "#/definitions/imsx_StatusInfoDType"
                "401" : 
                    description: |
                        'Unauthorized' – the request requires an user authentication.
                    schema: 
                        $ref: "#/definitions/imsx_StatusInfoDType"
                "403" : 
                    description: |
                        'Forbidden' – the server understood the request, but is refusing it or the access is not allowed.
                    schema: 
                        $ref: "#/definitions/imsx_StatusInfoDType"
                "404" : 
                    description: |
                        'Not Found' – there are no resources behind the URI.
                    schema: 
                        $ref: "#/definitions/imsx_StatusInfoDType"
                "default" : 
                    description: |
                        The request was not completed successfully. The exact error should be explained in the error payload.
                    schema: 
                        $ref: "#/definitions/imsx_StatusInfoDType"
        post:
            operationId: replaceClr
            summary: The REST createbp request message for the replaceClr() API call.
            tags: 
                - ClrsManager
            description: |
                Create or replace a CLR.
            security:
                - OAuth2CCG:
                    - https://purl.imsglobal.org/spec/clr/v1p0/scope/replace
            responses: 
                "200" : 
                    description: |
                        'OK' – the resource was successfully replaced.
                    schema: 
                        $ref: "#/definitions/CLRDType"
                "201" : 
                    description: |
                        'Created` – the resource was successfully created.
                    schema: 
                        $ref: "#/definitions/CLRDType"
                "304" : 
                    description: |
                        'Not Modified' – the client can use cached data.
                "400" : 
                    description: |
                        'Bad Request' – the request was invalid or cannot be served. The exact error should be explained in the error payload.
                    schema: 
                        $ref: "#/definitions/imsx_StatusInfoDType"
                "401" : 
                    description: |
                        'Unauthorized' – the request requires user authentication.
                    schema: 
                        $ref: "#/definitions/imsx_StatusInfoDType"
                "403" : 
                    description: |
                        'Forbidden' – the server understood the request, but is refusing it or the access is not allowed.
                    schema: 
                        $ref: "#/definitions/imsx_StatusInfoDType"
                "404" : 
                    description: |
                        'Not Found' – there is no resource behind the URI.
                    schema: 
                        $ref: "#/definitions/imsx_StatusInfoDType"
                "default" : 
                    description: |
                        The request was not completed successfully. The exact error should be explained in the error payload.
                    schema: 
                        $ref: "#/definitions/imsx_StatusInfoDType"

    /clrs/{id}:
        delete:
            operationId: deleteClr
            summary: The REST delete request message for the deleteClr() API call.
            tags: 
                - ClrsManager
            description: |
                Delete a CLR.
            parameters: 
                - name: id
                  in: path
                  description: |
                      The unique identifier of the CLR to delete.
                  required: true
                  type: string
            security:
                - OAuth2CCG:
                    - https://purl.imsglobal.org/spec/clr/v1p0/scope/delete
            responses: 
                "204" : 
                    description: |
                        'No Content' – The resource was successfully deleted.
                "400" : 
                    description: |
                        'Bad Request' – The request was invalid or cannot be served. The exact error should be explained in the error payload.
                    schema: 
                        $ref: "#/definitions/imsx_StatusInfoDType"
                "401" : 
                    description: |
                        'Unauthorized' – The request requires an user authentication.
                    schema: 
                        $ref: "#/definitions/imsx_StatusInfoDType"
                "403" : 
                    description: |
                        'Forbidden' – The server understood the request, but is refusing it or the access is not allowed.
                    schema: 
                        $ref: "#/definitions/imsx_StatusInfoDType"
                "404" : 
                    description: |
                        'Not found' – There is no resource behind the URI.
                    schema: 
                        $ref: "#/definitions/imsx_StatusInfoDType"
                "default" : 
                    description: |
                        The request was not completed successfully. The exact error should be explained in the error payload.
                    schema: 
                        $ref: "#/definitions/imsx_StatusInfoDType"

    /discovery:
        get:
            operationId: getDiscoveryDocument
            summary: The REST read request message for the getDiscoveryDocument() API call.
            tags: 
                - DiscoveryManager
            description: |
                Returns the DiscoveryDocument if the provider supports dynamic CLR consumer registration.
            security:
                - OAuth2CCG:
            responses: 
                "200" : 
                    description: |
                        'OK' - the resource is returned in the payload.
                    schema: 
                        $ref: "#/definitions/DiscoveryDocumentDType"
                "404" : 
                    description: |
                        'Not Found' – there is no resource behind the URI.
                "421" : 
                    description: |
                        'Misdirected Request' - the request was not made over secure TLS 1.2 or 1.3 protocol.
                "default" : 
                    description: |
                        The request was not completed successfully.

    /endorsements/{id}:
        get:
            operationId: getEndorsement
            summary: The REST read request message for the getEndorsement() API call.
            tags: 
                - EndorsementsManager
            description: |
                Returns the current version of the specified Endorsement. This operation is used to verify a Hosted Endorsements
            parameters: 
                - name: id
                  in: path
                  description: |
                      The unique identifier of the Endorsement
                  required: true
                  type: string
            security:
                - OAuth2CCG:
            responses: 
                "200" : 
                    description: |
                        'OK' - the resource is returned in the payload.
                    schema: 
                        $ref: "#/definitions/EndorsementDType"
                "404" : 
                    description: |
                        'Not Found' – there is no resource behind the URI.
                "default" : 
                    description: |
                        The request was not completed successfully.

    /keys/{id}:
        get:
            operationId: getKey
            summary: The REST read request message for the getKey() API call.
            tags: 
                - KeysManager
            description: |
                Returns the current version of the specified CryptographicKey. This operation is used to help verify a Signed Assertion.
            parameters: 
                - name: id
                  in: path
                  description: |
                      The unique identifier of the CryptographicKey.
                  required: true
                  type: string
            security:
                - OAuth2CCG:
            responses: 
                "200" : 
                    description: |
                        'OK' - the resource is returned in the payload.
                    schema: 
                        $ref: "#/definitions/CryptographicKeyDType"
                "404" : 
                    description: |
                        'Not Found' – there is no resource behind the URI.
                "default" : 
                    description: |
                        The request was not completed successfully.


#####################################################################################
#                               Definitions                                         #
#####################################################################################
definitions: 
    AchievementDType:
        description: |
            An accomplishment such as completing a degree, mastering a competency, or course completion that may be asserted about one or more learners.
        type: object
        required: 
            - id
            - type
            - name
            - issuer
            - typeLabel
        properties: 
            id: 
                description: Unique IRI for the Achievement. Model Primitive Datatype = NormalizedString.
                type: string
            type: 
                description: |
                    The JSON-LD type of this object. Normally 'Achievement'.
                type: string
                enum: 
                   - Achievement
                   - BadgeClass
                   - CASECompetencyStatement
                   - CTDLCredential
                   - IMSAssessmentResult
                   - PESCTranscript
            alignments: 
                description: |
                    Alignment objects describe an alignment between this achievement and a node in an educational framework.
                type: array
                minItems: 0
                items: 
                    $ref: "#/definitions/AlignmentDType"
            creditsAvailable: 
                description: Credit hours associated with this entity, or credit hours possible. For example '3.0'. Model Primitive Datatype = Float.
                type: number
                format: float
            description: 
                description: A short description of the achievement. May be the same as name if no description is available. Model Primitive Datatype = String.
                type: string
            endorsements: 
                description: |
                    Allows endorsers to make specific claims about the Achievement.
                type: array
                minItems: 0
                items: 
                    $ref: "#/definitions/EndorsementBaseDType"
            humanCode: 
                description: The code, generally human readable, associated with an achievement. Model Primitive Datatype = String.
                type: string
            name: 
                description: The name of the achievement. Model Primitive Datatype = String.
                type: string
            fieldOfStudy: 
                description: Category, subject, area of study,  discipline, or general branch of knowledge. Examples include Business, Education, Psychology, and Technology.  Model Primitive Datatype = String.
                type: string
            image: 
                description: IRI of an image representing the achievement. May be a Data URI or the URL where the image may be found. Model Primitive Datatype = NormalizedString.
                type: string
            issuer: 
                $ref: "#/definitions/ProfileDType"
            level: 
                description: Text that describes the level of achievement apart from how the achievement was performed or demonstrated. Examples would include 'Level 1', 'Level 2', 'Level 3', or 'Bachelors', 'Masters', 'Doctoral'. Model Primitive Datatype = String.
                type: string
            requirement: 
                $ref: "#/definitions/CriteriaDType"
            resultDescriptions: 
                description: |
                    The types of result that may be asserted with this achievement.
                type: array
                minItems: 0
                items: 
                    $ref: "#/definitions/ResultDescriptionDType"
            specialization: 
                description: Name given to the focus, concentration, or specific area of study defined in the achievement. Examples include Entrepreneurship, Technical Communication, and Finance. Model Primitive Datatype = String.
                type: string
            tags: 
                description: Tags that describe the type of achievement. Model Primitive Datatype = String.
                type: array
                minItems: 0
                items: 
                    type: string
            typeLabel: 
                description: The type of achievement matching one  from an IMS recommended taxonomy of achievement types, or any text string. Model Primitive Datatype = String.
                type: string
        additionalProperties: true
    AddressDType:
        description: |
            Based on schema.org Address object.
        type: object
        properties: 
            id: 
                description: Unique IRI for the Address. Model Primitive Datatype = NormalizedString.
                type: string
            type: 
                description: The JSON-LD type of this object. Normally 'Address'. Model Primitive Datatype = NormalizedString.
                type: string
            addressCountry: 
                description: The country. For example, USA. You can also provide the two-letter ISO 3166-1 alpha-2 country code. Model Primitive Datatype = String.
                type: string
            addressLocality: 
                description: The locality. For example, Mountain View. Model Primitive Datatype = String.
                type: string
            addressRegion: 
                description: The region. For example, CA. Model Primitive Datatype = String.
                type: string
            postalCode: 
                description: The postal code. For example, 94043. Model Primitive Datatype = String.
                type: string
            postOfficeBoxNumber: 
                description: The post office box number for PO box addresses. Model Primitive Datatype = String.
                type: string
            streetAddress: 
                description: The street address. For example, 1600 Amphitheatre Pkwy. Model Primitive Datatype = String.
                type: string
        additionalProperties: false
    AlignmentDType:
        description: |
            Alignment is based on schema.org’s AlignmentObject and uses IRIs from that vocabulary.
        type: object
        required: 
            - targetName
            - targetUrl
        properties: 
            id: 
                description: Unique IRI for the object. Model Primitive Datatype = NormalizedString.
                type: string
            type: 
                description: The JSON-LD type of this entity. Normally 'Alignment'. Model Primitive Datatype = NormalizedString.
                type: string
            educationalFramework: 
                description: The framework to which the resource being described is aligned. Model Primitive Datatype = String.
                type: string
            targetCode: 
                description: If applicable, a locally unique string identifier that identifies the alignment target within its framework. Model Primitive Datatype = String.
                type: string
            targetDescription: 
                description: Short description of the alignment target. Model Primitive Datatype = String.
                type: string
            targetName: 
                description: The name of a node in an established educational framework. Model Primitive Datatype = String.
                type: string
            targetUrl: 
                description: The URL of a node in an established educational framework. Model Primitive Datatype = AnyURI.
                type: string
                format: uri
        additionalProperties: false
    ArtifactDType:
        description: |
            An artifact that is part of an evidence object.
        type: object
        required: 
            - name
        properties: 
            type: 
                description: The JSON-LD type of the object. Normally 'Artifact'. Model Primitive Datatype = NormalizedString.
                type: string
            description: 
                description: A description of the artifact. Model Primitive Datatype = String.
                type: string
            name: 
                description: The name of the artifact. Model Primitive Datatype = String.
                type: string
            url: 
                description: IRI of the artifact. May be a Data URI or the URL where the artifact may be found. Model Primitive Datatype = AnyURI.
                type: string
                format: uri
        additionalProperties: false
    AssertionDType:
        description: |
            Assertions are representations of an Achievement awarded to a Learner.  It is used to share information about the Achievement Assertion, such as a result and verification method. Assertions are packaged for transmission as JSON objects with a set of mandatory and optional properties.
        type: object
        required: 
            - id
            - type
        properties: 
            id: 
                description: Unique IRI for the Assertion. Model Primitive Datatype = NormalizedString.
                type: string
            type: 
                description: The JSON-LD type of this object. Normally 'Assertion'. Model Primitive Datatype = NormalizedString.
                type: string
            achievement: 
                $ref: "#/definitions/AchievementDType"
            creditsEarned: 
                description: The number of credits earned, generally in semester or quarter credit hours.  This field correlates with the Achievement creditsAvailable field. Model Primitive Datatype = Float.
                type: number
                format: float
            endDate: 
                description: If present, the assertion is not valid after this date. Model Primitive Datatype = DateTime.
                type: string
                format: date-time
            endorsements: 
                description: |
                    Allows endorsers to make specific claims about the assertion.
                type: array
                minItems: 0
                items: 
                    $ref: "#/definitions/EndorsementBaseDType"
            evidence: 
                description: |
                    Evidence describing the work that the recipient did to earn the achievement. This can be a webpage that links out to other pages if linking directly to the work is infeasible.
                type: array
                minItems: 0
                items: 
                    $ref: "#/definitions/EvidenceDType"
            image: 
                description: IRI of an image representing the assertion. May be a Data URI or the URL where the image may be found. If the object is an Open Badges 2.0 assertion, the image is a 'Baked Image' as defined by the Open Badges 2.0 specification. Model Primitive Datatype = NormalizedString.
                type: string
            issuedOn: 
                description: Timestamp of when the achievement was awarded. Required unless the assertion is revoked. Model Primitive Datatype = DateTime.
                type: string
                format: date-time
            licenseNumber: 
                description: The license number that was issued with this assertion. Model Primitive Datatype = String.
                type: string
            narrative: 
                description: A narrative that describes the connection between multiple pieces of evidence. Likely only present if evidence is a multi-value array. Markdown allowed. Model Primitive Datatype = String.
                type: string
            recipient: 
                $ref: "#/definitions/IdentityDType"
            results: 
                description: |
                    The results being asserted.
                type: array
                minItems: 0
                items: 
                    $ref: "#/definitions/ResultDType"
            revocationReason: 
                description: Optional published reason for revocation, if revoked. Model Primitive Datatype = String.
                type: string
            revoked: 
                description: Defaults to false if Assertion is not referenced from a revokedAssertions list and may be omitted. See RevocationList. If revoked is true, only revoked and id are required properties, and many issuers strip a hosted Assertion down to only those properties when revoked. Model Primitive Datatype = Boolean.
                type: boolean
            role: 
                description: Role, position, or title of the learner when demonstrating or performing the achievement or evidence of learning being asserted. Examples include 'Student President', 'Intern', 'Captain', etc. Model Primitive Datatype = String.
                type: string
            startDate: 
                description: If present, the assertion is not valid before this date. Model Primitive Datatype = DateTime.
                type: string
                format: date-time
            term: 
                description: The academic term in which this assertion was achieved. Model Primitive Datatype = String.
                type: string
            verification: 
                $ref: "#/definitions/VerificationDType"
        additionalProperties: true
    AssertionBaseDType:
        description: |
            Base class for the two types of assertion objects: Assertion and SignedAssertion.
        type: object
        required: 
            - type
        properties: 
            id: 
                description: Unique IRI for the object. Required if the type is Assertion. Model Primitive Datatype = NormalizedString.
                type: string
            type: 
                description: |
                    The type of the assertion object.  Use the type to recast the object to the appropriate sub-class.
                type: string
                enum: 
                   - Assertion
                   - SignedAssertion
                   - SignedBadge
        additionalProperties: true
    AssociationDType:
        description: |
            Association is based on the CASE CFAssociation object. An Association associates (relates) one Achievement with another Achievement.
        type: object
        required: 
            - associationType
            - sourceId
            - targetId
        properties: 
            id: 
                description: Unique IRI for the Association. Model Primitive Datatype = NormalizedString.
                type: string
            type: 
                description: The JSON-LD type of this object. Normally 'Association'. Model Primitive Datatype = NormalizedString.
                type: string
            associationType: 
                description: |
                    The type of the relationship, used to define the alignment between two achievements.  
                type: string
                enum: 
                   - exactMatchOf
                   - exemplar
                   - hasSkillLevel
                   - isChildOf
                   - isPartOf
                   - isPeerOf
                   - isRelatedTo
                   - precedes
                   - replacedBy
            identifier: 
                description: An unambiguous, synthetic, globally unique identifier for the Association. This is the primary way in which the exchange identification is achieved. Model Primitive Datatype = String.
                type: string
                pattern: "[0-9a-f]{8}-[0-9a-f]{4}-[1-5]{1}[0-9a-f]{3}-[8-9a-b]{1}[0-9a-f]{3}-[0-9a-f]{12}"
            lastChangeDateTime: 
                description: A system generated timestamp of the most recent change to this association. Model Primitive Datatype = DateTime.
                type: string
                format: date-time
            sequenceNumber: 
                description: This is used to order associated objects. Associations can be created through mapping rather than strict hierarchy. As such the presentation of the list cannot be ordered by the objects in the list. They may be different based on the parent being viewed. Model Primitive Datatype = Integer.
                type: integer
                format: int32
            sourceId: 
                description: The 'id' of an Achievement or source of the association. Model Primitive Datatype = NormalizedString.
                type: string
            targetId: 
                description: The 'id' of another Achievement, or target of the association. Model Primitive Datatype = NormalizedString.
                type: string
        additionalProperties: false
    CLRDType:
        description: |
            A collection of assertions for a single person reported by a single publisher.
        type: object
        required: 
            - id
            - assertions
            - issuedOn
            - learner
            - publisher
        properties: 
            id: 
                description: Unique IRI for the CLR. Model Primitive Datatype = NormalizedString.
                type: string
            type: 
                description: The JSON-LD type of this object. Normally 'CLR'. Model Primitive Datatype = NormalizedString.
                type: string
            assertions: 
                description: |
                    The learner's asserted achievements.
                type: array
                minItems: 1
                items: 
                    $ref: "#/definitions/AssertionBaseDType"
            associations: 
                description: |
                    The set of achievement associations in the CLR.
                type: array
                minItems: 0
                items: 
                    $ref: "#/definitions/AssociationDType"
            issuedOn: 
                description: Timestamp of when the CLR was published. Model Primitive Datatype = DateTime.
                type: string
                format: date-time
            learner: 
                $ref: "#/definitions/ProfileDType"
            publisher: 
                $ref: "#/definitions/ProfileDType"
        additionalProperties: false
    CLRSetDType:
        description: |
            A set of CLRs.
        type: object
        properties: 
            id: 
                description: Unique IRI for the ClrSet. Model Primitive Datatype = NormalizedString.
                type: string
            type: 
                description: The JSON-LD type of this object. Normally 'CLRSet'. Model Primitive Datatype = NormalizedString.
                type: string
            clrs: 
                description: |
                    An unordered collection of comprehensive learner records.
                type: array
                minItems: 0
                items: 
                    $ref: "#/definitions/CLRDType"
        additionalProperties: false
    CriteriaDType:
        description: |
            Descriptive metadata about the achievements necessary to be recognized with an Assertion of a particular AchievementType. This data is added to the AchievementType so that it may be rendered when that AchievementType is displayed, instead of simply a link to human-readable criteria external to the Achievement Assertion. Embedding criteria allows either enhancement of an external criteria page or increased portability and ease of use by allowing issuers to skip hosting the formerly-required external criteria page altogether.
        type: object
        required: 
            - id
        properties: 
            id: 
                description: The URI of a webpage that describes in a human-readable format the criteria for the Achievement. Model Primitive Datatype = NormalizedString.
                type: string
            type: 
                description: The JSON-LD type of this object. Normally 'Criteria'. Model Primitive Datatype = NormalizedString.
                type: string
            narrative: 
                description: A narrative of what is needed to earn the achievement. Markdown allowed. Model Primitive Datatype = String.
                type: string
        additionalProperties: true
    CryptographicKeyDType:
        description: |
            Based on the Key class from the W3C Web Payments Community Group Security Vocabulary. A CryptographicKey document identifies and describes a public key used to verify signed Assertions.
        type: object
        required: 
            - id
        properties: 
            id: 
                description: The URI of the CryptographicKey document. Used during signed verification. Model Primitive Datatype = NormalizedString.
                type: string
            type: 
                description: The JSON-LD type of this object. Normally 'CryptographicKey'. Model Primitive Datatype = NormalizedString.
                type: string
            owner: 
                description: The identifier for the Profile that owns this key. Model Primitive Datatype = NormalizedString.
                type: string
            publicKeyPem: 
                description: The PEM key encoding is a widely-used method to express public keys, compatible with almost every Secure Sockets Layer library implementation. Model Primitive Datatype = String.
                type: string
        additionalProperties: false
    DiscoveryDocumentDType:
        description: |
            Configuration information about the provider implementation.
        type: object
        required: 
            - authorizationUrl
            - name
            - privacyPolicyUrl
            - registrationUrl
            - scopesOffered
            - termsOfServiceUrl
            - tokenUrl
        properties: 
            authorizationUrl: 
                description: A fully qualifed URL to the provider's OAuth 2.0 Authorization endpoint. Model Primitive Datatype = AnyURI.
                type: string
                format: uri
            image: 
                description: An image representing the provider. May be a Data URI or the URL where the image may be found. Model Primitive Datatype = NormalizedString.
                type: string
            name: 
                description: The user-facing name of the platform providing CLR services. Model Primitive Datatype = String.
                type: string
            privacyPolicyUrl: 
                description: A fully qualified URL to the provider's privacy policy. Model Primitive Datatype = AnyURI.
                type: string
                format: uri
            registrationUrl: 
                description: A fully qualified URL to the provider's OAuth 2.0 Registration endpoint. Model Primitive Datatype = AnyURI.
                type: string
                format: uri
            scopesOffered: 
                description: An array of OAuth 2.0 Scopes supported by the provider. Model Primitive Datatype = AnyURI.
                type: array
                minItems: 1
                items: 
                    type: string
                    format: uri
            termsOfServiceUrl: 
                description: A fully qualified URL to the provider's terms of service. Model Primitive Datatype = AnyURI.
                type: string
                format: uri
            tokenUrl: 
                description: A fully qualified URL to the provider's OAuth 2.0 Token endpoint. Model Primitive Datatype = AnyURI.
                type: string
                format: uri
        additionalProperties: false
    EndorsementDType:
        description: |
            An endorsement claim.
        type: object
        required: 
            - id
            - type
            - issuedOn
            - issuer
        properties: 
            id: 
                description: Unique IRI for the Endorsement. Model Primitive Datatype = NormalizedString.
                type: string
            type: 
                description: The JSON-LD type of this entity. Normally 'Endorsement'. Model Primitive Datatype = NormalizedString.
                type: string
            claim: 
                $ref: "#/definitions/EndorsementClaimDType"
            issuedOn: 
                description: Timestamp of when the endorsement was published. Model Primitive Datatype = DateTime.
                type: string
                format: date-time
            issuer: 
                $ref: "#/definitions/EndorsementProfileDType"
            verification: 
                $ref: "#/definitions/VerificationDType"
        additionalProperties: false
    EndorsementBaseDType:
        description: |
            Base class for the two types of endorsement objects: Endorsement and SignedEndorsement.
        type: object
        required: 
            - type
        properties: 
            id: 
                description: Unique IRI for the object. Model Primitive Datatype = NormalizedString.
                type: string
            type: 
                description: |
                    The type of the endorsement object. Use the type to recast the object to the appropriate sub-class.
                type: string
                enum: 
                   - Endorsement
                   - SignedEndorsement
        additionalProperties: true
    EndorsementClaimDType:
        description: |
            An entity, identified by an id and additional properties that the endorser would like to claim about that entity.
        type: object
        required: 
            - id
        properties: 
            id: 
                description: The 'id' of the Profile, Achievement, or Assertion being endorsed. Model Primitive Datatype = NormalizedString.
                type: string
            type: 
                description: The JSON-LD type of this entity. Normally 'EndorsementClaim'. Model Primitive Datatype = NormalizedString.
                type: string
            endorsementComment: 
                description: An endorer's comment about the quality or fitness of the endorsed entity. Markdown allowed. Model Primitive Datatype = String.
                type: string
        additionalProperties: true
    EndorsementProfileDType:
        description: |
            A Profile is a collection of information that describes the person or organization using Comprehensive Learner Record (CLR). Publishers, learners, and issuers must be represented as profiles. Recipients, endorsers, or other entities may also be represented using this vocabulary. An EndorsementProfile cannot have endorsements.
        type: object
        required: 
            - id
            - type
            - name
        properties: 
            id: 
                description: Unique IRI for the Profile. Model Primitive Datatype = NormalizedString.
                type: string
            type: 
                description: The JSON-LD type of this entity. Normally 'Profile'. Model Primitive Datatype = NormalizedString.
                type: string
            address: 
                $ref: "#/definitions/AddressDType"
            description: 
                description: A short description of the individual or organization. Model Primitive Datatype = String.
                type: string
            email: 
                description: A contact email address for the individual or organization. Model Primitive Datatype = String.
                type: string
            image: 
                description: Image representing the individual or organization. Model Primitive Datatype = NormalizedString.
                type: string
            name: 
                description: The name of the individual or organization. Model Primitive Datatype = String.
                type: string
            publicKey: 
                $ref: "#/definitions/CryptographicKeyDType"
            revocationList: 
                description: The URI of the Revocation List used for marking revocation of signed Assertions. Model Primitive Datatype = NormalizedString.
                type: string
            sourcedId: 
                description: The individual's unique 'sourcedId' value, which is used for providing interoperability with IMS Learning Information Services (LIS). Model Primitive Datatype = String.
                type: string
            studentId: 
                description: An institution's student identifier for the person. This is frequently issued through a Student Information System. Model Primitive Datatype = String.
                type: string
            telephone: 
                description: Primary phone number for the individual or organization. Model Primitive Datatype = String.
                type: string
            url: 
                description: Web resource that uniquely represents or belongs to the individual. This may be a resource about the individual, hosting provided by the instution to the individual, or an web resource independently controlled by the individual. Model Primitive Datatype = AnyURI.
                type: string
                format: uri
            verification: 
                $ref: "#/definitions/VerificationDType"
        additionalProperties: true
    EvidenceDType:
        description: |
            One or more artifacts that represent supporting evidence for the record. Examples include text, media, websites, etc.
        type: object
        required: 
            - name
        properties: 
            id: 
                description: The URI of a webpage presenting evidence of achievement. Model Primitive Datatype = NormalizedString.
                type: string
            type: 
                description: The JSON-LD type of this entity. Normally 'Evidence'. Model Primitive Datatype = NormalizedString.
                type: string
            artifacts: 
                description: |
                    Artifacts that are part of the evidence.
                type: array
                minItems: 0
                items: 
                    $ref: "#/definitions/ArtifactDType"
            audience: 
                description: A description of the intended audience for a piece of evidence. Model Primitive Datatype = String.
                type: string
            description: 
                description: A longer description of the evidence. Model Primitive Datatype = String.
                type: string
            genre: 
                description: A string that describes the type of evidence. For example, Poetry, Prose, Film. Model Primitive Datatype = String.
                type: string
            name: 
                description: The name of the evidence. Model Primitive Datatype = String.
                type: string
            narrative: 
                description: A narrative that describes the evidence and process of achievement that led to an assertion. Markdown allowed. Model Primitive Datatype = String.
                type: string
        additionalProperties: false
    IdentityDType:
        description: |
            A collection of information about the recipient of an achievement assertion.
        type: object
        required: 
            - type
            - identity
            - hashed
        properties: 
            id: 
                description: Unique IRI for the Identity. Model Primitive Datatype = NormalizedString.
                type: string
            type: 
                description: The JSON-LD type of this entity. The type should identify the property by which the recipient of an Assertion is identified. This value should be an IRI mapped in the present context. For example, email maps to 'clr:email' and indicates that the identity of the IdentityObject will represent a value of a Profile’s email property. Currently the only supported value for many platforms that implement CLR is email, but other properties are available. Model Primitive Datatype = NormalizedString.
                type: string
            identity: 
                description: Either the hash of the identity or the plaintext value. If it's possible that the plaintext transmission and storage of the identity value would leak personally identifiable information where there is an expectation of privacy, it is strongly recommended that an IdentityHash be used. Model Primitive Datatype = String.
                type: string
            hashed: 
                description: Whether or not the identity value is hashed. Model Primitive Datatype = Boolean.
                type: boolean
            salt: 
                description: If the recipient is hashed, this should contain the string used to salt the hash. If this value is not provided, it should be assumed that the hash was not salted. Model Primitive Datatype = String.
                type: string
        additionalProperties: false
    ProfileDType:
        description: |
            A Profile is a collection of information that describes the person or organization using Comprehensive Learner Record (CLR). Publishers, learners, and issuers must be represented as profiles. Recipients, endorsers, or other entities may also be represented using this vocabulary.
        type: object
        required: 
            - id
            - name
        properties: 
            id: 
                description: Unique IRI for the Profile. Model Primitive Datatype = NormalizedString.
                type: string
            type: 
                description: The JSON-LD type of this object. Normally 'Profile'. Model Primitive Datatype = NormalizedString.
                type: string
            address: 
                $ref: "#/definitions/AddressDType"
            description: 
                description: A short description of the individual or organization. Model Primitive Datatype = String.
                type: string
            email: 
                description: A contact email address for the individual or organization. Model Primitive Datatype = String.
                type: string
            endorsements: 
                description: |
                    Allows endorsers to make specific claims about the individual or organization represented by this profile.
                type: array
                minItems: 0
                items: 
                    $ref: "#/definitions/EndorsementBaseDType"
            image: 
                description: IRI of an image representing the individual or organization. May be a DATA URI or the URL where the image may be found. Model Primitive Datatype = NormalizedString.
                type: string
            name: 
                description: The name of the individual or organization. Model Primitive Datatype = String.
                type: string
            publicKey: 
                $ref: "#/definitions/CryptographicKeyDType"
            revocationList: 
                $ref: "#/definitions/RevocationListDType"
            sourcedId: 
                description: The individual's unique 'sourcedId' value, which is used for providing interoperability with IMS Learning Information Services (LIS). Model Primitive Datatype = String.
                type: string
            studentId: 
                description: An institution's student identifier for the person. This is frequently issued through a Student Information System. Model Primitive Datatype = String.
                type: string
            telephone: 
                description: Primary phone number for the individual or organization. Model Primitive Datatype = String.
                type: string
            url: 
                description: Web resource that uniquely represents or belongs to the individual. This may be a resource about the individual, hosting provided by the instution to the individual, or an web resource independently controlled by the individual. Model Primitive Datatype = AnyURI.
                type: string
                format: uri
            verification: 
                $ref: "#/definitions/VerificationDType"
        additionalProperties: true
    ResultDType:
        description: |
            Describes a result of an achievement.
        type: object
        required: 
            - type
            - value
        properties: 
            id: 
                description: Unique IRI for the object. Model Primitive Datatype = NormalizedString.
                type: string
            type: 
                description: |
                    The JSON-LD type of this object. The strongly typed value identifies the type of result.
                type: string
                enum: 
                   - GradePointAverage
                   - LetterGrade
                   - Percent
                   - PerformanceLevel
                   - PredictedScore
                   - Result
                   - RawScore
                   - RubricScore
                   - ScaledScore
            name: 
                description: The name of the result. Model Primitive Datatype = String.
                type: string
            value: 
                description: A grade or value representing the result of the performance, or demonstration, of the achievement.  For example, 'A' if the recipient received a grade of A in the class.  Model Primitive Datatype = String.
                type: string
        additionalProperties: false
    ResultDescriptionDType:
        description: |
            Describes a possible achievement result.
        type: object
        required: 
            - type
        properties: 
            id: 
                description: Unique IRI for the ResultDescription. Model Primitive Datatype = NormalizedString.
                type: string
            type: 
                description: |
                    The JSON-LD type of this object. The strongly typed value identifies the type of result.
                type: string
                enum: 
                   - GradePointAverage
                   - LetterGrade
                   - Percent
                   - PerformanceLevel
                   - PredictedScore
                   - Result
                   - RawScore
                   - RubricScore
                   - ScaledScore
            name: 
                description: The name of the result. Model Primitive Datatype = String.
                type: string
            resultMin: 
                description: The minimum possible result that may be asserted. Model Primitive Datatype = String.
                type: string
            resultMax: 
                description: The maximum possible result that may be asserted. Model Primitive Datatype = String.
                type: string
        additionalProperties: false
    RevocationListDType:
        description: |
            The Revocation List is a document that describes Assertions an Issuer has revoked that used the signed verification method. If you find the Assertion in the revokedAssertions list, it has been revoked.
        type: object
        required: 
            - id
        properties: 
            id: 
                description: Unique IRI for the RevocationList. Model Primitive Datatype = NormalizedString.
                type: string
            type: 
                description: The JSON-LD type of this entity. Normally 'RevocationList'. Model Primitive Datatype = NormalizedString.
                type: string
            issuer: 
                description: The id of the Issuer. Model Primitive Datatype = NormalizedString.
                type: string
            revokedAssertions: 
                description: |
                    The id of an assertion that has been revoked. Model Primitive Datatype = NormalizedString.
                type: array
                minItems: 0
                items: 
                    type: string
        additionalProperties: false
    VerificationDType:
        description: |
            A collection of information allowing an inspector to verify an Assertion.
        type: object
        required: 
            - type
        properties: 
            id: 
                description: Unique IRI for the Verification. Model Primitive Datatype = NormalizedString.
                type: string
            type: 
                description: |
                    The JSON-LD type of this object. The strongly typed value indicates the verification method.
                type: string
                enum: 
                   - Hosted
                   - HostedAssertion
                   - Signed
                   - SignedAssertion
                   - Verification
            allowedOrigins: 
                description: The host registered name subcomponent of an allowed origin. Any given id URI will be considered valid. Model Primitive Datatype = String.
                type: array
                minItems: 0
                items: 
                    type: string
            creator: 
                description: The URI of the CryptographicKey with the public key used to verify the signed Assertion. If not present, verifiers will check publicKey property of the referenced issuer Profile. If present, the URI must match the CryptographicKey id in the issuer Profile as well. Model Primitive Datatype = AnyURI.
                type: string
                format: uri
            startsWith: 
                description: The URI fragment that the verification property must start with. Valid Assertions must have an id within this scope. Multiple values allowed, and Assertions will be considered valid if their id starts with one of these values. Model Primitive Datatype = String.
                type: array
                minItems: 0
                items: 
                    type: string
            verificationProperty: 
                description: The property to be used for verification. Only 'id' is supported. Verifiers will consider 'id' the default value if verificationProperty is omitted or if an issuer Profile has no explicit verification instructions, so it may be safely omitted. Model Primitive Datatype = String.
                type: string
        additionalProperties: false
    imsx_CodeMinorDType:
        description: |
            This is the container for the set of code minor status codes reported in the responses from the Service Provider.
        type: object
        required: 
            - imsx_codeMinorField
        properties: 
            imsx_codeMinorField: 
                description: |
                    Each reported code minor status code.
                type: array
                minItems: 1
                items: 
                    $ref: "#/definitions/imsx_CodeMinorFieldDType"
        additionalProperties: false
    imsx_CodeMinorFieldDType:
        description: |
            This is the container for a single code minor status code.
        type: object
        required: 
            - imsx_codeMinorFieldName
            - imsx_codeMinorFieldValue
        properties: 
            imsx_codeMinorFieldName: 
                description: Tiis should contain the identity of the system that has produced the code minor status code report. Model Primitive Datatype = NormalizedString.
                type: string
            imsx_codeMinorFieldValue: 
                description: |
                    The code minor status code (this is a value from the corresponding enumerated vocabulary).
                type: string
                enum: 
                   - forbidden
                   - fullsuccess
                   - internal_server_error
                   - invalid_data
                   - invalid_query_parameter
                   - server_busy
                   - unauthorizedrequest
        additionalProperties: false
    imsx_StatusInfoDType:
        description: |
            This is the container for the status code and associated information returned within the HTTP messages received from the Service Provider.
        type: object
        required: 
            - imsx_codeMajor
            - imsx_severity
        properties: 
            imsx_codeMajor: 
                description: |
                    The code major value (from the corresponding enumerated vocabulary).
                type: string
                enum: 
                   - success
                   - failure
                   - processing
                   - unsupported
            imsx_severity: 
                description: |
                    The severity value (from the corresponding enumerated vocabulary).
                type: string
                enum: 
                   - status
                   - warning
                   - error
            imsx_description: 
                description: A human readable description supplied by the entity creating the status code information. Model Primitive Datatype = String.
                type: string
            imsx_codeMinor: 
                $ref: "#/definitions/imsx_CodeMinorDType"
        additionalProperties: false
        

B2.2 OpenAPI 3.0 YAML Listing

The OpenAPI 3 (YAML) listing (based upon [OAS, 17]) is shown below (the OpenAPI YAML is available at: https://purl.imsglobal.org/spec/clr/v1p0/schema/openapi/imsclr_v1p0.yaml).

# #####################################################################################
# YAML File Information
# #####################################################################################
# 
# Author:         Jeff Bohrer (IMS Global), Andy Miller (IMS Global)
# Date:           August 26, 2019
# Version:        2.0
# Status:         IMS Candidate Final
# Description:    The Comprehensive Learner Record Service enables the exchange of data about users and their achievements between a Comprehensive Learner Record Service Provider and the consumers of the associated data. This service has been described using the IMS Model Driven Specification development approach, this being the Platform Specific Model (PSM) of the service.
# 
# History:        This is the second release of the Comprehensive Learner Record Service definition.
# 
# License:        IPR and Distribution Notices
# 
#                 This machine readable file is derived from the IMS Comprehensive Learner Record Service Version 1.0
#                 found at http://www.imsglobal.org/clr and the original IMS Global schema binding or code base
#                 http://www.imsglobal.org/clr.
# 
#                 Recipients of this document are requested to submit, with their comments, notification of any relevant 
#                 patent claims or other intellectual property rights of which they may be aware that might be infringed by
#                 any implementation of the specification set forth in this document, and to provide supporting documentation.
# 
#                 IMS takes no position regarding the validity or scope of any intellectual property or other rights that might
#                 be claimed to pertain to the implementation or use of the technology described in this document or the extent 
#                 to which any license under such rights might or might not be available; neither does it represent that it has 
#                 made any effort to identify any such rights. Information on IMS procedures with respect to rights in IMS 
#                 specifications can be found at the IMS Global Intellectual Property Rights web page: http://www.imsglobal.org/ipr/imsipr_policyFinal.pdf.
# 
#                 Copyright (c) IMS Global Learning Consortium 1999-2019. All Rights Reserved.
# 
#                 Use of this specification to develop products or services is governed by the license with IMS found on the IMS website: http://www.imsglobal.org/license.html.
# 
#                 Permission is granted to all parties to use excerpts from this document as needed in producing requests for proposals.
# 
#                 The limited permissions granted above are perpetual and will not be revoked by IMS or its successors or assigns.
# 
#                 THIS SPECIFICATION IS BEING OFFERED WITHOUT ANY WARRANTY WHATSOEVER, AND IN PARTICULAR, ANY WARRANTY OF NONINFRINGEMENT IS
#                 EXPRESSLY DISCLAIMED. ANY USE OF THIS SPECIFICATION SHALL BE MADE ENTIRELY AT THE IMPLEMENTERS OWN RISK, AND NEITHER THE CONSORTIUM
#                 NOR ANY OF ITS MEMBERS OR SUBMITTERS, SHALL HAVE ANY LIABILITY WHATSOEVER TO ANY IMPLEMENTER OR THIRD PARTY FOR ANY DAMAGES OF
#                 ANY NATURE WHATSOEVER, DIRECTLY OR INDIRECTLY, ARISING FROM THE USE OF THIS SPECIFICATION.
# 
# Source UML File Information
# ===========================
# The source file information must be supplied as an XMI file (without diagram layout information).
# The supported UML authoring tools are:
# (a) Poseidon - v6 (and later)
# (b) Papyrus - v1.1.3 (and later)
# 
# Source XSLT File Information
# ============================
# XSL Generator:    Specificationv1p0_GenerationToolv1.xsl
# XSLT Processor:   Saxon
# Release:          1.0
# Date:             31st July, 2017
# Autogen Engineer: Colin Smythe (IMS Global, UK)
# Autogen Date:     2019-08-21
# 
# IMS Global Auto-generation Binding Tool-kit (I-BAT)
# ===================================================
# This file was auto-generated using the IMS Global Binding Auto-generation Tool-kit (I-BAT).  While every
# attempt has been made to ensure that this tool auto-generates the files correctly, users should be aware
# that this is an experimental tool.  Permission is given to make use of this tool.  IMS Global makes no
# claim on the materials created by third party users of this tool.  Details on how to use this tool
# are contained in the IMS Global "I-BAT" documentation available at the IMS Global web-site:
# http://www.imsglobal.org.
# 
# Tool Copyright:  2012-2019  (c) IMS Global Learning Consortium Inc.  All Rights Reserved.
# 
# #####################################################################################

openapi: '3.0.0'

#####################################################################################
#                               API Information                                     #
#####################################################################################
info: 
    version: '1.0'
    title: Comprehensive Learner Record Service OpenAPI (YAML) Definition
    description: The Comprehensive Learner Record Service enables the exchange of data about users and their achievements between a Comprehensive Learner Record Service Provider and the consumers of the associated data. This service has been described using the IMS Model Driven Specification development approach, this being the Platform Specific Model (PSM) of the service.
    termsOfService: https://www.imsglobal.org/license.html
    contact: 
        name: Lisa Mattson (COO), IMS Global
        url: http://www.imsglobal.org
        email: lmattson@imsglobal.org
    license: 
        name: IMS Global
        url: https://www.imsglobal.org/license.html

#####################################################################################
#                                 Servers                                           #
#####################################################################################
servers: 
    - url: www.imsglobal.org/ims/clr/v1p0/
      description: The above Server URL should be changed to the actual server location.

#####################################################################################
#                                  Tags                                             #
#####################################################################################
tags: 
    - name: AssertionsManager
      description: |
        The set of service operations that manage access to Assertions.
    - name: ClrsManager
      description: |
        The set of service operations that manage access to CLRs.
    - name: DiscoveryManager
      description: |
        The set of service operations that manage access to the DiscoveryDocument.
    - name: EndorsementsManager
      description: |
        The set of service operations that manage access to Endorsements.
    - name: KeysManager
      description: |
        The set of service operations that manage access to CryptographicKeys.

#####################################################################################
#                                   Paths                                           #
#####################################################################################
paths: 
    /assertions/{id}:
        get:
            operationId: getAssertion
            summary: The REST read request message for the getAssertion() API call.
            tags: 
                - AssertionsManager
            description: |
                Returns the current version of the specified Assertion. This operation is used to verify a Hosted Assertion.
            parameters: 
                - name: id
                  in: path
                  description: |
                      The unique identifier of the Assertion.
                  required: true
                  schema: 
                      type: string
                  style: simple
            security:
                - OAuth2CCG:
            responses: 
                "200" : 
                    description: |
                        'OK' - the resource is returned in the payload.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/AssertionDType"
                "404" : 
                    description: |
                        'Not Found' – there is no resource behind the URI.
                "default" : 
                    description: |
                        The request was not completed successfully.

    /clrs:
        get:
            operationId: getClrs
            summary: The REST read request message for the getClrs() API call.
            tags: 
                - ClrsManager
            description: |
                The set of CLRs the user is authorized to access are returned in the payload of the response message.
            parameters: 
                - name: limit
                  in: query
                  description: |
                      The number of results to return.
                  required: false
                  schema: 
                      type: integer
                      format: int32
                      default: 100
                      minimum: 1
                  allowEmptyValue: false
                  style: form
                - name: offset
                  in: query
                  description: |
                      The index of the first record to return. (zero indexed)
                  required: false
                  schema: 
                      type: integer
                      format: int32
                      minimum: 0
                  allowEmptyValue: false
                  style: form
                - name: since
                  in: query
                  description: |
                      Retrieve CLRs that were issued after the provided timestamp. Must be an ISO 8601 compatible timestamp with a time zone indicator.
                  required: false
                  schema: 
                      type: string
                      format: date-time
                  allowEmptyValue: false
                  style: form
            security:
                - OAuth2CCG:
                    - https://purl.imsglobal.org/spec/clr/v1p0/scope/readonly
            responses: 
                "200" : 
                    description: |
                        'OK' - the resource is returned in the payload.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/CLRSetDType"
                "400" : 
                    description: |
                        'Bad Request' – the request was invalid or cannot be served. The exact error should be explained in the error payload.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/imsx_StatusInfoDType"
                "401" : 
                    description: |
                        'Unauthorized' – the request requires an user authentication.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/imsx_StatusInfoDType"
                "403" : 
                    description: |
                        'Forbidden' – the server understood the request, but is refusing it or the access is not allowed.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/imsx_StatusInfoDType"
                "404" : 
                    description: |
                        'Not Found' – there are no resources behind the URI.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/imsx_StatusInfoDType"
                "default" : 
                    description: |
                        The request was not completed successfully. The exact error should be explained in the error payload.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/imsx_StatusInfoDType"
        post:
            operationId: replaceClr
            summary: The REST createbp request message for the replaceClr() API call.
            tags: 
                - ClrsManager
            description: |
                Create or replace a CLR.
            security:
                - OAuth2CCG:
                    - https://purl.imsglobal.org/spec/clr/v1p0/scope/replace
            requestBody:
                description: |
                    The CLR to be created or replaced.
                content: 
                    application/json: 
                        schema: 
                            $ref: "#/components/schemas/CLRDType"
                required: true
            responses: 
                "200" : 
                    description: |
                        'OK' – the resource was successfully replaced.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/CLRDType"
                "201" : 
                    description: |
                        'Created` – the resource was successfully created.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/CLRDType"
                "304" : 
                    description: |
                        'Not Modified' – the client can use cached data.
                "400" : 
                    description: |
                        'Bad Request' – the request was invalid or cannot be served. The exact error should be explained in the error payload.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/imsx_StatusInfoDType"
                "401" : 
                    description: |
                        'Unauthorized' – the request requires user authentication.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/imsx_StatusInfoDType"
                "403" : 
                    description: |
                        'Forbidden' – the server understood the request, but is refusing it or the access is not allowed.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/imsx_StatusInfoDType"
                "404" : 
                    description: |
                        'Not Found' – there is no resource behind the URI.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/imsx_StatusInfoDType"
                "default" : 
                    description: |
                        The request was not completed successfully. The exact error should be explained in the error payload.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/imsx_StatusInfoDType"

    /clrs/{id}:
        delete:
            operationId: deleteClr
            summary: The REST delete request message for the deleteClr() API call.
            tags: 
                - ClrsManager
            description: |
                Delete a CLR.
            parameters: 
                - name: id
                  in: path
                  description: |
                      The unique identifier of the CLR to delete.
                  required: true
                  schema: 
                      type: string
                  style: simple
            security:
                - OAuth2CCG:
                    - https://purl.imsglobal.org/spec/clr/v1p0/scope/delete
            responses: 
                "204" : 
                    description: |
                        'No Content' – The resource was successfully deleted.
                "400" : 
                    description: |
                        'Bad Request' – The request was invalid or cannot be served. The exact error should be explained in the error payload.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/imsx_StatusInfoDType"
                "401" : 
                    description: |
                        'Unauthorized' – The request requires an user authentication.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/imsx_StatusInfoDType"
                "403" : 
                    description: |
                        'Forbidden' – The server understood the request, but is refusing it or the access is not allowed.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/imsx_StatusInfoDType"
                "404" : 
                    description: |
                        'Not found' – There is no resource behind the URI.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/imsx_StatusInfoDType"
                "default" : 
                    description: |
                        The request was not completed successfully. The exact error should be explained in the error payload.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/imsx_StatusInfoDType"

    /discovery:
        get:
            operationId: getDiscoveryDocument
            summary: The REST read request message for the getDiscoveryDocument() API call.
            tags: 
                - DiscoveryManager
            description: |
                Returns the DiscoveryDocument if the provider supports dynamic CLR consumer registration.
            security:
                - OAuth2CCG:
            responses: 
                "200" : 
                    description: |
                        'OK' - the resource is returned in the payload.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/DiscoveryDocumentDType"
                "404" : 
                    description: |
                        'Not Found' – there is no resource behind the URI.
                "421" : 
                    description: |
                        'Misdirected Request' - the request was not made over secure TLS 1.2 or 1.3 protocol.
                "default" : 
                    description: |
                        The request was not completed successfully.

    /endorsements/{id}:
        get:
            operationId: getEndorsement
            summary: The REST read request message for the getEndorsement() API call.
            tags: 
                - EndorsementsManager
            description: |
                Returns the current version of the specified Endorsement. This operation is used to verify a Hosted Endorsements
            parameters: 
                - name: id
                  in: path
                  description: |
                      The unique identifier of the Endorsement
                  required: true
                  schema: 
                      type: string
                  style: simple
            security:
                - OAuth2CCG:
            responses: 
                "200" : 
                    description: |
                        'OK' - the resource is returned in the payload.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/EndorsementDType"
                "404" : 
                    description: |
                        'Not Found' – there is no resource behind the URI.
                "default" : 
                    description: |
                        The request was not completed successfully.

    /keys/{id}:
        get:
            operationId: getKey
            summary: The REST read request message for the getKey() API call.
            tags: 
                - KeysManager
            description: |
                Returns the current version of the specified CryptographicKey. This operation is used to help verify a Signed Assertion.
            parameters: 
                - name: id
                  in: path
                  description: |
                      The unique identifier of the CryptographicKey.
                  required: true
                  schema: 
                      type: string
                  style: simple
            security:
                - OAuth2CCG:
            responses: 
                "200" : 
                    description: |
                        'OK' - the resource is returned in the payload.
                    content: 
                        application/json: 
                            schema: 
                                $ref: "#/components/schemas/CryptographicKeyDType"
                "404" : 
                    description: |
                        'Not Found' – there is no resource behind the URI.
                "default" : 
                    description: |
                        The request was not completed successfully.


#####################################################################################
#                               Components                                          #
#####################################################################################
components:
    securitySchemes:
        OAuth2CCG:
            type: oauth2
            description: |
                description: |OAuth 2.0 Client Credentials authorization per IMS Security Framework.
            flows:
                clientCredentials:
                    tokenUrl: /token
                    scopes: 
                        https://purl.imsglobal.org/spec/clr/v1p0/scope/delete: Grants the app permission to delete your comprehensive learner records on this host.
                        https://purl.imsglobal.org/spec/clr/v1p0/scope/readonly: Grants the app permission to read your comprehensive learner records on this host.
                        https://purl.imsglobal.org/spec/clr/v1p0/scope/replace: Grants the app permission to create or replace your comprehensive learner records on this host.
        OAuth2ACG:
            type: oauth2
            description: |
                description: |OAuth 2.0 Client Credentials authorization per IMS Security Framework.
            flows:
                authorizationCode:
                    tokenUrl: /token
                    authorizationUrl:/authorize
                    refreshUrl:/token
                    scopes: 
                        https://purl.imsglobal.org/spec/clr/v1p0/scope/delete: Grants the app permission to delete your comprehensive learner records on this host.
                        https://purl.imsglobal.org/spec/clr/v1p0/scope/readonly: Grants the app permission to read your comprehensive learner records on this host.
                        https://purl.imsglobal.org/spec/clr/v1p0/scope/replace: Grants the app permission to create or replace your comprehensive learner records on this host.
    schemas: 
        AchievementDType:
            description: |
                An accomplishment such as completing a degree, mastering a competency, or course completion that may be asserted about one or more learners.
            type: object
            required: 
                - id
                - type
                - name
                - issuer
                - typeLabel
            properties: 
                id: 
                    description: Unique IRI for the Achievement. Model Primitive Datatype = NormalizedString.
                    type: string
                type: 
                    description: |
                        The JSON-LD type of this object. Normally 'Achievement'.
                    type: string
                    enum: 
                       - Achievement
                       - BadgeClass
                       - CASECompetencyStatement
                       - CTDLCredential
                       - IMSAssessmentResult
                       - PESCTranscript
                alignments: 
                    description: |
                        Alignment objects describe an alignment between this achievement and a node in an educational framework.
                    type: array
                    minItems: 0
                    items: 
                        $ref: "#/components/schemas/AlignmentDType"
                creditsAvailable: 
                    description: Credit hours associated with this entity, or credit hours possible. For example '3.0'. Model Primitive Datatype = Float.
                    type: number
                    format: float
                description: 
                    description: A short description of the achievement. May be the same as name if no description is available. Model Primitive Datatype = String.
                    type: string
                endorsements: 
                    description: |
                        Allows endorsers to make specific claims about the Achievement.
                    type: array
                    minItems: 0
                    items: 
                        $ref: "#/components/schemas/EndorsementBaseDType"
                humanCode: 
                    description: The code, generally human readable, associated with an achievement. Model Primitive Datatype = String.
                    type: string
                name: 
                    description: The name of the achievement. Model Primitive Datatype = String.
                    type: string
                fieldOfStudy: 
                    description: Category, subject, area of study,  discipline, or general branch of knowledge. Examples include Business, Education, Psychology, and Technology.  Model Primitive Datatype = String.
                    type: string
                image: 
                    description: IRI of an image representing the achievement. May be a Data URI or the URL where the image may be found. Model Primitive Datatype = NormalizedString.
                    type: string
                issuer: 
                    $ref: "#/components/schemas/ProfileDType"
                level: 
                    description: Text that describes the level of achievement apart from how the achievement was performed or demonstrated. Examples would include 'Level 1', 'Level 2', 'Level 3', or 'Bachelors', 'Masters', 'Doctoral'. Model Primitive Datatype = String.
                    type: string
                requirement: 
                    $ref: "#/components/schemas/CriteriaDType"
                resultDescriptions: 
                    description: |
                        The types of result that may be asserted with this achievement.
                    type: array
                    minItems: 0
                    items: 
                        $ref: "#/components/schemas/ResultDescriptionDType"
                specialization: 
                    description: Name given to the focus, concentration, or specific area of study defined in the achievement. Examples include Entrepreneurship, Technical Communication, and Finance. Model Primitive Datatype = String.
                    type: string
                tags: 
                    description: Tags that describe the type of achievement. Model Primitive Datatype = String.
                    type: array
                    minItems: 0
                    items: 
                        type: string
                typeLabel: 
                    description: The type of achievement matching one  from an IMS recommended taxonomy of achievement types, or any text string. Model Primitive Datatype = String.
                    type: string
            additionalProperties: true
        AddressDType:
            description: |
                Based on schema.org Address object.
            type: object
            properties: 
                id: 
                    description: Unique IRI for the Address. Model Primitive Datatype = NormalizedString.
                    type: string
                type: 
                    description: The JSON-LD type of this object. Normally 'Address'. Model Primitive Datatype = NormalizedString.
                    type: string
                addressCountry: 
                    description: The country. For example, USA. You can also provide the two-letter ISO 3166-1 alpha-2 country code. Model Primitive Datatype = String.
                    type: string
                addressLocality: 
                    description: The locality. For example, Mountain View. Model Primitive Datatype = String.
                    type: string
                addressRegion: 
                    description: The region. For example, CA. Model Primitive Datatype = String.
                    type: string
                postalCode: 
                    description: The postal code. For example, 94043. Model Primitive Datatype = String.
                    type: string
                postOfficeBoxNumber: 
                    description: The post office box number for PO box addresses. Model Primitive Datatype = String.
                    type: string
                streetAddress: 
                    description: The street address. For example, 1600 Amphitheatre Pkwy. Model Primitive Datatype = String.
                    type: string
            additionalProperties: false
        AlignmentDType:
            description: |
                Alignment is based on schema.org’s AlignmentObject and uses IRIs from that vocabulary.
            type: object
            required: 
                - targetName
                - targetUrl
            properties: 
                id: 
                    description: Unique IRI for the object. Model Primitive Datatype = NormalizedString.
                    type: string
                type: 
                    description: The JSON-LD type of this entity. Normally 'Alignment'. Model Primitive Datatype = NormalizedString.
                    type: string
                educationalFramework: 
                    description: The framework to which the resource being described is aligned. Model Primitive Datatype = String.
                    type: string
                targetCode: 
                    description: If applicable, a locally unique string identifier that identifies the alignment target within its framework. Model Primitive Datatype = String.
                    type: string
                targetDescription: 
                    description: Short description of the alignment target. Model Primitive Datatype = String.
                    type: string
                targetName: 
                    description: The name of a node in an established educational framework. Model Primitive Datatype = String.
                    type: string
                targetUrl: 
                    description: The URL of a node in an established educational framework. Model Primitive Datatype = AnyURI.
                    type: string
                    format: uri
            additionalProperties: false
        ArtifactDType:
            description: |
                An artifact that is part of an evidence object.
            type: object
            required: 
                - name
            properties: 
                type: 
                    description: The JSON-LD type of the object. Normally 'Artifact'. Model Primitive Datatype = NormalizedString.
                    type: string
                description: 
                    description: A description of the artifact. Model Primitive Datatype = String.
                    type: string
                name: 
                    description: The name of the artifact. Model Primitive Datatype = String.
                    type: string
                url: 
                    description: IRI of the artifact. May be a Data URI or the URL where the artifact may be found. Model Primitive Datatype = AnyURI.
                    type: string
                    format: uri
            additionalProperties: false
        AssertionDType:
            description: |
                Assertions are representations of an Achievement awarded to a Learner.  It is used to share information about the Achievement Assertion, such as a result and verification method. Assertions are packaged for transmission as JSON objects with a set of mandatory and optional properties.
            type: object
            required: 
                - id
                - type
            properties: 
                id: 
                    description: Unique IRI for the Assertion. Model Primitive Datatype = NormalizedString.
                    type: string
                type: 
                    description: The JSON-LD type of this object. Normally 'Assertion'. Model Primitive Datatype = NormalizedString.
                    type: string
                achievement: 
                    $ref: "#/components/schemas/AchievementDType"
                creditsEarned: 
                    description: The number of credits earned, generally in semester or quarter credit hours.  This field correlates with the Achievement creditsAvailable field. Model Primitive Datatype = Float.
                    type: number
                    format: float
                endDate: 
                    description: If present, the assertion is not valid after this date. Model Primitive Datatype = DateTime.
                    type: string
                    format: date-time
                endorsements: 
                    description: |
                        Allows endorsers to make specific claims about the assertion.
                    type: array
                    minItems: 0
                    items: 
                        $ref: "#/components/schemas/EndorsementBaseDType"
                evidence: 
                    description: |
                        Evidence describing the work that the recipient did to earn the achievement. This can be a webpage that links out to other pages if linking directly to the work is infeasible.
                    type: array
                    minItems: 0
                    items: 
                        $ref: "#/components/schemas/EvidenceDType"
                image: 
                    description: IRI of an image representing the assertion. May be a Data URI or the URL where the image may be found. If the object is an Open Badges 2.0 assertion, the image is a 'Baked Image' as defined by the Open Badges 2.0 specification. Model Primitive Datatype = NormalizedString.
                    type: string
                issuedOn: 
                    description: Timestamp of when the achievement was awarded. Required unless the assertion is revoked. Model Primitive Datatype = DateTime.
                    type: string
                    format: date-time
                licenseNumber: 
                    description: The license number that was issued with this assertion. Model Primitive Datatype = String.
                    type: string
                narrative: 
                    description: A narrative that describes the connection between multiple pieces of evidence. Likely only present if evidence is a multi-value array. Markdown allowed. Model Primitive Datatype = String.
                    type: string
                recipient: 
                    $ref: "#/components/schemas/IdentityDType"
                results: 
                    description: |
                        The results being asserted.
                    type: array
                    minItems: 0
                    items: 
                        $ref: "#/components/schemas/ResultDType"
                revocationReason: 
                    description: Optional published reason for revocation, if revoked. Model Primitive Datatype = String.
                    type: string
                revoked: 
                    description: Defaults to false if Assertion is not referenced from a revokedAssertions list and may be omitted. See RevocationList. If revoked is true, only revoked and id are required properties, and many issuers strip a hosted Assertion down to only those properties when revoked. Model Primitive Datatype = Boolean.
                    type: boolean
                role: 
                    description: Role, position, or title of the learner when demonstrating or performing the achievement or evidence of learning being asserted. Examples include 'Student President', 'Intern', 'Captain', etc. Model Primitive Datatype = String.
                    type: string
                startDate: 
                    description: If present, the assertion is not valid before this date. Model Primitive Datatype = DateTime.
                    type: string
                    format: date-time
                term: 
                    description: The academic term in which this assertion was achieved. Model Primitive Datatype = String.
                    type: string
                verification: 
                    $ref: "#/components/schemas/VerificationDType"
            additionalProperties: true
        AssertionBaseDType:
            description: |
                Base class for the two types of assertion objects: Assertion and SignedAssertion.
            type: object
            required: 
                - type
            properties: 
                id: 
                    description: Unique IRI for the object. Required if the type is Assertion. Model Primitive Datatype = NormalizedString.
                    type: string
                type: 
                    description: |
                        The type of the assertion object.  Use the type to recast the object to the appropriate sub-class.
                    type: string
                    enum: 
                       - Assertion
                       - SignedAssertion
                       - SignedBadge
            additionalProperties: true
        AssociationDType:
            description: |
                Association is based on the CASE CFAssociation object. An Association associates (relates) one Achievement with another Achievement.
            type: object
            required: 
                - associationType
                - sourceId
                - targetId
            properties: 
                id: 
                    description: Unique IRI for the Association. Model Primitive Datatype = NormalizedString.
                    type: string
                type: 
                    description: The JSON-LD type of this object. Normally 'Association'. Model Primitive Datatype = NormalizedString.
                    type: string
                associationType: 
                    description: |
                        The type of the relationship, used to define the alignment between two achievements.  
                    type: string
                    enum: 
                       - exactMatchOf
                       - exemplar
                       - hasSkillLevel
                       - isChildOf
                       - isPartOf
                       - isPeerOf
                       - isRelatedTo
                       - precedes
                       - replacedBy
                identifier: 
                    description: An unambiguous, synthetic, globally unique identifier for the Association. This is the primary way in which the exchange identification is achieved. Model Primitive Datatype = String.
                    type: string
                    pattern: "[0-9a-f]{8}-[0-9a-f]{4}-[1-5]{1}[0-9a-f]{3}-[8-9a-b]{1}[0-9a-f]{3}-[0-9a-f]{12}"
                lastChangeDateTime: 
                    description: A system generated timestamp of the most recent change to this association. Model Primitive Datatype = DateTime.
                    type: string
                    format: date-time
                sequenceNumber: 
                    description: This is used to order associated objects. Associations can be created through mapping rather than strict hierarchy. As such the presentation of the list cannot be ordered by the objects in the list. They may be different based on the parent being viewed. Model Primitive Datatype = Integer.
                    type: integer
                    format: int32
                sourceId: 
                    description: The 'id' of an Achievement or source of the association. Model Primitive Datatype = NormalizedString.
                    type: string
                targetId: 
                    description: The 'id' of another Achievement, or target of the association. Model Primitive Datatype = NormalizedString.
                    type: string
            additionalProperties: false
        CLRDType:
            description: |
                A collection of assertions for a single person reported by a single publisher.
            type: object
            required: 
                - id
                - assertions
                - issuedOn
                - learner
                - publisher
            properties: 
                id: 
                    description: Unique IRI for the CLR. Model Primitive Datatype = NormalizedString.
                    type: string
                type: 
                    description: The JSON-LD type of this object. Normally 'CLR'. Model Primitive Datatype = NormalizedString.
                    type: string
                assertions: 
                    description: |
                        The learner's asserted achievements.
                    type: array
                    minItems: 1
                    items: 
                        $ref: "#/components/schemas/AssertionBaseDType"
                associations: 
                    description: |
                        The set of achievement associations in the CLR.
                    type: array
                    minItems: 0
                    items: 
                        $ref: "#/components/schemas/AssociationDType"
                issuedOn: 
                    description: Timestamp of when the CLR was published. Model Primitive Datatype = DateTime.
                    type: string
                    format: date-time
                learner: 
                    $ref: "#/components/schemas/ProfileDType"
                publisher: 
                    $ref: "#/components/schemas/ProfileDType"
            additionalProperties: false
        CLRSetDType:
            description: |
                A set of CLRs.
            type: object
            properties: 
                id: 
                    description: Unique IRI for the ClrSet. Model Primitive Datatype = NormalizedString.
                    type: string
                type: 
                    description: The JSON-LD type of this object. Normally 'CLRSet'. Model Primitive Datatype = NormalizedString.
                    type: string
                clrs: 
                    description: |
                        An unordered collection of comprehensive learner records.
                    type: array
                    minItems: 0
                    items: 
                        $ref: "#/components/schemas/CLRDType"
            additionalProperties: false
        CriteriaDType:
            description: |
                Descriptive metadata about the achievements necessary to be recognized with an Assertion of a particular AchievementType. This data is added to the AchievementType so that it may be rendered when that AchievementType is displayed, instead of simply a link to human-readable criteria external to the Achievement Assertion. Embedding criteria allows either enhancement of an external criteria page or increased portability and ease of use by allowing issuers to skip hosting the formerly-required external criteria page altogether.
            type: object
            required: 
                - id
            properties: 
                id: 
                    description: The URI of a webpage that describes in a human-readable format the criteria for the Achievement. Model Primitive Datatype = NormalizedString.
                    type: string
                type: 
                    description: The JSON-LD type of this object. Normally 'Criteria'. Model Primitive Datatype = NormalizedString.
                    type: string
                narrative: 
                    description: A narrative of what is needed to earn the achievement. Markdown allowed. Model Primitive Datatype = String.
                    type: string
            additionalProperties: true
        CryptographicKeyDType:
            description: |
                Based on the Key class from the W3C Web Payments Community Group Security Vocabulary. A CryptographicKey document identifies and describes a public key used to verify signed Assertions.
            type: object
            required: 
                - id
            properties: 
                id: 
                    description: The URI of the CryptographicKey document. Used during signed verification. Model Primitive Datatype = NormalizedString.
                    type: string
                type: 
                    description: The JSON-LD type of this object. Normally 'CryptographicKey'. Model Primitive Datatype = NormalizedString.
                    type: string
                owner: 
                    description: The identifier for the Profile that owns this key. Model Primitive Datatype = NormalizedString.
                    type: string
                publicKeyPem: 
                    description: The PEM key encoding is a widely-used method to express public keys, compatible with almost every Secure Sockets Layer library implementation. Model Primitive Datatype = String.
                    type: string
            additionalProperties: false
        DiscoveryDocumentDType:
            description: |
                Configuration information about the provider implementation.
            type: object
            required: 
                - authorizationUrl
                - name
                - privacyPolicyUrl
                - registrationUrl
                - scopesOffered
                - termsOfServiceUrl
                - tokenUrl
            properties: 
                authorizationUrl: 
                    description: A fully qualifed URL to the provider's OAuth 2.0 Authorization endpoint. Model Primitive Datatype = AnyURI.
                    type: string
                    format: uri
                image: 
                    description: An image representing the provider. May be a Data URI or the URL where the image may be found. Model Primitive Datatype = NormalizedString.
                    type: string
                name: 
                    description: The user-facing name of the platform providing CLR services. Model Primitive Datatype = String.
                    type: string
                privacyPolicyUrl: 
                    description: A fully qualified URL to the provider's privacy policy. Model Primitive Datatype = AnyURI.
                    type: string
                    format: uri
                registrationUrl: 
                    description: A fully qualified URL to the provider's OAuth 2.0 Registration endpoint. Model Primitive Datatype = AnyURI.
                    type: string
                    format: uri
                scopesOffered: 
                    description: An array of OAuth 2.0 Scopes supported by the provider. Model Primitive Datatype = AnyURI.
                    type: array
                    minItems: 1
                    items: 
                        type: string
                        format: uri
                termsOfServiceUrl: 
                    description: A fully qualified URL to the provider's terms of service. Model Primitive Datatype = AnyURI.
                    type: string
                    format: uri
                tokenUrl: 
                    description: A fully qualified URL to the provider's OAuth 2.0 Token endpoint. Model Primitive Datatype = AnyURI.
                    type: string
                    format: uri
            additionalProperties: false
        EndorsementDType:
            description: |
                An endorsement claim.
            type: object
            required: 
                - id
                - type
                - issuedOn
                - issuer
            properties: 
                id: 
                    description: Unique IRI for the Endorsement. Model Primitive Datatype = NormalizedString.
                    type: string
                type: 
                    description: The JSON-LD type of this entity. Normally 'Endorsement'. Model Primitive Datatype = NormalizedString.
                    type: string
                claim: 
                    $ref: "#/components/schemas/EndorsementClaimDType"
                issuedOn: 
                    description: Timestamp of when the endorsement was published. Model Primitive Datatype = DateTime.
                    type: string
                    format: date-time
                issuer: 
                    $ref: "#/components/schemas/EndorsementProfileDType"
                verification: 
                    $ref: "#/components/schemas/VerificationDType"
            additionalProperties: false
        EndorsementBaseDType:
            description: |
                Base class for the two types of endorsement objects: Endorsement and SignedEndorsement.
            type: object
            required: 
                - type
            properties: 
                id: 
                    description: Unique IRI for the object. Model Primitive Datatype = NormalizedString.
                    type: string
                type: 
                    description: |
                        The type of the endorsement object. Use the type to recast the object to the appropriate sub-class.
                    type: string
                    enum: 
                       - Endorsement
                       - SignedEndorsement
            additionalProperties: true
        EndorsementClaimDType:
            description: |
                An entity, identified by an id and additional properties that the endorser would like to claim about that entity.
            type: object
            required: 
                - id
            properties: 
                id: 
                    description: The 'id' of the Profile, Achievement, or Assertion being endorsed. Model Primitive Datatype = NormalizedString.
                    type: string
                type: 
                    description: The JSON-LD type of this entity. Normally 'EndorsementClaim'. Model Primitive Datatype = NormalizedString.
                    type: string
                endorsementComment: 
                    description: An endorer's comment about the quality or fitness of the endorsed entity. Markdown allowed. Model Primitive Datatype = String.
                    type: string
            additionalProperties: true
        EndorsementProfileDType:
            description: |
                A Profile is a collection of information that describes the person or organization using Comprehensive Learner Record (CLR). Publishers, learners, and issuers must be represented as profiles. Recipients, endorsers, or other entities may also be represented using this vocabulary. An EndorsementProfile cannot have endorsements.
            type: object
            required: 
                - id
                - type
                - name
            properties: 
                id: 
                    description: Unique IRI for the Profile. Model Primitive Datatype = NormalizedString.
                    type: string
                type: 
                    description: The JSON-LD type of this entity. Normally 'Profile'. Model Primitive Datatype = NormalizedString.
                    type: string
                address: 
                    $ref: "#/components/schemas/AddressDType"
                description: 
                    description: A short description of the individual or organization. Model Primitive Datatype = String.
                    type: string
                email: 
                    description: A contact email address for the individual or organization. Model Primitive Datatype = String.
                    type: string
                image: 
                    description: Image representing the individual or organization. Model Primitive Datatype = NormalizedString.
                    type: string
                name: 
                    description: The name of the individual or organization. Model Primitive Datatype = String.
                    type: string
                publicKey: 
                    $ref: "#/components/schemas/CryptographicKeyDType"
                revocationList: 
                    description: The URI of the Revocation List used for marking revocation of signed Assertions. Model Primitive Datatype = NormalizedString.
                    type: string
                sourcedId: 
                    description: The individual's unique 'sourcedId' value, which is used for providing interoperability with IMS Learning Information Services (LIS). Model Primitive Datatype = String.
                    type: string
                studentId: 
                    description: An institution's student identifier for the person. This is frequently issued through a Student Information System. Model Primitive Datatype = String.
                    type: string
                telephone: 
                    description: Primary phone number for the individual or organization. Model Primitive Datatype = String.
                    type: string
                url: 
                    description: Web resource that uniquely represents or belongs to the individual. This may be a resource about the individual, hosting provided by the instution to the individual, or an web resource independently controlled by the individual. Model Primitive Datatype = AnyURI.
                    type: string
                    format: uri
                verification: 
                    $ref: "#/components/schemas/VerificationDType"
            additionalProperties: true
        EvidenceDType:
            description: |
                One or more artifacts that represent supporting evidence for the record. Examples include text, media, websites, etc.
            type: object
            required: 
                - name
            properties: 
                id: 
                    description: The URI of a webpage presenting evidence of achievement. Model Primitive Datatype = NormalizedString.
                    type: string
                type: 
                    description: The JSON-LD type of this entity. Normally 'Evidence'. Model Primitive Datatype = NormalizedString.
                    type: string
                artifacts: 
                    description: |
                        Artifacts that are part of the evidence.
                    type: array
                    minItems: 0
                    items: 
                        $ref: "#/components/schemas/ArtifactDType"
                audience: 
                    description: A description of the intended audience for a piece of evidence. Model Primitive Datatype = String.
                    type: string
                description: 
                    description: A longer description of the evidence. Model Primitive Datatype = String.
                    type: string
                genre: 
                    description: A string that describes the type of evidence. For example, Poetry, Prose, Film. Model Primitive Datatype = String.
                    type: string
                name: 
                    description: The name of the evidence. Model Primitive Datatype = String.
                    type: string
                narrative: 
                    description: A narrative that describes the evidence and process of achievement that led to an assertion. Markdown allowed. Model Primitive Datatype = String.
                    type: string
            additionalProperties: false
        IdentityDType:
            description: |
                A collection of information about the recipient of an achievement assertion.
            type: object
            required: 
                - type
                - identity
                - hashed
            properties: 
                id: 
                    description: Unique IRI for the Identity. Model Primitive Datatype = NormalizedString.
                    type: string
                type: 
                    description: The JSON-LD type of this entity. The type should identify the property by which the recipient of an Assertion is identified. This value should be an IRI mapped in the present context. For example, email maps to 'clr:email' and indicates that the identity of the IdentityObject will represent a value of a Profile’s email property. Currently the only supported value for many platforms that implement CLR is email, but other properties are available. Model Primitive Datatype = NormalizedString.
                    type: string
                identity: 
                    description: Either the hash of the identity or the plaintext value. If it's possible that the plaintext transmission and storage of the identity value would leak personally identifiable information where there is an expectation of privacy, it is strongly recommended that an IdentityHash be used. Model Primitive Datatype = String.
                    type: string
                hashed: 
                    description: Whether or not the identity value is hashed. Model Primitive Datatype = Boolean.
                    type: boolean
                salt: 
                    description: If the recipient is hashed, this should contain the string used to salt the hash. If this value is not provided, it should be assumed that the hash was not salted. Model Primitive Datatype = String.
                    type: string
            additionalProperties: false
        ProfileDType:
            description: |
                A Profile is a collection of information that describes the person or organization using Comprehensive Learner Record (CLR). Publishers, learners, and issuers must be represented as profiles. Recipients, endorsers, or other entities may also be represented using this vocabulary.
            type: object
            required: 
                - id
                - name
            properties: 
                id: 
                    description: Unique IRI for the Profile. Model Primitive Datatype = NormalizedString.
                    type: string
                type: 
                    description: The JSON-LD type of this object. Normally 'Profile'. Model Primitive Datatype = NormalizedString.
                    type: string
                address: 
                    $ref: "#/components/schemas/AddressDType"
                description: 
                    description: A short description of the individual or organization. Model Primitive Datatype = String.
                    type: string
                email: 
                    description: A contact email address for the individual or organization. Model Primitive Datatype = String.
                    type: string
                endorsements: 
                    description: |
                        Allows endorsers to make specific claims about the individual or organization represented by this profile.
                    type: array
                    minItems: 0
                    items: 
                        $ref: "#/components/schemas/EndorsementBaseDType"
                image: 
                    description: IRI of an image representing the individual or organization. May be a DATA URI or the URL where the image may be found. Model Primitive Datatype = NormalizedString.
                    type: string
                name: 
                    description: The name of the individual or organization. Model Primitive Datatype = String.
                    type: string
                publicKey: 
                    $ref: "#/components/schemas/CryptographicKeyDType"
                revocationList: 
                    $ref: "#/components/schemas/RevocationListDType"
                sourcedId: 
                    description: The individual's unique 'sourcedId' value, which is used for providing interoperability with IMS Learning Information Services (LIS). Model Primitive Datatype = String.
                    type: string
                studentId: 
                    description: An institution's student identifier for the person. This is frequently issued through a Student Information System. Model Primitive Datatype = String.
                    type: string
                telephone: 
                    description: Primary phone number for the individual or organization. Model Primitive Datatype = String.
                    type: string
                url: 
                    description: Web resource that uniquely represents or belongs to the individual. This may be a resource about the individual, hosting provided by the instution to the individual, or an web resource independently controlled by the individual. Model Primitive Datatype = AnyURI.
                    type: string
                    format: uri
                verification: 
                    $ref: "#/components/schemas/VerificationDType"
            additionalProperties: true
        ResultDType:
            description: |
                Describes a result of an achievement.
            type: object
            required: 
                - type
                - value
            properties: 
                id: 
                    description: Unique IRI for the object. Model Primitive Datatype = NormalizedString.
                    type: string
                type: 
                    description: |
                        The JSON-LD type of this object. The strongly typed value identifies the type of result.
                    type: string
                    enum: 
                       - GradePointAverage
                       - LetterGrade
                       - Percent
                       - PerformanceLevel
                       - PredictedScore
                       - Result
                       - RawScore
                       - RubricScore
                       - ScaledScore
                name: 
                    description: The name of the result. Model Primitive Datatype = String.
                    type: string
                value: 
                    description: A grade or value representing the result of the performance, or demonstration, of the achievement.  For example, 'A' if the recipient received a grade of A in the class.  Model Primitive Datatype = String.
                    type: string
            additionalProperties: false
        ResultDescriptionDType:
            description: |
                Describes a possible achievement result.
            type: object
            required: 
                - type
            properties: 
                id: 
                    description: Unique IRI for the ResultDescription. Model Primitive Datatype = NormalizedString.
                    type: string
                type: 
                    description: |
                        The JSON-LD type of this object. The strongly typed value identifies the type of result.
                    type: string
                    enum: 
                       - GradePointAverage
                       - LetterGrade
                       - Percent
                       - PerformanceLevel
                       - PredictedScore
                       - Result
                       - RawScore
                       - RubricScore
                       - ScaledScore
                name: 
                    description: The name of the result. Model Primitive Datatype = String.
                    type: string
                resultMin: 
                    description: The minimum possible result that may be asserted. Model Primitive Datatype = String.
                    type: string
                resultMax: 
                    description: The maximum possible result that may be asserted. Model Primitive Datatype = String.
                    type: string
            additionalProperties: false
        RevocationListDType:
            description: |
                The Revocation List is a document that describes Assertions an Issuer has revoked that used the signed verification method. If you find the Assertion in the revokedAssertions list, it has been revoked.
            type: object
            required: 
                - id
            properties: 
                id: 
                    description: Unique IRI for the RevocationList. Model Primitive Datatype = NormalizedString.
                    type: string
                type: 
                    description: The JSON-LD type of this entity. Normally 'RevocationList'. Model Primitive Datatype = NormalizedString.
                    type: string
                issuer: 
                    description: The id of the Issuer. Model Primitive Datatype = NormalizedString.
                    type: string
                revokedAssertions: 
                    description: |
                        The id of an assertion that has been revoked. Model Primitive Datatype = NormalizedString.
                    type: array
                    minItems: 0
                    items: 
                        type: string
            additionalProperties: false
        VerificationDType:
            description: |
                A collection of information allowing an inspector to verify an Assertion.
            type: object
            required: 
                - type
            properties: 
                id: 
                    description: Unique IRI for the Verification. Model Primitive Datatype = NormalizedString.
                    type: string
                type: 
                    description: |
                        The JSON-LD type of this object. The strongly typed value indicates the verification method.
                    type: string
                    enum: 
                       - Hosted
                       - HostedAssertion
                       - Signed
                       - SignedAssertion
                       - Verification
                allowedOrigins: 
                    description: The host registered name subcomponent of an allowed origin. Any given id URI will be considered valid. Model Primitive Datatype = String.
                    type: array
                    minItems: 0
                    items: 
                        type: string
                creator: 
                    description: The URI of the CryptographicKey with the public key used to verify the signed Assertion. If not present, verifiers will check publicKey property of the referenced issuer Profile. If present, the URI must match the CryptographicKey id in the issuer Profile as well. Model Primitive Datatype = AnyURI.
                    type: string
                    format: uri
                startsWith: 
                    description: The URI fragment that the verification property must start with. Valid Assertions must have an id within this scope. Multiple values allowed, and Assertions will be considered valid if their id starts with one of these values. Model Primitive Datatype = String.
                    type: array
                    minItems: 0
                    items: 
                        type: string
                verificationProperty: 
                    description: The property to be used for verification. Only 'id' is supported. Verifiers will consider 'id' the default value if verificationProperty is omitted or if an issuer Profile has no explicit verification instructions, so it may be safely omitted. Model Primitive Datatype = String.
                    type: string
            additionalProperties: false
        imsx_CodeMinorDType:
            description: |
                This is the container for the set of code minor status codes reported in the responses from the Service Provider.
            type: object
            required: 
                - imsx_codeMinorField
            properties: 
                imsx_codeMinorField: 
                    description: |
                        Each reported code minor status code.
                    type: array
                    minItems: 1
                    items: 
                        $ref: "#/components/schemas/imsx_CodeMinorFieldDType"
            additionalProperties: false
        imsx_CodeMinorFieldDType:
            description: |
                This is the container for a single code minor status code.
            type: object
            required: 
                - imsx_codeMinorFieldName
                - imsx_codeMinorFieldValue
            properties: 
                imsx_codeMinorFieldName: 
                    description: Tiis should contain the identity of the system that has produced the code minor status code report. Model Primitive Datatype = NormalizedString.
                    type: string
                imsx_codeMinorFieldValue: 
                    description: |
                        The code minor status code (this is a value from the corresponding enumerated vocabulary).
                    type: string
                    enum: 
                       - forbidden
                       - fullsuccess
                       - internal_server_error
                       - invalid_data
                       - invalid_query_parameter
                       - server_busy
                       - unauthorizedrequest
            additionalProperties: false
        imsx_StatusInfoDType:
            description: |
                This is the container for the status code and associated information returned within the HTTP messages received from the Service Provider.
            type: object
            required: 
                - imsx_codeMajor
                - imsx_severity
            properties: 
                imsx_codeMajor: 
                    description: |
                        The code major value (from the corresponding enumerated vocabulary).
                    type: string
                    enum: 
                       - success
                       - failure
                       - processing
                       - unsupported
                imsx_severity: 
                    description: |
                        The severity value (from the corresponding enumerated vocabulary).
                    type: string
                    enum: 
                       - status
                       - warning
                       - error
                imsx_description: 
                    description: A human readable description supplied by the entity creating the status code information. Model Primitive Datatype = String.
                    type: string
                imsx_codeMinor: 
                    $ref: "#/components/schemas/imsx_CodeMinorDType"
            additionalProperties: false
        

toc | top

About this Document

Title: IMS Comprehensive Learner Record REST/JSON Binding v1.0
Editors: Andy Miller, IMS Global
Jeff Bohrer, IMS Global

Co-chairs: Chris Houston, eLumen
Greg Nadeau, Public Consulting Group

Version: 2.0
Version Date: 26 August 2019
Status: IMS Candidate Final
Summary: The IMS Comprehensive Learner Record Service is used to exchange information about users and their achievements. This standard defines a data model for comprehensive learner records. It also describes how this data can be exchanged using service calls. This document contains the REST/JSON Binding description for the Comprehensive Learner Record Service.

Revision Information: Second release of the Comprehensive Learner Record specification.
Purpose: For adoption and implemenation comprehensive learner records in a standardized, machine-readable format.
Document Location: http://www.imsglobal.org/clr

toc | top

List of Contributors

The following individuals contributed to the development of this document:

Tamer Abuelsaad IBM
Jeff Bohrer IMS Global
Sherri Braxton University of Maryland, Baltimore County
Deb Everhart Cengage
Steve Gance Washington State Board for Community and Technical Colleges
Matthew Hailstone Brigham Young University
Chris Houston eLumen
Alex Hripak Credly
Mark Leuba IMS Global
Jeff McNeal State of Michigan Department of Education
Andy Miller IMS Global
Greg Nadeau Public Consulting Group
Nate Otto Concentric Sky
Ozgur Yogurtcu AEFIS

toc | top

Revision History

Version No. Release Date Comments
1.0 6 July 2018 First release of the Comprehensive Learner Record IMS Candidate Final specification.
2.0 26 August 2019 Second release of the Comprehensive Learner Record IMS Candidate Final specification.

toc | top

IMS Global Learning Consortium, Inc. ("IMS Global") is publishing the information contained in this document ("Specification") for purposes of scientific, experimental, and scholarly collaboration only.

IMS Global makes no warranty or representation regarding the accuracy or completeness of the Specification.

This material is provided on an "As Is" and "As Available" basis.

The Specification is at all times subject to change and revision without notice.

It is your sole responsibility to evaluate the usefulness, accuracy, and completeness of the Specification as it relates to you.

IMS Global would appreciate receiving your comments and suggestions.

Please contact IMS Global through our website at http://www.imsglobal.org.

Please refer to Document Name: IMS Comprehensive Learner Record REST/JSON Binding v1.0

Date: 26 August 2019

toc | top