Table of Contents

Top

    Last Updated: 9/19/2017

    Currently, the Credential Registry operates in a sandbox environment. During this phase, certain features (such as API keys) will not be used. Once the Credential Registry moves to a production status, these features will be enabled.

    Registry Assistant API Handbook

    Overview

    The Credential Engine Registry offers the Registry Assistant as a special API designed to make it easier to publish to the Registry by providing a simplified version of CTDL that is easier to map existing data to. This guide is intended to be a step by step walkthrough to get you started with using the Registry Assistant API.

    It is strongly recommended that you review the Mapping, Object Types, and CTID sections of the main Registry Guide before continuing.

    This guide assumes a working knowledge of:

    Additionally, it is recommended to be familiar with:

    Services

    The Registry Assistant API provides two main services:

    You can use whichever service meets your needs. Note that the Publish endpoint will format the data first, so you do not need to call both.

    You can access these services by making HTTP POST requests to:

    Format Data (only)

    https://credentialengine.org/sandbox/{CTDL object type}/format

    Publish Data (automatically formats first)

    https://credentialengine.org/sandbox/{CTDL object type}/publish

    Example: Format Credential

    https://credentialengine.org/sandbox/credential/format

    Example: Publish Organization

    https://credentialengine.org/sandbox/organization/publish

    Getting your API Key

    In order to publish data using the Registry Assistant API, you will need an API Key. This key is connected to your Credential Engine account. API Keys are not available yet, but will be soon.

    Getting Started

    Top level classes in the Registry often need to reference one another. For example, a Credential might need to reference both the Organization that owns it, and an Assessment that it requires. The easiest way to provide valid references to these things is to ensure that things which need to be referenced are published before things that are doing the referencing. Usually this means that you should publish the Organization first, any required entities like assessments or learning opportunities second, and the credential(s) that reference these entities last. These references are all handled via the URIs explained in the CTID section of the Registry guide page.

    The Registry Assistant accepts data formatted using ordinary JSON. A special variant of JSON, JSON-LD, is used within the Registry. One of the features of the Registry Assistant API is that it handles conversion of ordinary JSON to JSON-LD for you. Explanations of JSON and JSON-LD are beyond the scope of this guide, but the remainder of this guide assumes at least a basic working knowledge of standard JSON. Note that the API does not care about the presence or lack of additional whitespace (sometimes known as "pretty printing") within your JSON, but for the purposes of readability, this guide will include it.

    In some cases, a property can have multiple values. In these cases, you must always use an array if any values are present, even if there is only one value.

    Upon successfully publishing data to the Registry, you will receive the resultant CER Envelope. The CER Envelope contains the entity that was published (the "payload") along with various other data about the publish event, such as the date and time the publish happened, the account responsible for it, cryptographic signature data to enable validation of the payload against tampering, and the identifier for the envelope itself (this is not the same as the CTID). While it is not necessary to reference a particular envelope in order to use the Registry, it may be useful to maintain a record of the envelope's ID within your system should you need to access a specific envelope in the future.

    The general approach for each of the top level classes in the sections below works like this:

    1. Introduction to a top level class in CTDL and its Registry Assistant equivalent
    2. Required properties for that class
    3. Publishing a basic record using just the required properties and conversion of raw data to Registry Assistant API class to actual CTDL
    4. Recommended and optional properties for that class
    5. Summary

    You can also Download the C# API Input Classes here.

    Publishing Your Organization

    Introduction

    Usually, the first class you will want to publish is the Organization class. This is the class that represents your organization, and you will use its CTID to reference the data within it. In most cases, you will want to use the ceterms:CredentialOrganization class, unless your organization focuses on providing quality assurance - in which case you will substitute the ceterms:QACredentialOrganization class instead.

    To format or publish an Organization, use the following endpoints:

    Format Data (only)

    https://credentialengine.org/sandbox/organization/format

    Publish Data (automatically formats first)

    https://credentialengine.org/sandbox/organization/publish

    Required Properties

    The Registry Assistant API uses a simplified version of the equivalent CTDL class to convey the data for an organization. This class is the same regardless of whether the resulting CTDL class is a QA Organization or not. This class has the following required properties:

    Name or title of the entity.
    Statement, characterization or account of the entity.
    Type of organization such as educational institution, credentialing organization or quality assurance body; select from an existing enumeration of such types.
    Values must be URIs of terms in the Organization Type Vocabulary.
    Type of sociological, economic, or political subdivision served by an organization; select from an existing enumeration of such types.
    Values must be URIs of terms in the Agent Sector Vocabulary.
    The webpage that describes this entity.
    Globally unique Credential Transparency Identifier (CTID) by which the creator, owner or provider of a credential, learning opportunity competency, or assessment recognizes the entity in transactions with the external environment (e.g., in verifiable claims involving a credential).
    Type
    A string of text that must either be ceterms:CredentialOrganization or ceterms:QACredentialOrganization depending on which type of organization you are publishing data about.
    Values must be URIs of terms in the Organization Type Vocabulary.
    You must also include at least one of:
    Particulars describing the location of the place.
    Email address of the organization or person.

    Publishing a Basic Record

    Your system will need to output the data above in JSON format. For example:

    {
    	"Type": "ceterms:CredentialOrganization",
    	"Name": "My Organization Name",
    	"Description": "This is some text that describes my organization.",
    	"SubjectWebpage": "http://www.credreg.net",
    	"CTID": "ce-28935e07-76dc-4562-8c43-3ece101686be",
    	"AgentType": [
    		"orgType:PrimarilyOnline",
    		"orgType:Vendor"
    	],
    	"AgentSectorType": [
    		"agentSector:PrivateForProfit"
    	]
    }

    When sent to either the Format or Publish endpoints, the data will be transformed by the API to its JSON-LD equivalent, using CTDL properties and structure:

    {
    	"@context": "http://credreg.net/ctdl/schema/context/json",
    	"@id": "http://lr-staging.learningtapestry.com/resources/ce-28935e07-76dc-4562-8c43-3ece101686be",
    	"@type": "ceterms:CredentialOrganization",
    	"ceterms:name": "My Organization Name",
    	"ceterms:description": "This is some text that describes my organization.",
    	"ceterms:subjectWebpage": "http://www.credreg.net",
    	"ceterms:ctid": "ce-28935e07-76dc-4562-8c43-3ece101686be",
    	"ceterms:agentType": [
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Primarily Online",
    			"ceterms:targetNode": "orgType:PrimarilyOnline"
    		},
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Vendor",
    			"ceterms:targetNode": "orgType:Vendor"
    		}
    	],
    	"ceterms:agentSectorType": [
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Private For-Profit",
    			"ceterms:targetNode": "agentSector:PrivateForProfit"
    		}
    	]
    }

    If you use Format, the above data will be returned to your system, and no further action will be taken by the API. If you use Publish, the above data will then be published to the Credential Registry. You will then receive the result of the publish action, which includes the CER Envelope that the above data was inserted into. It generally looks like this:

    {
    	"envelope_community": "ce_registry",
    	"envelope_id": "26597acf-2582-4b46-992b-d4a38608e007",
    	"envelope_type": "resource_data",
    	"envelope_version": "1.0.0",
    	"resource_encoding": "jwt",
    	"resource_format": "json",
    	"node_headers": "This is an object containing additional data about the payload and the envelope itself, beyond the scope of this article. Refer to the Registry documentation for details.",
    	"resource": "This is a long string of characters representing a cryptographically encoded version of the payload (decoded_resource) below. It has been omitted here for brevity.",
    	"decoded_resource": {
    		"@context": "http://credreg.net/ctdl/schema/context/json",
    		"@id": "http://lr-staging.learningtapestry.com/resources/ce-28935e07-76dc-4562-8c43-3ece101686be",
    		"@type": "ceterms:CredentialOrganization",
    		"ceterms:name": "My Organization Name",
    		"ceterms:description": "This is some text that describes my organization.",
    		"ceterms:subjectWebpage": "http://www.credreg.net",
    		"ceterms:ctid": "ce-28935e07-76dc-4562-8c43-3ece101686be",
    		"ceterms:agentType": [
    			{
    				"@type": "ceterms:CredentialAlignmentObject",
    				"ceterms:targetNodeName": "Primarily Online",
    				"ceterms:targetNode": "orgType:PrimarilyOnline"
    			},
    			{
    				"@type": "ceterms:CredentialAlignmentObject",
    				"ceterms:targetNodeName": "Vendor",
    				"ceterms:targetNode": "orgType:Vendor"
    			}
    		],
    		"ceterms:agentSectorType": [
    			{
    				"@type": "ceterms:CredentialAlignmentObject",
    				"ceterms:targetNodeName": "Private For-Profit",
    				"ceterms:targetNode": "agentSector:PrivateForProfit"
    			}
    		]
    	}
    }

    Recommended Properties

    In order to maximize the utility of the Organization data in the Registry, we recommend you also include data for the following properties:

    Social media access point for an agent or an agent's contact point.
    Keyword or key phrase describing relevant aspects of an entity.
    Image, icon or logo that represents the entity including registered trade or service marks.
    Type of service offered by the agent being described; select from an existing enumeration of such terms.
    Values must be URIs of terms in the Agent Service Type Vocabulary.
    Organization's primary purpose as found on an "about" page of a website.
    Short, key phrases describing the primary purpose of an organization as might be derived from the "about" page of it's website.
    Quality assurance organization that provides official authorization to, or approval of, a credential, organization, assessment, or learning opportunity.
    Organization that pronounces favorable judgment for this credential, assessment, learning opportunity, or organization.
    Agent that acknowledges the validity of the credential, learning opportunity of assessment.
    Quality assurance organization that enforces the legal requirements of the credential, learning resource or assessment.
    Larger organization exercising authority over the organization being described.

    An example organization that has been fleshed out with some of the properties above might look something like this:

    {
    	"Type": "ceterms:CredentialOrganization",
    	"Name": "My Organization Name",
    	"Description": "This is some text that describes my organization.",
    	"SubjectWebpage": "http://www.credreg.net",
    	"CTID": "ce-28935e07-76dc-4562-8c43-3ece101686be",
    	"AgentType": [
    		"orgType:PrimarilyOnline",
    		"orgType:Vendor"
    	],
    	"AgentSectorType": [
    		"agentSector:PrivateForProfit"
    	],
    	"SocialMedia": [
    		"https://twitter.com/credengine",
    		"https://www.facebook.com/credengine",
    		"https://www.youtube.com/channel/UCyTpUktFYQNlLrLR4O_AcQA"
    	],
    	"Keyword": [
    		"Credentials",
    		"Technical Information",
    		"Credential Registry"
    	],
    	"ServiceType": [
    		"serviceType:ApproveService",
    		"serviceType:RenewService"
    	],
    	"AccreditedBy": [
    		"ce-e8305dc9-46cb-46be-8320-9a794df9e252"
    	]
    }

    When transformed, the data would look like this:

    {
    	"@context": "http://credreg.net/ctdl/schema/context/json",
    	"@id": "http://lr-staging.learningtapestry.com/resources/ce-28935e07-76dc-4562-8c43-3ece101686be",
    	"@type": "ceterms:CredentialOrganization",
    	"ceterms:name": "My Organization Name",
    	"ceterms:description": "This is some text that describes my organization.",
    	"ceterms:subjectWebpage": "http://www.credreg.net",
    	"ceterms:ctid": "ce-28935e07-76dc-4562-8c43-3ece101686be",
    	"ceterms:agentType": [
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Primarily Online",
    			"ceterms:targetNode": "orgType:PrimarilyOnline"
    		},
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Vendor",
    			"ceterms:targetNode": "orgType:Vendor"
    		}
    	],
    	"ceterms:agentSectorType": [
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Private For-Profit",
    			"ceterms:targetNode": "agentSector:PrivateForProfit"
    		}
    	],
    	"ceterms:socialMedia": [
    		"https://twitter.com/credengine",
    		"https://www.facebook.com/credengine",
    		"https://www.youtube.com/channel/UCyTpUktFYQNlLrLR4O_AcQA"
    	],
    	"ceterms:keyword": [
    		"Credentials",
    		"Technical Information",
    		"Credential Registry"
    	],
    	"ceterms:serviceType": [
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Approve Service",
    			"ceterms:targetNode": "serviceType:ApproveService"
    		},
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Renew Service",
    			"ceterms:targetNode": "serviceType:RenewService"
    		}
    	],
    	"ceterms:accreditedBy": [
    		"http://lr-staging.learningtapestry.com/resources/ce-e8305dc9-46cb-46be-8320-9a794df9e252"
    	]
    }

    Sample

    To publish the data, you will need to wrap it in an object that also contains an APIKey property. Naturally, this is where you will include your API key. The organization data itself will go in an Organization property:

    {
    	"Organization": {
    		"Name": "My organization name"
    		//Other properties...
    	},
    	"APIKey": "Your_API_Key_here"
    }

    Below is some example code to publish a simple organization object:

    C#

    using System.Collections.Generic;
    using System.Text;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using Newtonsoft.Json;
    
    namespace Publish_Test {
    	public class Publisher 
    	{
    		public string PublishSimpleRecord() 
    		{
    			//Holds the result of the publish action
    			var result = "";
    
    			//Assign a CTID and keep track of it
    			var myOrgCTID = "ce-" + Guid.NewGuid().ToString();
    			DataService.SaveOrganizationCTID( myOrgCTID );
    
    			//A simple organization object - see below for sample class definition
    			var myOrg = new SampleOrganization() 
    			{
    				Name = "My Organization Name",
    				Description = "This is some text that describes my organization.",
    				CTID = myOrgCTID,
    				SubjectWebpage = "http://www.credreg.net",
    				Type = "ceterms:CredentialOrganization",
    				Keyword = new List<string>() { "Credentials", "Technical Information", "Credential Registry" },
    				AgentSectorType = "agentSector:PrivateNonProfit",
    				Email = "info@credreg.net"
    			};
    
    			//This holds the organization and the API key
    			var myData = new OrganizationRequest()
    			{
    				Organization = myOrg,
    				APIKey = "Your_API_Key_Here"
    			};
    
    			//Serialize the organization request object
    			var json = JsonConvert.SerializeObject( myData );
    
    			//Use HttpClient to perform the publish
    			using ( var client = new HttpClient() )
    			{
    				//Accept JSON
    				client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue( "application/json" ) );
    
    				//Format the json as content
    				var content = new StringContent( json, Encoding.UTF8, "application/json" );
    
    				//The endpoint to publish to
    				var publishEndpoint = "https://credentialengine.org/sandbox/organization/publish/";
    
    				//Perform the actual publish action and store the result
    				result = client.PostAsync( publishEndpoint, content ).Result.Content.ReadAsStringAsync().Result;
    			}
    
    			//Return the result
    			return result;
    		}
    
    		public class OrganizationRequest
    		{
    			public SampleOrganization Organization { get; set; }
    			public string APIKey { get; set; }
    		}
    
    		public class SampleOrganization
    		{
    			public string Type { get; set; }
    			public string Name { get; set; }
    			public string Description { get; set; }
    			public string SubjectWebpage { get; set; }
    			public string CTID { get; set; }
    			public string Image { get; set; }
    			public string AgentPurpose { get; set; }
    			public string AgentPurposeDescription { get; set; }
    			public List<string> AgentType { get; set; }
    			public List<string> AgentSectorType { get; set; }
    			public List<string> Type { get; set; }
    			public List<string> Address { get; set; }
    			public List<string> Email { get; set; }
    			public List<string> SocialMedia { get; set; }
    			public List<string> Keyword { get; set; }
    			public List<string> ServiceType { get; set; }
    			public List<string> AccreditedBy { get; set; }
    			public List<string> ApprovedBy { get; set; }
    			public List<string> RecognizedBy { get; set; }
    			public List<string> RegulatedBy { get; set; }
    			public List<string> ParentOrganization { get; set; }
    
    		}
    	}		
    }
    

    Summary

    As you can see, once you get past the most basic properties, the Registry Assistant API alleviates a great deal of the complexity of the CTDL structure. This reduces the likelyhood of errors and ensures your data will be compatible with systems that consume data from the Registry.

    Publishing Your Credential

    Introduction

    Once your organization has been published, you will often want to publish your first credential. For each credential you want to publish, you must first consider which type of credential it is. These types are defined by the subclasses of "Credential" in CTDL. A listing of Credential types is available here. Select the type that is most appropriate for your credential - note that you must pick exactly one type.

    Note that some credentials may be one type and also include a badge to represent them. In these cases, the badge is considered a type of verification, and is handled elsewhere in CTDL. The badge credential type is reserved for credentials that are exclusively defined as badges.

    To format or publish a Credential, use the following endpoints:

    Format Data (only)

    https://credentialengine.org/sandbox/credential/format

    Publish Data (automatically formats first)

    https://credentialengine.org/sandbox/credential/publish

    Required Properties

    Once you have selected a type for your credential, your system will need to output at least these required properties:

    Name or title of the entity.
    Statement, characterization or account of the entity.
    Type of official status of the credential; select from an enumeration of such types.
    Values must be URIs of terms in the Credential Status Vocabulary.
    The webpage that describes this entity.
    Globally unique Credential Transparency Identifier (CTID) by which the creator, owner or provider of a credential, learning opportunity competency, or assessment recognizes the entity in transactions with the external environment (e.g., in verifiable claims involving a credential).
    Type
    A string of text that must be one of the types of Credential as listed in the Credential types section of the main Registry page.
    Values must be URIs of terms in the Credential Type Vocabulary.
    You must also include at least one of:
    Organization or person with an enforceable claim or legal title to the credential, assessment or learning opportunity.
    Agent that offers the credential, learning opportunity or assessment.

    Publishing a Basic Record

    Your system will need to output the data above in JSON format. For example:

    {
    	"Type": "ceterms:Certificate",
    	"Name": "My Credential Name",
    	"Description": "This is some text that describes my credential.",
    	"SubjectWebpage": "http://www.credreg.net/credential/1234",
    	"CTID": "ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71",
    	"CredentialStatusType": [
    		"credentialStat:Active"
    	]
    }

    When sent to either the Format or Publish endpoints, the data will be transformed by the API to its JSON-LD equivalent, using CTDL properties and structure:

    {
    	"@context": "http://credreg.net/ctdl/schema/context/json",
    	"@id": "http://lr-staging.learningtapestry.com/resources/ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71",
    	"@type": "ceterms:Certificate",
    	"ceterms:name": "My Credential Name",
    	"ceterms:description": "This is some text that describes my credential.",
    	"ceterms:subjectWebpage": "http://www.credreg.net/credential/1234",
    	"ceterms:ctid": "ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71",
    	"ceterms:credentialStatusType": [
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Active",
    			"ceterms:targetNode": "credentialStat:Active"
    		}
    	]
    }

    If you use Format, the above data will be returned to your system, and no further action will be taken by the API. If you use Publish, the above data will then be published to the Credential Registry. You will then receive the result of the publish action, which includes the CER Envelope that the above data was inserted into. It generally looks like this:

    {
    	"envelope_community": "ce_registry",
    	"envelope_id": "26597acf-2582-4b46-992b-d4a38608e007",
    	"envelope_type": "resource_data",
    	"envelope_version": "1.0.0",
    	"resource_encoding": "jwt",
    	"resource_format": "json",
    	"node_headers": "This is an object containing additional data about the payload and the envelope itself, beyond the scope of this article. Refer to the Registry documentation for details.",
    	"resource": "This is a long string of characters representing a cryptographically encoded version of the payload (decoded_resource) below. It has been omitted here for brevity.",
    	"decoded_resource": {
    		"@context": "http://credreg.net/ctdl/schema/context/json",
    		"@id": "http://lr-staging.learningtapestry.com/resources/ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71",
    		"@type": "ceterms:Certificate",
    		"ceterms:name": "My Credential Name",
    		"ceterms:description": "This is some text that describes my credential.",
    		"ceterms:subjectWebpage": "http://www.credreg.net/credential/1234",
    		"ceterms:ctid": "ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71",
    		"ceterms:credentialStatusType": [
    			{
    				"@type": "ceterms:CredentialAlignmentObject",
    				"ceterms:targetNodeName": "Active",
    				"ceterms:targetNode": "credentialStat:Active"
    			}
    		]
    	}
    }

    Recommended Properties

    In order to maximize the utility of the Credential data in the Registry, we recommend you also include data for the following properties:

    Effective date of the content of a credential, assessment or learning opportunity.
    Keyword or key phrase describing relevant aspects of an entity.
    Type of level indicating a point in a progression through an educational or training context, for which the credential is intended; select from an existing enumeration of such types.
    Values must be URIs of terms in the Audience Level Vocabulary.
    Type of industry; select from an existing enumeration of such types such as the SIC, NAICS, and ISIC classifications.
    Type of occupation; select from an existing enumeration of such types.
    Estimated cost of a credential, learning opportunity or assessment.
    Estimated time it will take to complete a credential, learning opportunity or assessment.
    Physical location where the credential, assessment, or learning opportunity can be pursued.
    Listing of online and/or physical locations where a credential can be pursued.
    Online location where the credential, assessment, or learning opportunity can be pursued.
    Entity describing the constraints, prerequisites, entry conditions, or requirements necessary to maintenance and renewal of an awarded credential.
    Entity that describes the processes and criteria for ending (revoking) the validity or operation of an awarded credential.
    Requirement or set of requirements for this credential, learning opportunity, or assessment.
    Quality assurance organization that provides official authorization to, or approval of, a credential, organization, assessment, or learning opportunity.
    Organization that pronounces favorable judgment for this credential, assessment, learning opportunity, or organization.
    Agent that offers the credential, learning opportunity or assessment.
    Agent that acknowledges the validity of the credential, learning opportunity of assessment.
    Quality assurance organization that enforces the legal requirements of the credential, learning resource or assessment.
    Organization or person that handles revocation of an awarded credential due to violations or failure to renew.

    Below is an example of a Credential object that has been fleshed out with some of the recommended properties:

    {
    	"Type": "ceterms:Certificate",
    	"Name": "My Credential Name",
    	"Description": "This is some text that describes my credential.",
    	"SubjectWebpage": "http://www.credreg.net/credential/1234",
    	"CTID": "ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71",
    	"CredentialStatusType": [
    		"credentialStat:Active"
    	],
    	"Keyword": [
    		"Credentials",
    		"Technical Information",
    		"Credential Registry"
    	],
    	"IndustryType": [
    		"333922",
    		"333923",
    		"333924"
    	],
    	"OccupationType": [
    		"51-4121",
    		"11-3051"
    	],
    	"AccreditedBy": [
    		"ce-e8305dc9-46cb-46be-8320-9a794df9e252"
    	],
    	"DateEffective": "2016-07-18",
    	"EstimatedDuration": [
    		{
    			"Description": "This is about how long it takes to earn this credential.",
    			"MinimumDuration": "P1Y6M15D",
    			"MaximumDuration": "P2Y8M"
    		}
    	],
    	"EstimatedCost": [
    		{
    			"Name": "General Tuition for this Credential",
    			"Description": "This is how much it costs to earn this credential in general for local residents.",
    			"Price": 101.5,
    			"Currency": "USD",
    			"PaymentPattern": "Every other month, on the 5th",
    			"DirectCostType": [
    				"costType:Tuition"
    			],
    			"ResidencyType": [
    				"residency:Local",
    				"residency:InState"
    			],
    			"StartDate": "2014-04-12",
    			"EndDate": "2019-04-12"
    		},
    		{
    			"Name": "Tuition Fees for Veterans",
    			"Description": "This is how much it costs to earn this credential for current and former members of the military.",
    			"Price": 74.92,
    			"Currency": "USD",
    			"PaymentPattern": "Every other month, on the 5th",
    			"DirectCostType": [
    				"costType:Tuition"
    			],
    			"ResidencyType": [
    				"audience:CurrentMilitary",
    				"audience:FormerMilitary"
    			]
    		}
    	],
    	"Requires": [
    		{
    			"Name": "Simple Requirements",
    			"Description": "A Condition Profile has many properties, but sometimes you only need a few of them.",
    			"Condition": [
    				"Bullet point",
    				"Another list item",
    				"A third list item"
    			]
    		},
    		{
    			"Name": "Deeper Requirements",
    			"Description": "These conditions only apply to a specific combination of audience type and level.",
    			"AudienceType": [
    				"audience:FormerStudent",
    				"audience:CurrentStudent"
    			],
    			"AudienceLevelType": [
    				"audLevel:AssociatesDegreeLevel",
    				"audLevel:IntermediateLevel",
    				"audLevel:PostSecondaryLevel"
    			],
    			"TargetCredential": [
    				"ce-413704ba-f9fd-4f17-9815-370b42dda7bb"
    			],
    			"TargetAssessment": [
    				"ce-9db20b92-0787-43b2-83e1-b967d73d5df9",
    				"ce-7d838a41-88e1-4011-885b-7318ef31c3dd"
    			],
    			"TargetCompetency": [
    				"f8a0eb87-791b-4749-918b-258610effa49",
    				"f62ffde2-954d-42f1-bc1e-8f7904f0fbfe"
    			]
    		}
    	]
    }

    When transformed, the data would look like this:

    {
    	"@context": "http://credreg.net/ctdl/schema/context/json",
    	"@id": "http://lr-staging.learningtapestry.com/resources/ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71",
    	"@type": "ceterms:Certificate",
    	"ceterms:name": "My Credential Name",
    	"ceterms:description": "This is some text that describes my credential.",
    	"ceterms:subjectWebpage": "http://www.credreg.net/credential/1234",
    	"ceterms:ctid": "ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71",
    	"ceterms:credentialStatusType": [
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Active",
    			"ceterms:targetNode": "credentialStat:Active"
    		}
    	],
    	"ceterms:keyword": [
    		"Credentials",
    		"Technical Information",
    		"Credential Registry"
    	],
    	"ceterms:industryType": [],
    	"ceterms:occupationType": [],
    	"ceterms:accreditedBy": [
    		"http://lr-staging.learningtapestry.com/resources/ce-e8305dc9-46cb-46be-8320-9a794df9e252"
    	],
    	"ceterms:dateEffective": "2016-07-18",
    	"ceterms:estimatedDuration": [
    		{
    			"@type": "ceterms:DurationProfile",
    			"ceterms:description": "This is about how long it takes to earn this credential.",
    			"ceterms:minimumDuration": "P1Y6M15D",
    			"ceterms:maximumDuration": "P2Y8M"
    		}
    	],
    	"ceterms:estimatedCost": [
    		{
    			"@type": "ceterms:CostProfile",
    			"ceterms:name": "General Tuition for this Credential",
    			"ceterms:description": "This is how much it costs to earn this credential in general for local residents.",
    			"ceterms:price": 101.5,
    			"ceterms:currency": "USD",
    			"ceterms:paymentPattern": "Every other month, on the 5th",
    			"ceterms:directCostType": [
    				{
    					"@type": "ceterms:CredentialAlignmentObject",
    					"ceterms:targetNodeName": "Tuition",
    					"ceterms:targetNode": "costType:Tuition"
    				}
    			],
    			"ceterms:residencyType": [
    				{
    					"@type": "ceterms:CredentialAlignmentObject",
    					"ceterms:targetNodeName": "Local",
    					"ceterms:targetNode": "residency:Local"
    				},
    				{
    					"@type": "ceterms:CredentialAlignmentObject",
    					"ceterms:targetNodeName": "In-State",
    					"ceterms:targetNode": "residency:InState"
    				}
    			],
    			"ceterms:startDate": "2014-04-12",
    			"ceterms:endDate": "2019-04-12"
    		},
    		{
    			"@type": "ceterms:CostProfile",
    			"ceterms:name": "Tuition Fees for Veterans",
    			"ceterms:description": "This is how much it costs to earn this credential for current and former members of the military.",
    			"ceterms:price": 74.92,
    			"ceterms:currency": "USD",
    			"ceterms:paymentPattern": "Every other month, on the 5th",
    			"ceterms:directCostType": [
    				{
    					"@type": "ceterms:CredentialAlignmentObject",
    					"ceterms:targetNodeName": "Tuition",
    					"ceterms:targetNode": "costType:Tuition"
    				}
    			],
    			"ceterms:residencyType": [
    				{
    					"@type": "ceterms:CredentialAlignmentObject",
    					"ceterms:targetNodeName": "Current Military",
    					"ceterms:targetNode": "audience:CurrentMilitary"
    				},
    				{
    					"@type": "ceterms:CredentialAlignmentObject",
    					"ceterms:targetNodeName": "Former Military / Veteran",
    					"ceterms:targetNode": "audience:FormerMilitary"
    				}
    			]
    		}
    	],
    	"ceterms:requires": [
    		{
    			"@type": "ceterms:ConditionProfile",
    			"ceterms:name": "Simple Requirements",
    			"ceterms:description": "A Condition Profile has many properties, but sometimes you only need a few of them.",
    			"ceterms:condition": [
    				"Bullet point",
    				"Another list item",
    				"A third list item"
    			]
    		},
    		{
    			"@type": "ceterms:ConditionProfile",
    			"ceterms:name": "Deeper Requirements",
    			"ceterms:description": "These conditions only apply to a specific combination of audience type and level.",
    			"ceterms:audienceType": [
    				"audience:FormerStudent",
    				"audience:CurrentStudent"
    			],
    			"ceterms:audienceLevelType": [
    				"audLevel:AssociatesDegreeLevel",
    				"audLevel:IntermediateLevel",
    				"audLevel:PostSecondaryLevel"
    			],
    			"ceterms:targetCredential": [
    				"http://lr-staging.learningtapestry.com/resources/ce-413704ba-f9fd-4f17-9815-370b42dda7bb"
    			],
    			"ceterms:targetAssessment": [
    				"http://lr-staging.learningtapestry.com/resources/ce-9db20b92-0787-43b2-83e1-b967d73d5df9",
    				"http://lr-staging.learningtapestry.com/resources/ce-7d838a41-88e1-4011-885b-7318ef31c3dd"
    			],
    			"ceterms:targetCompetency": [
    				"f8a0eb87-791b-4749-918b-258610effa49",
    				"f62ffde2-954d-42f1-bc1e-8f7904f0fbfe"
    			]
    		}
    	]
    }

    Sample

    To publish the data, you will need to wrap it in an object that also contains an APIKey property. Naturally, this is where you will include your API key. The credential data itself will go in a Credential property:

    {
    	"Credential": {
    		"Name": "My credential name"
    	},
    	"APIKey": "Your_API_Key_here"
    }

    Below is some example code to publish a simple credential object:

    C#

    using System.Collections.Generic;
    using System.Text;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using Newtonsoft.Json;
    
    namespace Publish_Test {
    	public class Publisher 
    	{
    		public string PublishSimpleRecord() 
    		{
    			//Holds the result of the publish action
    			var result = "";
    
    			//Assign a CTID and keep track of it
    			var myCredCTID = "ce-" + Guid.NewGuid().ToString();
    			DataService.SaveCredentialCTID( myCredCTID );
    
    			//A simple credential object - see below for sample class definition
    			var myCred = new SampleCredential() 
    			{
    				Name = "My Credential Name",
    				Description = "This is some text that describes my credential.",
    				CTID = myCredCTID,
    				SubjectWebpage = "http://www.credreg.net/credential/1234",
    				Type = "ceterms:Certificate",
    				Keyword = new List<string>() { "Credentials", "Technical Information", "Credential Registry" },
    				IndustryType = new List<string>() { "333922", "333923", "333924" },
    				Requires = new List<ConditionProfile>(),
    				{
    					new ConditionProfile()
    					{
    						Name = "My Requirements",
    						Condition = new List<string>() { "Condition One", "Condition Two", "Condition Three" }
    					}
    				}
    			};
    
    			//This holds the credential and the API key
    			var myData = new CredentialRequest()
    			{
    				Credential = myCred,
    				APIKey = "Your_API_Key_Here"
    			};
    
    			//Serialize the credential request object
    			var json = JsonConvert.SerializeObject( myData );
    
    			//Use HttpClient to perform the publish
    			using ( var client = new HttpClient() )
    			{
    				//Accept JSON
    				client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue( "application/json" ) );
    
    				//Format the json as content
    				var content = new StringContent( json, Encoding.UTF8, "application/json" );
    
    				//The endpoint to publish to
    				var publishEndpoint = "https://credentialengine.org/sandbox/credential/publish/";
    
    				//Perform the actual publish action and store the result
    				result = client.PostAsync( publishEndpoint, content ).Result.Content.ReadAsStringAsync().Result;
    			}
    
    			//Return the result
    			return result;
    		}
    
    		public class CredentialRequest
    		{
    			public SampleOrganization Organization { get; set; }
    			public string APIKey { get; set; }
    		}
    
    		public class SampleCredential
    		{
    			public string Name { get; set; }
    			public string Description { get; set; }
    			public string SubjectWebpage { get; set; }
    			public string Type { get; set; }
    			public string DateEffective { get; set; }
    			public List<string> Keyword { get; set; }
    			public List<string> AudienceLevelType { get; set; }
    			public List<string> IndustryType { get; set; }
    			public List<string> OccupationType { get; set; }
    			public List<ConditionProfile> Requires { get; set; }
    			public List<ConditionProfile> Recommends { get; set; }
    			//Other properties
    		}
    
    		public class ConditionProfile 
    		{
    			public string Name { get; set; }
    			public string Description { get; set; }
    			public List<string> Condition { get; set; }
    			//Othe properties
    		}
    	}		
    }
    

    Summary

    As you can see, the Registry Assistant API greatly reduces the amount of data your system needs to carefully construct by abstracting away many of the intricacies of JSON-LD. However, it is very useful to learn about and understand JSON-LD for the benefit of your own system and to aid in any further development or debugging or usage of the data you get back from the Registry Assistant API.

    Publishing Your Assessment

    Introduction

    The Assessment Profile class represents a description of a specific assessment related in some way to a credential. An assessment can be written, performance, and/or artifact-based. Generally, you only need to describe assessments that are significant and/or standalone (assessments such as exams, tests, and quizzes included in a learning opportunity do not need to be described unless there is a good reason to do so). For more information, review the CTDL Guide.

    To format or publish an Assessment, use the following endpoints:

    Format Data (only)

    https://credentialengine.org/sandbox/assessment/format

    Publish Data (automatically formats first)

    https://credentialengine.org/sandbox/assessment/publish

    Required Properties

    The Registry Assistant API uses a simplified version of the Assessment Profile class to convey the data for an assessment. This class has the following required properties:

    Name or title of the entity.
    Statement, characterization or account of the entity.
    The webpage that describes this entity.
    Globally unique Credential Transparency Identifier (CTID) by which the creator, owner or provider of a credential, learning opportunity competency, or assessment recognizes the entity in transactions with the external environment (e.g., in verifiable claims involving a credential).
    You must also include at least one of:
    Physical location where the credential, assessment, or learning opportunity can be pursued.
    Online location where the credential, assessment, or learning opportunity can be pursued.
    Listing of online and/or physical locations where a credential can be pursued.
    You must also include at least one of:
    Organization or person with an enforceable claim or legal title to the credential, assessment or learning opportunity.
    Agent that offers the credential, learning opportunity or assessment.

    Publishing a Basic Record

    Your system will need to output the data above in JSON format. For example:

    {
    	"Type": "ceterms:AssessmentProfile",
    	"Name": "My Assessment Name",
    	"Description": "This is some text that describes my assessment.",
    	"SubjectWebpage": "http://www.credreg.net/assessment/1234",
    	"CTID": "ce-9db20b92-0787-43b2-83e1-b967d73d5df9",
    	"AvailabilityListing": "http://www.credreg.net/assessment/1234/locations"
    }

    When sent to either the Format or Publish endpoints, the data will be transformed by the API to its JSON-LD equivalent, using CTDL properties and structure:

    {
    	"@context": "http://credreg.net/ctdl/schema/context/json",
    	"@id": "http://lr-staging.learningtapestry.com/resources/ce-9db20b92-0787-43b2-83e1-b967d73d5df9",
    	"@type": "ceterms:AssessmentProfile",
    	"ceterms:name": "My Assessment Name",
    	"ceterms:description": "This is some text that describes my assessment.",
    	"ceterms:subjectWebpage": "http://www.credreg.net/assessment/1234",
    	"ceterms:ctid": "ce-9db20b92-0787-43b2-83e1-b967d73d5df9",
    	"ceterms:availabilityListing": "http://www.credreg.net/assessment/1234/locations"
    }

    If you use Format, the above data will be returned to your system, and no further action will be taken by the API. If you use Publish, the above data will then be published to the Credential Registry. You will then receive the result of the publish action, which includes the CER Envelope that the above data was inserted into. It generally looks like this:

    {
    	"envelope_community": "ce_registry",
    	"envelope_id": "26597acf-2582-4b46-992b-d4a38608e007",
    	"envelope_type": "resource_data",
    	"envelope_version": "1.0.0",
    	"resource_encoding": "jwt",
    	"resource_format": "json",
    	"node_headers": "This is an object containing additional data about the payload and the envelope itself, beyond the scope of this article. Refer to the Registry documentation for details.",
    	"resource": "This is a long string of characters representing a cryptographically encoded version of the payload (decoded_resource) below. It has been omitted here for brevity.",
    	"decoded_resource": {
    		"@context": "http://credreg.net/ctdl/schema/context/json",
    		"@id": "http://lr-staging.learningtapestry.com/resources/ce-9db20b92-0787-43b2-83e1-b967d73d5df9",
    		"@type": "ceterms:AssessmentProfile",
    		"ceterms:name": "My Assessment Name",
    		"ceterms:description": "This is some text that describes my assessment.",
    		"ceterms:subjectWebpage": "http://www.credreg.net/assessment/1234",
    		"ceterms:ctid": "ce-9db20b92-0787-43b2-83e1-b967d73d5df9",
    		"ceterms:availabilityListing": "http://www.credreg.net/assessment/1234/locations"
    	}
    }

    Recommended Properties

    In order to maximize the utility of the Assessment Profile data in the Registry, we recommend you also include data for the following properties:

    Effective date of the content of a credential, assessment or learning opportunity.
    Primary language of the credential, learning opportunity or assessment.
    Estimated time it will take to complete a credential, learning opportunity or assessment.
    Requirement or set of requirements for this credential, learning opportunity, or assessment.
    Recommended credential, learning opportunity or assessment.
    Type of unit of time corresponding to type of credit such as semester hours, quarter hours, clock hours, or hours of participation.
    Number of credit hours awarded for successful completion of a learning opportunity or assessment.
    Type of credit associated with both degree and non-degree learning opportunities; select from an existing enumeration of such types.
    Values must be URIs of terms in the Credit Unit Vocabulary.
    Detailed description of credit unit type.
    Number of either credit units awarded for college credit or continuing education units for successful completion of the learning opportunity or assessment.
    Keyword or key phrase describing relevant aspects of an entity.
    Words or brief phrases describing the topicality of the entity; select subject terms from an existing enumeration of such terms.
    Example assessment or assessment item.
    Text of an example assessment or assessment item.
    Type of intended use of the assessment; select from an existing enumeration of such types.
    Values must be URIs of terms in the Assessment Use Vocabulary.
    Competency evaluated through the assessment.
    Type of method used to conduct an assessment; select from an existing enumeration of such types.
    Values must be URIs of terms in the Assessment Method Vocabulary.
    Type of means by which a learning opportunity or assessment is delivered to credential seekers and by which they interact; select from an existing enumeration of such types.
    Values must be URIs of terms in the Delivery Type Vocabulary.
    Detailed description of the delivery type of an assessment or learning opportunity.

    An example assessment profile that has been fleshed out with some of the properties above might look something like this:

    {
    	"Type": "ceterms:AssessmentProfile",
    	"Name": "My Assessment Name",
    	"Description": "This is some text that describes my assessment.",
    	"SubjectWebpage": "http://www.credreg.net/assessment/1234",
    	"CTID": "ce-9db20b92-0787-43b2-83e1-b967d73d5df9",
    	"AvailabilityListing": "http://www.credreg.net/assessment/1234/locations",
    	"OfferedBy": [
    		"ce-ea5121ad-98b0-4a28-ab97-ff2e567968b2"
    	],
    	"DateEffective": "2016-07-18",
    	"EstimatedDuration": [
    		{
    			"Description": "This is about how long it takes to finish this assessment.",
    			"MinimumDuration": "PT3H",
    			"MaximumDuration": "PT1H"
    		}
    	],
    	"Assesses": [
    		"f8a0eb87-791b-4749-918b-258610effa49",
    		"f62ffde2-954d-42f1-bc1e-8f7904f0fbfe"
    	],
    	"DeliveryType": [
    		"deliveryType:OnlineOnly"
    	]
    }

    When transformed, the data would look like this:

    {
    	"@context": "http://credreg.net/ctdl/schema/context/json",
    	"@id": "http://lr-staging.learningtapestry.com/resources/ce-9db20b92-0787-43b2-83e1-b967d73d5df9",
    	"@type": "ceterms:AssessmentProfile",
    	"ceterms:name": "My Assessment Name",
    	"ceterms:description": "This is some text that describes my assessment.",
    	"ceterms:subjectWebpage": "http://www.credreg.net/assessment/1234",
    	"ceterms:ctid": "ce-9db20b92-0787-43b2-83e1-b967d73d5df9",
    	"ceterms:availabilityListing": "http://www.credreg.net/assessment/1234/locations",
    	"ceterms:offeredBy": [
    		"http://lr-staging.learningtapestry.com/resources/ce-ea5121ad-98b0-4a28-ab97-ff2e567968b2"
    	],
    	"ceterms:dateEffective": "2016-07-18",
    	"ceterms:estimatedDuration": [
    		{
    			"@type": "ceterms:DurationProfile",
    			"ceterms:description": "This is about how long it takes to finish this assessment.",
    			"ceterms:minimumDuration": "PT3H",
    			"ceterms:maximumDuration": "PT1H"
    		}
    	],
    	"ceterms:assesses": [
    		"f8a0eb87-791b-4749-918b-258610effa49",
    		"f62ffde2-954d-42f1-bc1e-8f7904f0fbfe"
    	],
    	"ceterms:deliveryType": [
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Online Only",
    			"ceterms:targetNode": "deliveryType:OnlineOnly"
    		}
    	]
    }

    Sample

    To publish the data, you will need to wrap it in an object that also contains an APIKey property. Naturally, this is where you will include your API key. The assessment data itself will go in an Assessment property:

    {
    	"Assessment": {
    		"Name": "My assessment name"
    	},
    	"APIKey": "Your_API_Key_here"
    }

    Below is some example code to publish a simple assessment object:

    C#

    using System.Collections.Generic;
    using System.Text;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using Newtonsoft.Json;
    
    namespace Publish_Test {
    	public class Publisher 
    	{
    		public string PublishSimpleRecord() 
    		{
    			//Holds the result of the publish action
    			var result = "";
    
    			//Assign a CTID and keep track of it
    			var myAsmtCTID = "ce-" + Guid.NewGuid().ToString();
    			DataService.SaveAssessmentCTID( myAsmtCTID );
    
    			//A simple assessment object - see below for sample class definition
    			var myAsmt = new SampleAssessment() 
    			{
    				Name = "My Assessment Name",
    				Description = "This is some text that describes my assessment.",
    				CTID = myAsmtCTID,
    				SubjectWebpage = "http://www.credreg.net/assessment/1234",
    				Keyword = new List<string>() { "Credentials", "Technical Information", "Credential Registry" },
    				AssessmentMethodType = new List<string>() { "assessMethod:Exam", "assessMethod:Performance" },
    				Requires = new List<ConditionProfile>(),
    				{
    					new ConditionProfile()
    					{
    						Name = "My Requirements",
    						Condition = new List<string>() { "Condition One", "Condition Two", "Condition Three" }
    					}
    				}
    			};
    
    			//This holds the assessment and the API key
    			var myData = new AssessmentRequest()
    			{
    				Assessment = myAsmt,
    				APIKey = "Your_API_Key_Here"
    			};
    
    			//Serialize the credential request object
    			var json = JsonConvert.SerializeObject( myData );
    
    			//Use HttpClient to perform the publish
    			using ( var client = new HttpClient() )
    			{
    				//Accept JSON
    				client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue( "application/json" ) );
    
    				//Format the json as content
    				var content = new StringContent( json, Encoding.UTF8, "application/json" );
    
    				//The endpoint to publish to
    				var publishEndpoint = "https://credentialengine.org/sandbox/assessment/publish/";
    
    				//Perform the actual publish action and store the result
    				result = client.PostAsync( publishEndpoint, content ).Result.Content.ReadAsStringAsync().Result;
    			}
    
    			//Return the result
    			return result;
    		}
    
    		public class AssessmentRequest
    		{
    			public SampleAssessment Assessment { get; set; }
    			public string APIKey { get; set; }
    		}
    
    		public class SampleAssessment
    		{
    			public string Name { get; set; }
    			public string Description { get; set; }
    			public string SubjectWebpage { get; set; }
    			public List<string> Keyword { get; set; }
    			public List<string> AssessmentMethodType { get; set; }
    			public List<string> AssessmentUseType { get; set; }
    			public List<string> DeliveryType { get; set; }
    			public List<ConditionProfile> Requires { get; set; }
    			public List<ConditionProfile> Recommends { get; set; }
    			//Other properties
    		}
    
    		public class ConditionProfile 
    		{
    			public string Name { get; set; }
    			public string Description { get; set; }
    			public List<string> Condition { get; set; }
    			//Othe properties
    		}
    	}		
    }
    

    Summary

    The Registry Assistant API makes it easier to publish data about assessments.

    Publishing Your Learning Opportunity

    Introduction

    The Learning Opportunity Profile is used to describe learning opportunities. In CTDL, a learning opportunity is a blanket term used to describe any significant educational experience, whether it is a one-day training class, a full degree program, or anything in between. For more information, review the CTDL Guide.

    To format or publish a Learning Opportunity, use the following endpoints:

    Format Data (only)

    https://credentialengine.org/sandbox/learningopportunity/format

    Publish Data (automatically formats first)

    https://credentialengine.org/sandbox/learningopportunity/publish

    Required Properties

    The Registry Assistant API uses a simplified version of the Learning Opportunity Profile class to convey the data for an assessment. This class has the following required properties:

    Name or title of the entity.
    Statement, characterization or account of the entity.
    The webpage that describes this entity.
    Globally unique Credential Transparency Identifier (CTID) by which the creator, owner or provider of a credential, learning opportunity competency, or assessment recognizes the entity in transactions with the external environment (e.g., in verifiable claims involving a credential).
    You must also include at least one of:
    Physical location where the credential, assessment, or learning opportunity can be pursued.
    Online location where the credential, assessment, or learning opportunity can be pursued.
    Listing of online and/or physical locations where a credential can be pursued.
    You must also include at least one of:
    Organization or person with an enforceable claim or legal title to the credential, assessment or learning opportunity.
    Agent that offers the credential, learning opportunity or assessment.

    Publishing a Basic Record

    Your system will need to output the data above in JSON format. For example:

    {
    	"Type": "ceterms:LearningOpportunityProfile",
    	"Name": "My Learning Opportunity Name",
    	"Description": "This is some text that describes my learning opportunity.",
    	"SubjectWebpage": "http://www.credreg.net/learningopportunity/1234",
    	"CTID": "ce-08c3dc49-a133-4e7f-a06c-b5e054f62dcc",
    	"AvailabilityListing": "http://www.credreg.net/learningopportunity/1234/locations"
    }

    When sent to either the Format or Publish endpoints, the data will be transformed by the API to its JSON-LD equivalent, using CTDL properties and structure:

    {
    	"@context": "http://credreg.net/ctdl/schema/context/json",
    	"@id": "http://lr-staging.learningtapestry.com/resources/ce-08c3dc49-a133-4e7f-a06c-b5e054f62dcc",
    	"@type": "ceterms:LearningOpportunityProfile",
    	"ceterms:name": "My Learning Opportunity Name",
    	"ceterms:description": "This is some text that describes my learning opportunity.",
    	"ceterms:subjectWebpage": "http://www.credreg.net/learningopportunity/1234",
    	"ceterms:ctid": "ce-08c3dc49-a133-4e7f-a06c-b5e054f62dcc",
    	"ceterms:availabilityListing": "http://www.credreg.net/learningopportunity/1234/locations"
    }

    If you use Format, the above data will be returned to your system, and no further action will be taken by the API. If you use Publish, the above data will then be published to the Credential Registry. You will then receive the result of the publish action, which includes the CER Envelope that the above data was inserted into. It generally looks like this:

    {
    	"envelope_community": "ce_registry",
    	"envelope_id": "26597acf-2582-4b46-992b-d4a38608e007",
    	"envelope_type": "resource_data",
    	"envelope_version": "1.0.0",
    	"resource_encoding": "jwt",
    	"resource_format": "json",
    	"node_headers": "This is an object containing additional data about the payload and the envelope itself, beyond the scope of this article. Refer to the Registry documentation for details.",
    	"resource": "This is a long string of characters representing a cryptographically encoded version of the payload (decoded_resource) below. It has been omitted here for brevity.",
    	"decoded_resource": {
    		"@context": "http://credreg.net/ctdl/schema/context/json",
    		"@id": "http://lr-staging.learningtapestry.com/resources/ce-08c3dc49-a133-4e7f-a06c-b5e054f62dcc",
    		"@type": "ceterms:LearningOpportunityProfile",
    		"ceterms:name": "My Learning Opportunity Name",
    		"ceterms:description": "This is some text that describes my learning opportunity.",
    		"ceterms:subjectWebpage": "http://www.credreg.net/learningopportunity/1234",
    		"ceterms:ctid": "ce-08c3dc49-a133-4e7f-a06c-b5e054f62dcc",
    		"ceterms:availabilityListing": "http://www.credreg.net/learningopportunity/1234/locations"
    	}
    }

    Recommended Properties

    In order to maximize the utility of the Learning Opportunity Profile data in the Registry, we recommend you also include data for the following properties:

    Effective date of the content of a credential, assessment or learning opportunity.
    Primary language of the credential, learning opportunity or assessment.
    Estimated time it will take to complete a credential, learning opportunity or assessment.
    Requirement or set of requirements for this credential, learning opportunity, or assessment.
    Recommended credential, learning opportunity or assessment.
    Type of unit of time corresponding to type of credit such as semester hours, quarter hours, clock hours, or hours of participation.
    Number of credit hours awarded for successful completion of a learning opportunity or assessment.
    Type of credit associated with both degree and non-degree learning opportunities; select from an existing enumeration of such types.
    Values must be URIs of terms in the Credit Unit Vocabulary.
    Detailed description of credit unit type.
    Number of either credit units awarded for college credit or continuing education units for successful completion of the learning opportunity or assessment.
    Keyword or key phrase describing relevant aspects of an entity.
    Words or brief phrases describing the topicality of the entity; select subject terms from an existing enumeration of such terms.
    Competency that the learning opportunity is intended to teach.
    Types of methods used to conduct the learning opportunity; select from an existing enumeration of such types.
    Values must be URIs of terms in the Learning Method Vocabulary.
    Type of means by which a learning opportunity or assessment is delivered to credential seekers and by which they interact; select from an existing enumeration of such types.
    Values must be URIs of terms in the Delivery Type Vocabulary.
    Detailed description of the delivery type of an assessment or learning opportunity.

    An example learning opportunity profile that has been fleshed out with some of the properties above might look something like this:

    {
    	"Type": "ceterms:LearningOpportunityProfile",
    	"Name": "My Learning Opportunity Name",
    	"Description": "This is some text that describes my learning opportunity.",
    	"SubjectWebpage": "http://www.credreg.net/learningopportunity/1234",
    	"CTID": "ce-08c3dc49-a133-4e7f-a06c-b5e054f62dcc",
    	"AvailabilityListing": "http://www.credreg.net/learningopportunity/1234/locations",
    	"OfferedBy": [
    		"ce-ea5121ad-98b0-4a28-ab97-ff2e567968b2"
    	],
    	"DateEffective": "2016-07-18",
    	"EstimatedDuration": [
    		{
    			"Description": "This is about how long it takes to finish this learning opportunity.",
    			"MinimumDuration": "P6M",
    			"MaximumDuration": "P3M"
    		}
    	],
    	"Teaches": [
    		"f8a0eb87-791b-4749-918b-258610effa49",
    		"f62ffde2-954d-42f1-bc1e-8f7904f0fbfe"
    	],
    	"DeliveryType": [
    		"deliveryType:OnlineOnly"
    	]
    }

    When transformed, the data would look like this:

    {
    	"@context": "http://credreg.net/ctdl/schema/context/json",
    	"@id": "http://lr-staging.learningtapestry.com/resources/ce-08c3dc49-a133-4e7f-a06c-b5e054f62dcc",
    	"@type": "ceterms:LearningOpportunityProfile",
    	"ceterms:name": "My Learning Opportunity Name",
    	"ceterms:description": "This is some text that describes my learning opportunity.",
    	"ceterms:subjectWebpage": "http://www.credreg.net/learningopportunity/1234",
    	"ceterms:ctid": "ce-08c3dc49-a133-4e7f-a06c-b5e054f62dcc",
    	"ceterms:availabilityListing": "http://www.credreg.net/learningopportunity/1234/locations",
    	"ceterms:offeredBy": [
    		"http://lr-staging.learningtapestry.com/resources/ce-ea5121ad-98b0-4a28-ab97-ff2e567968b2"
    	],
    	"ceterms:dateEffective": "2016-07-18",
    	"ceterms:estimatedDuration": [
    		{
    			"@type": "ceterms:DurationProfile",
    			"ceterms:description": "This is about how long it takes to finish this learning opportunity.",
    			"ceterms:minimumDuration": "P6M",
    			"ceterms:maximumDuration": "P3M"
    		}
    	],
    	"ceterms:teaches": [
    		"f8a0eb87-791b-4749-918b-258610effa49",
    		"f62ffde2-954d-42f1-bc1e-8f7904f0fbfe"
    	],
    	"ceterms:deliveryType": [
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Online Only",
    			"ceterms:targetNode": "deliveryType:OnlineOnly"
    		}
    	]
    }

    Sample

    To publish the data, you will need to wrap it in an object that also contains an APIKey property. Naturally, this is where you will include your API key. The learning opportunity data itself will go in a LearningOpportunity property:

    {
    	"LearningOpportunity": {
    		"Name": "My learning opportunity name"
    	},
    	"APIKey": "Your_API_Key_here"
    }

    Below is some example code to publish a simple learning opportunity object:

    C#

    using System.Collections.Generic;
    using System.Text;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using Newtonsoft.Json;
    
    namespace Publish_Test {
    	public class Publisher 
    	{
    		public string PublishSimpleRecord() 
    		{
    			//Holds the result of the publish action
    			var result = "";
    
    			//Assign a CTID and keep track of it
    			var myLoppCTID = "ce-" + Guid.NewGuid().ToString();
    			DataService.SaveLearningOpportunityCTID( myLoppCTID );
    
    			//A simple learning opportunity object - see below for sample class definition
    			var myLopp = new SampleLearningOpportunity() 
    			{
    				Name = "My Learning Opportunity Name",
    				Description = "This is some text that describes my learning opportunity.",
    				CTID = myLoppCTID,
    				SubjectWebpage = "http://www.credreg.net/learningopportunity/1234",
    				Keyword = new List<string>() { "Credentials", "Technical Information", "Credential Registry" },
    				LearningMethodType = new List<string>() { "learnMethod:Lecture", "learnMethod:Laboratory" },
    				Requires = new List<ConditionProfile>(),
    				{
    					new ConditionProfile()
    					{
    						Name = "My Requirements",
    						Condition = new List<string>() { "Condition One", "Condition Two", "Condition Three" }
    					}
    				}
    			};
    
    			//This holds the learning opportunity and the API key
    			var myData = new LearningOpportunityRequest()
    			{
    				LearningOpportunity = myLopp,
    				APIKey = "Your_API_Key_Here"
    			};
    
    			//Serialize the credential request object
    			var json = JsonConvert.SerializeObject( myData );
    
    			//Use HttpClient to perform the publish
    			using ( var client = new HttpClient() )
    			{
    				//Accept JSON
    				client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue( "application/json" ) );
    
    				//Format the json as content
    				var content = new StringContent( json, Encoding.UTF8, "application/json" );
    
    				//The endpoint to publish to
    				var publishEndpoint = "https://credentialengine.org/sandbox/learningopportunity/publish/";
    
    				//Perform the actual publish action and store the result
    				result = client.PostAsync( publishEndpoint, content ).Result.Content.ReadAsStringAsync().Result;
    			}
    
    			//Return the result
    			return result;
    		}
    
    		public class LearningOpportunityRequest
    		{
    			public SampleLearningOpportunity LearningOpportunity { get; set; }
    			public string APIKey { get; set; }
    		}
    
    		public class SampleLearningOpportunity
    		{
    			public string Name { get; set; }
    			public string Description { get; set; }
    			public string SubjectWebpage { get; set; }
    			public List<string> Keyword { get; set; }
    			public List<string> LearningMethodType { get; set; }
    			public List<string> AudienceLevelType { get; set; }
    			public List<string> DeliveryType { get; set; }
    			public List<ConditionProfile> Requires { get; set; }
    			public List<ConditionProfile> Recommends { get; set; }
    			//Other properties
    		}
    
    		public class ConditionProfile 
    		{
    			public string Name { get; set; }
    			public string Description { get; set; }
    			public List<string> Condition { get; set; }
    			//Othe properties
    		}
    	}		
    }
    

    Summary

    The Registry Assistant API makes it easier to publish data about learning opportunities.

    Embedded Classes

    Within CTDL, there are a number of classes that are published as objects nested within the four top level classes described above. The Registry Assistant API works the same basic way. Some of the classes below may be used within more than one of the top level classes. In addition, more than one instance of the classes below may be present in many cases.

    Condition Profile

    Condition Profile is the workhorse of CTDL. It is a large profile encompassing a variety of properties that define the complex data which forms the glue between Credentials and most other entities: assessments, learning opportunities, competencies, other credentials, etc. Below are some of the most relevant properties; refer to the CTDL documentation for the full listing.

    The intended interpretation and usage of the data in a Condition Profile depends entirely on which property it is associated with. For instance, A Condition Profile attached to the "requires" property defines requirements for earning a Credential, whereas a Condition Profile attached to "recommends" is merely informational or advisory in nature, and does not define requirements. Often, such information only applies in certain circumstances - Condition Profile is designed to allow designating and describing these circumstances as well. Other properties also use Condition Profile to define connections between other entities in CTDL, but here we will focus on Credentials.

    Note that multiple Condition Profiles defined under the same property (e.g., requires) are considered to all apply to that property if the person pursuing the credential meets the conditions of those profiles. For example, if a credential has 3 Condition Profiles under "requires" and a person pursuing that Credential meets the conditions for two of those Condition Profiles, then that person must meet all of the conditions defined in both of those profiles to earn the Credential.

    Required properties for Condition Profile include:

    Statement, characterization or account of the entity.

    Recommended properties for Condition Profile include:

    Name or title of the entity.
    Artifact to be submitted such as a transcript, portfolio, or an affidavit.
    Single constraint, prerequisite, entry condition, requirement, or cost.
    Credential that is a focus or target of the condition, process or verification service.
    Assessment that provides direct, indirect, formative or summative evaluation or estimation of the nature, ability, or quality for an entity.
    Learning opportunity that is the focus of a condition, process or another learning opportunity.
    A competency relevant to the condition being described.

    Cost Profile

    Cost Profile is a detailed class meant to convey how much something costs in the context of certain circumstances. There are many situations in which the cost of something depends on some factor of the person trying to earn it, such as residency, military status, citizenship, etc. Use as many Cost Profiles as are necessary to convey the different overall costs for these different combinations of circumstances. You may provide one "general" Cost Profile, and only need to provide additional Cost Profiles for particular situations that are relevant to your credential. You should not provide a Cost Profile for every possible combination of the properties/vocabulary terms listed below unless each of those combinations is significantly different.

    Required properties for Cost Profile include:

    Statement, characterization or account of the entity.
    Webpage or online document containing human-readable, in-depth information about costs.

    Recommended properties for Cost Profile include:

    Applicable pattern for payments such as "per sementer" and "every three months".
    Type of credential seeker for whom the particular condition or cost is applicable; select from an existing enumeration of such types.
    Values must be URIs of terms in the Audience Vocabulary.
    Type of legal residency status of a person; select from an existing enumeration of such types.
    Values must be URIs of terms in the Residency Vocabulary.
    Offer price of a credential, learning resource, assessment, related activity or resource.
    Types of direct costs associated with earning or completing a credential, assessment or learning opportunity; select from an existing enumeration of such types.
    Values must be URIs of terms in the Cost Type Vocabulary.
    Currency in which the monetary amount is expressed in 3-letter ISO 4217 format such as "USD".

    Duration Profile

    Duration Profile is a small utility class meant to convey how long something takes. In this case, it is used to indicate approximately how long it will take for the average person to earn this credential. This is often the same as the length of a degree credential's degree program, or the length of a certificate's assessment. Duration Profile allows expressing either an exact duration or a minimum and maximum duration. Provide the data that is most appropriate for your situation.

    Recommended properties for Duration Profile include:

    Minimum amount of time it will take to complete the activity.
    Maximum amount of time it will take to complete the activity.
    Exact period of time of an activity or event.

    Controlled Vocabularies

    Within CTDL, a number of properties leverage controlled vocabularies (also called "concept schemes") to convey concepts in a format that can be understood across multiple systems. A controlled vocabulary works like a miniature schema, defining a set of terms and exactly what those terms mean. In many cases, more than one term from a controlled vocabulary can be used to more accurately define the data being described.

    Controlled vocabularies used in the guidance on this page include:

    Organization Type

    Types of organization.

    Primarily offers assessments for credentials as a service.
    Organization that primarily sells products or services and employs one or more individuals.
    Membership organization primarily engaged in promoting the interests of their business members and providing them with services that may involve the provision of education and credentialing services.
    Independent, third-party organization that operates a certification program. A certification body may or may not be governmental, and may or may not have regulatory authority.
    Authorized postsecondary institution that primarily offers bachelor or higher degrees, but may also award associate degrees.
    Organization in the public sector at the federal, state or local levels.
    Secondary school providing instruction and educational services that do not focus primarily on career and technical education or alternative education.
    Membership organization of workers formed for the purpose of advancing its members' interests in respect to wages, benefits, and working conditions.
    Public school offering special instruction and programs not available elsewhere, designed to attract a more diverse student body from throughout a school district.
    Armed services of a government entity.
    Secondary (i.e., high school) that: 1) addresses needs of students which cannot typically be met in a regular school; 2) provides nontraditional education; 3) falls outside of the categories of regular, magnet/special program emphasis, or career and technical education.
    Organization such as a college or university.
    Organization that primarily operates online.
    Membership organization primarily engaged in promoting the interests of a particular profession, the interests of individuals engaged in that profession, and providing them with services that may involve the provision of education and credentialing services.
    External body that performs accreditation, endorsement, approval, and/or recognition of a credential issuer.
    Secondary school primarily providing education to students at the ninth grade or higher.
    Secondary school that focuses primarily on providing formal preparation for skilled, technical or professional occupations or careers.
    Organization whose major purpose is to provide education and training services but is not a postsecondary education institution with the authority to award degrees.
    Authorized postsecondary institution that primarily offers associate degrees and certificates, and, if authorized, may also award higher degrees.
    Sells, maintains, and issues credentials for its own products and services for public access and use.

    Agent Sector

    Types of sociological, economic, or political subdivision of society.

    Sector that contains privately-owned organizations that operate for profit.
    Sector that contains privately-owned organizations that operate on a non-profit basis.
    Sector that contains government and quasi-government organizations.

    Organization Type

    Major category into which the Organization falls.

    Organization that plays one or more key roles in the lifecycle of a credential.
    Quality assurance organization that plays one or more key roles in the lifecycle of a credential, learning program, or assessment.

    Agent Service Type

    Types of services offered by an agent.

    Agent service provides official authorization to, or approval of, a credential, organization or program based on prescribed standards or criteria.
    Agent service official accepts a credential or authorizes an organization to act or operate.
    Agent service offers resources such as credentials, assessments, or learning opportunities.
    Agent service recommends, endorses, indicates preference for, or otherwise provides a positive judgment.
    Agent service monitors and enforces legal requirements or standards.
    Agent provides service to extend (renew) the validity of a credential.
    Agent provides service to end (revoke) the validity or operation of an awarded credential.

    Credential Status

    Types of applicability statuses of a credential.

    Awards of the credential are ongoing.
    Credential is no longer awarded.
    Credential award is provisional or temporary; frequently pending further assessment of qualification.
    Credential is no longer awarded and has been superseded by another credential.

    Credential Type

    List of Credential subclasses in CTDL.

    Credential earned through work-based learning and earn-and-learn models that meet standards and are applicable to industry trades and professions.
    College/university award for students typically completing the first one to two years of post secondary school education.
    College/university award for students typically completing three to five years of education where course work and activities advance skills beyond those of the first one to two years of college/university study.
    Recognition designed to be displayed as a marker of accomplishment, activity, achievement, skill, interest, association, or identity.
    Credential that designates requisite knowledge and skills of an occupation, profession, or academic program.
    Time-limited, renewable credential awarded by an authoritative body to an individual or organization for demonstrating the designated knowledge, skills, and abilities to perform a specific occupation.
    Academic credential conferred upon completion of a program or course of study, typically over multiple years at a college or university.
    Badge offered in digital form.
    Credential awarded by educational institutions for successful completion of a course of study or its equivalent.
    Highest credential award for students who have completed both a bachelor's degree and a master's degree or their equivalent as well as independent research and/or a significant project or paper.
    Credential awarded by examination that demonstrates that an individual has acquired secondary school-level academic skills.
    Credential awarded to skilled workers on successful completion of an apprenticeship in industry trades and professions.
    Credential awarded by a government agency that constitutes legal authority to do a specific job and/or utilize a specific item, system or infrastructure and are typically earned through some combination of degree or certificate attainment, certifications, assessments, work experience, and/or fees, and are time-limited and must be renewed periodically.
    Credential awarded upon demonstration through apprenticeship of the highest level of skills and performance in industry trades and professions.
    Credential awarded for a graduate level course of study where course work and activities advance skills beyond those of the bachelor's degree or its equivalent.
    Credential that addresses a subset of field-specific knowledge, skills, or competencies; often developmental with relationships to other micro-credentials and field credentials.
    Visual symbol containing verifiable claims in accordance with the Open Badges specification and delivered digitally.
    Doctoral degree conferred upon completion of a program providing the knowledge and skills for the recognition, credential, or license required for professional practice.
    Credential assuring that an organization, program, or awarded credential meets prescribed requirements and may include development and administration of qualifying examinations.
    Doctoral degree conferred for advanced work beyond the master level, including the preparation and defense of a thesis or dissertation based on original research, or the planning and execution of an original project demonstrating substantial artistic or scholarly achievement.
    Diploma awarded by secondary education institutions for successful completion of a secondary school program of study.

    Audience Level

    Types of levels in an academic or training progression expected of, or to be developed by, the typical person for the resource being described.

    Intended for those with significant experience or expertise where developmental expectations are staged for assessing knowledge, skills, or competencies beyond the novice and intermediate levels.
    Intended for those completing college/university-level programs within their first one to two years (lower-division) of post-secondary education.
    Intended for those completing college/university-level programs within approximately three to four years where course work and activities advance skills from a lower-division or generalist level to an upper-division level.
    Intended for novices or those with limited experience.
    Intended for those who have completed Bachelors and Masters degrees or their equivalent and who will be required to complete either independent research or a significant project or paper.
    Intended for those with some experience, where knowledge, skills, and competency expectations are staged for development beyond novice-level and in preparation for a more advanced-level.
    Intended for those who have completed a Bachelor's Degree or equivalent.
    Intended for those who have completed secondary level school programs or equivalent.
    Intended for those attending secondary (high-school) level programs.

    Credit Unit

    Types of credit associated with degree and non-degree learning opportunities.

    Credit that is issued or accepted for certificates.
    Credit that is issued or is accepted as education units for meeting professional development requirements.
    Credit that is issued or is accepted as credit for earning a college-level degree.
    Credit that is issued or accepted for a secondary diploma.

    Assessment Use

    Types of Intended uses of an assessment.

    Formal and informal assessment procedures conducted during the learning process to support intentional modification in teaching and learning activities in order to improve learner attainment.
    Assessment of learning at the end of an instructional unit to determine whether some established standard or benchmark has been achieved.

    Assessment Method

    Types of assessment method.

    Work or product created or produced by the person being assessed.
    Mix of scored items presented in fixed or open response formats including qualifying and comprehensive exams.
    Set of behaviors or actions assessed as demonstration of competencies where the assessment occurs either as the actions take place (i.e., live) or through review of recordings of those actions in a persistent media (e.g., video, audio, keystroke records, etc.)

    Delivery Type

    Types of technical form for providing instances of the entity.

    Delivery includes significant levels of both in person and online.
    Delivery is face-to-face.
    Delivery is via the Internet only.

    Learning Method

    Types of methods used to conduct the learning opportunity.

    Provides learning opportunities in the context of real world examples, cases, and applications.
    Provides interactive educational experiences which demonstrate concepts in a way that promotes critical thinking, overcoming challenges within prescribed rule sets, problem solving, and in some cases, teamwork and/or competition.
    Hands-on individual or group experiences for applied learning concepts and methods, procedures and protocols with equipment and technologies.
    Primary method is presentation by an instructor of learning material and may include student discussion.
    Provides for personalization and flexibility in the timing and progression of learning for individual learners based on their preferences and needs, prior learning experiences, and ability to progress through learning opportunities.
    Primary method is active student discussion leading to advancement of the topic and facilitated by an instructor.
    Provides real-world work experiences that may be paid or unpaid and provided in group or individual formats normally outside the classroom.

    Audience

    Types of audiences for which the resource being described is applicable or available.

    Person who is a legally recognized subject of a particular nation, state, province, or commonwealth.
    Current member of a nation's military.
    Dependent (usually a child) of a current member of a nation's military.
    Spouse of a current member of a nation's military.
    Student currently participating in a learning opportunity.
    Veteran of military service.
    Former dependent (usually a child) of a veteran of a nation's military.
    Spouse of a veteran of a nation's military.
    Student who previously participated in a learning opportunity.
    Participation in a learning opportunity to an extent that meets the opportunity's requirements for full-time status.
    Member of an organization, society, or recognized group.
    Person who is not a legally recognized subject of a particular nation, state, province, or commonwealth.
    Individual without membership status or privileges conferred by an organization, society, or recognized group.
    Person whose primary residence is not in nation, state, province, or commonwealth of concern.
    Participation in a learning opportunity to an extent that meets the opportunity's requirements for part-time status.
    Person employed in the private sector.
    Person employed in the public sector.
    Person whose permanent and principal home is in a particular nation, state, province, or commonwealth.

    Residency

    Types of residency.

    Legal residency or domicile status of the agent is the state or province of the relevant activity.
    Legal residency, domicile, or citizen status of the agent is as a foreign national.
    Legal residency or domicile status of the agent is local.
    Legal residency or domicile status of the agent is a state or province different from the state or provincial locus of the relevant activity.
    Legal residency or domicile status of the agent is the same geographic or political region as that of the relevant activity.

    Cost Type

    Entity that describes the types of costs related to earning or completing a credential, assessment, or learning opportunity.

    Sum of direct costs.
    Cost of applying for the resource being described.
    Cost for a background check.
    Cost to enroll in the learning opportunity being described.
    Separate graduation fee.
    Cost for one or more learning resources.
    Cost for meals while participating in the learning opportunity.
    Cost for additional fees, other services, equipment, or facilities.
    Cost for processing or expediting information related to the resource being described.
    Additional cost for participation with a specific program or course of study such as engineering, business, and nursing.
    Cost for retaking an instance of the resource being described.
    Cost for maintenance or renewal of the resource being described.
    Cost for rescheduling an instance of the resource being described.
    Cost for room, residence or boarding.
    Cost for scoring the resource being described.
    Cost for standalone assessments.
    Cost for student services related to the learning opportunity.
    Cost for accessing technologies related to the learning opportunity or activity.
    Cost for teaching and instruction.