Table of Contents

Top

    Last Updated: March 04, 2018

    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:

    API Input Classes

    When calling endpoints in the API, you only have to include the properties that are needed, or that you have available. Some of the samples in this section may reference related profiles such as condition profiles. If your process will not provide condition profiles, you don't need to include these properties in the classes that you use to fill out data to send to the API. Following are references where you may view or download sample input classes (in C# at this time).

    Simplified Registry Profile

    The Registry Assistant API uses simiplified and flexible input classes. While all properties of CTDL are available, the input properties represent a Registry specific profile.

    Examples of special or simplified classes and properities, follow below.

    Organization Reference

    Special Classes and Multiplicity

    The API input classes clarify the multiplicity of the input properties. As well special classes are used to organize some of the CTDL properties. For example:

    Duration Items

    Serializing to JSON

    While creating a JSON document is fairly straightforward there should not be a need to manually code the JSON format. Libraries are available in most high level languages seriallize a class into JSON. For example The Newtonsoft library can be added to a C# project, and with one line a C# class can be serialized to JSON:

    
    //get a credential
    Credential credential = CredentialServices.GetCredentialForPublish( recordId);
    
    //initialize the credential request class
    var request = new CredentialRequest();
    
    //map the credential to the assistant credential class
    MapToAssistant( credential, request.Credential ); 
    
    //serialize the credential request class
    string postBody = JsonConvert.SerializeObject( request, ServiceHelper.GetJsonSettings() );
    

    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 organization in the Credential Engine Accounts site. To add your organization:

    A member of the CE team will review the organization request. Upon approval:

    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

    The high level steps for using the API include:

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

    You can also view the following PowerPoint Download the Registry Assistant Summary PowerPoint.

    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).
    Particulars describing the location of the place.
    Email address of the organization or person.
    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.

    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": "https://sandbox.credentialengineregistry.org/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": "https://sandbox.credentialengineregistry.org/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.
    Entity that describes a set of constraints, prerequisites, entry conditions, or requirements applicable across the organization, sub-organization or sets of credentials or acitivites.
    Entity that describes a set of cost data applicable across the organization, sub-organization or sets of credentials or acitivites.
    Date the organization was founded.
    Geographic or political region in which the credential is formally applicable or an organization has authority to act.
    Alias for the entity including acronyms, alpha-numeric notations, and other forms of name abbreviations in common use such as PhD, MA, and BA.
    Larger organization exercising authority over the organization being described.
    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.
    Entity describing available systems provided by the agent to verify credential holders.
    Credential, learning opportunity or assessment offered or conferred by the organization or person.
    Credential, learning opportunity or assesment over which the organization or person claims legal title.

    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": "https://sandbox.credentialengineregistry.org/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": [
    		"https://sandbox.credentialengineregistry.org/resources/ce-e8305dc9-46cb-46be-8320-9a794df9e252"
    	]
    }

    Sample

    To publish the data, you will need to wrap it in an object that also contains a PublishForOrganizationIdentifier property. Naturally, this is where you specify the CTID of the owning organization (from the accounts site). The organization data itself will go in an Organization property:

    {
    	"Organization": {
    		"Name": "My organization name"
    		//Other properties...
    	},
    	"PublishForOrganizationIdentifier": "CTID_of_owning_Organization"
    }

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

    C#

    using System;
    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 the api key - acquired from organization account of the organization doing the publishing
                var apiKey = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; 
                //this is the CTID of the organization that owns the data being published
                var organizationIdentifierFromAccountsSite = "ce-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; 
    			//Assign a CTID for the entity being published 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 identifier (CTID) for the owning organization
    			var myData = new OrganizationRequest()
    			{
    				Organization = myOrg,
                 	PublishForOrganizationIdentifier = organizationIdentifierFromAccountsSite
    			};
    			//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" ) );
                    //add API Key (for a publish request)
                    client.DefaultRequestHeaders.Add("Authorization", "ApiToken " + apiKey);
    				//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 PublishForOrganizationIdentifier { 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 FoundingDate { 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> Address { get; set; }
    			public List<string> Email { get; set; }
    			public List<string> Type { get; set; }
    			public List<string> SocialMedia { get; set; }
    			public List<string> Keyword { get; set; }
    			public List<string> ServiceType { get; set; }
    			public List<string> HasConditionManifest { get; set; }
    			public List<string> HasCostManifest { get; set; }
    			public List<string> Jurisdiction { get; set; }
    			public List<string> AlternateName { get; set; }
    			public List<string> ParentOrganization { 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> HasVerificationService { get; set; }
    			public List<string> Offers { get; set; }
    			public List<string> Owns { 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).
    Primary language of the credential, learning opportunity or assessment.
    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.
    Error: Object reference not set to an instance of an object.
    Error: Object reference not set to an instance of an object.
    Error: Object reference not set to an instance of an object.
    Error: Object reference not set to an instance of an object.
    Error: Object reference not set to an instance of an object.
    Error: Object reference not set to an instance of an object.
    Error: Object reference not set to an instance of an object.
    Error: Object reference not set to an instance of an object.
    Error: Object reference not set to an instance of an object.
    Error: Object reference not set to an instance of an object.
    Error: Object reference not set to an instance of an object.
    Error: Object reference not set to an instance of an object.
    Error: Object reference not set to an instance of an object.
    Error: Object reference not set to an instance of an object.
    Error: Object reference not set to an instance of an object.
    Error: Object reference not set to an instance of an object.
    Error: Object reference not set to an instance of an object.
    Error: Object reference not set to an instance of an object.
    Error: Object reference not set to an instance of an object.
    Error: Object reference not set to an instance of an object.
    Error: Object reference not set to an instance of an object.
    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.

    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": "https://sandbox.credentialengineregistry.org/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": "https://sandbox.credentialengineregistry.org/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.
    Credential that has its time or cost reduced by another credential, assessment or learning opportunity.
    Indicates a separately identifiable and independently useful component of the entity.
    This credential, assessment, or learning opportunity reduces the time or cost required to earn or complete the referenced credential, assessment, or learning opportunity.
    Indicates another entity of which this entity is a component.
    This credential, assessment, or learning opportunity provides preparation for the credential, assessment, or learning opportunity being referenced.
    It is recommended to earn or complete this credential, assessment, or learning opportunity before attempting to earn or complete the referenced credential, assessment, or learning opportunity.
    This credential, assessment, or learning opportunity must be earned or completed prior to attempting to earn or complete the referenced credential, assessment, or learning opportunity.
    Another credential, learning opportunity or assessment that provides preparation for this credential, learning opportunity or assessment.
    Recommended credential, learning opportunity or assessment.
    Set constraints, prerequisites, entry conditions, or requirements that are shared across an organization, organizational subdivision, set of credentials, or category of entities and activities.
    Set of costs maintained at an organizational or sub-organizational level, which apply to this credential, assessment, or learning opportunity.
    The type of credential seeker for whom the entity is applicable; select from an existing enumeration of such types.
    Values must be URIs of terms in the Audience Vocabulary.
    Geographic or political region in which the credential is formally applicable or an organization has authority to act.
    Error: Object reference not set to an instance of an object.
    Words or brief phrases describing the topicality of the entity; select subject terms from an existing enumeration of such terms.
    Entity that describes financial assistance for which this credential, assessment, or learning opportunity qualifies.
    Image, icon or logo that represents the entity including registered trade or service marks.
    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.
    Organization or person that handles revocation of an awarded credential due to violations or failure to renew.
    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.
    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.
    Frequency with which the credential needs to be renewed.
    Organization or person that handles the renewal of the credential.
    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": "https://sandbox.credentialengineregistry.org/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": [
    		"https://sandbox.credentialengineregistry.org/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": [
    				"https://sandbox.credentialengineregistry.org/resources/ce-413704ba-f9fd-4f17-9815-370b42dda7bb"
    			],
    			"ceterms:targetAssessment": [
    				"https://sandbox.credentialengineregistry.org/resources/ce-9db20b92-0787-43b2-83e1-b967d73d5df9",
    				"https://sandbox.credentialengineregistry.org/resources/ce-7d838a41-88e1-4011-885b-7318ef31c3dd"
    			],
    			"ceterms:targetCompetency": [
    				"https://sandbox.credentialengineregistry.org/resources/f8a0eb87-791b-4749-918b-258610effa49",
    				"https://sandbox.credentialengineregistry.org/resources/f62ffde2-954d-42f1-bc1e-8f7904f0fbfe"
    			]
    		}
    	]
    }

    Sample

    To publish the data, you will need to wrap it in an object that also contains a PublishForOrganizationIdentifier property. Naturally, this is where you specify the CTID of the owning organization (from the accounts site). The credential data itself will go in a Credential property:

    {
    	"Credential": {
    		"Name": "My credential name"
    	},
    	"PublishForOrganizationIdentifier": "CTID_of_owning_Organization"
    }

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

    C#

    using System;
    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 the api key - acquired from organization account of the organization doing the publishing
                var apiKey = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; 
                //this is the CTID of the organization that owns the data being published
                var organizationIdentifierFromAccountsSite = "ce-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; 
    			//Assign a CTID for the entity being published 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 identifier (CTID) for the owning organization
    			var myData = new CredentialRequest()
    			{
    				Credential = myCred,
                    PublishForOrganizationIdentifier = organizationIdentifierFromAccountsSite
    			};
    			//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" ) );
                    //add API Key (for a publish request)
                    client.DefaultRequestHeaders.Add("Authorization", "ApiToken " + apiKey);
    				//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 SampleCredential Credential { get; set; }
    			public string PublishForOrganizationIdentifier { 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:

    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.
    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).
    Primary language of the credential, learning opportunity or assessment.
    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": "https://sandbox.credentialengineregistry.org/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": "https://sandbox.credentialengineregistry.org/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.
    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.
    Credential that has its time or cost reduced by another credential, assessment or learning opportunity.
    Indicates a separately identifiable and independently useful component of the entity.
    This credential, assessment, or learning opportunity reduces the time or cost required to earn or complete the referenced credential, assessment, or learning opportunity.
    Indicates another entity of which this entity is a component.
    This credential, assessment, or learning opportunity provides preparation for the credential, assessment, or learning opportunity being referenced.
    It is recommended to earn or complete this credential, assessment, or learning opportunity before attempting to earn or complete the referenced credential, assessment, or learning opportunity.
    This credential, assessment, or learning opportunity must be earned or completed prior to attempting to earn or complete the referenced credential, assessment, or learning opportunity.
    Another credential, learning opportunity or assessment that provides preparation 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.
    Set constraints, prerequisites, entry conditions, or requirements that are shared across an organization, organizational subdivision, set of credentials, or category of entities and activities.
    Set of costs maintained at an organizational or sub-organizational level, which apply to this credential, assessment, or learning opportunity.
    Estimated cost of a credential, learning opportunity or assessment.
    Type of method used to score the assessment; select from an existing enumeration of such types.
    Values must be URIs of terms in the Scoring Method Vocabulary.
    Geographic or political region in which the credential is formally applicable or an organization has authority to act.
    Set of alpha-numeric symbols that uniquely identifies an item and supports its discovery and use.
    Prerequisites for entry into a credentialing program, a learning opportunity or an assessment including transcripts, records of previous experience, and lower-level learning opportunities.
    Entity that describes financial assistance for which this credential, assessment, or learning opportunity qualifies.
    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.
    Quality assurance organization that provides official authorization to, or approval of, a credential, organization, assessment, or learning opportunity.
    Error: Object reference not set to an instance of an object.
    Error: Object reference not set to an instance of an object.
    Quality assurance organization that enforces the legal requirements of the credential, learning resource or assessment.

    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": "https://sandbox.credentialengineregistry.org/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": [
    		"https://sandbox.credentialengineregistry.org/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": [
    		"https://sandbox.credentialengineregistry.org/resources/f8a0eb87-791b-4749-918b-258610effa49",
    		"https://sandbox.credentialengineregistry.org/resources/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 a PublishForOrganizationIdentifier property. Naturally, this is where you specify the CTID of the owning organization (from the accounts site). The assessment data itself will go in an Assessment property:

    {
    	"Assessment": {
    		"Name": "My assessment name"
    	},
    	"PublishForOrganizationIdentifier": "CTID_of_owning_Organization"
    }

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

    C#

    
    using System;
    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 the api key - acquired from organization account of the organization doing the publishing
                var apiKey = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; 
                //this is the CTID of the organization that owns the data being published
                var organizationIdentifierFromAccountsSite = "ce-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; 
    			//Assign a CTID for the entity being published and keep track of it
    			var myCTID = "ce-" + Guid.NewGuid().ToString();
    			DataService.SaveAssessmentCTID( myCTID );
    			//A simple assessment object - see below for sample class definition
    			var myData = new SampleAssessment() 
    			{
    				Name = "My Assessment Name",
    				Description = "This is some text that describes my assessment.",
    				CTID = myCTID,
    				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 identifier (CTID) for the owning organization
    			var myData = new AssessmentRequest()
    			{
    				Assessment = myAsmt,
                 	PublishForOrganizationIdentifier = organizationIdentifierFromAccountsSite
    			};
    			//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" ) );
                    //add API Key (for a publish request)
                    client.DefaultRequestHeaders.Add("Authorization", "ApiToken " + apiKey);
    				//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 PublishForOrganizationIdentifier { 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:

    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.
    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).
    Primary language of the credential, learning opportunity or assessment.
    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": "https://sandbox.credentialengineregistry.org/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": "https://sandbox.credentialengineregistry.org/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.
    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.
    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.
    Geographic or political region in which the credential is formally applicable or an organization has authority to act.
    Estimated cost of a credential, learning opportunity or assessment.
    Entity that describes financial assistance for which this credential, assessment, or learning opportunity qualifies.
    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.
    Credential that has its time or cost reduced by another credential, assessment or learning opportunity.
    Indicates a separately identifiable and independently useful component of the entity.
    This credential, assessment, or learning opportunity reduces the time or cost required to earn or complete the referenced credential, assessment, or learning opportunity.
    Indicates another entity of which this entity is a component.
    This credential, assessment, or learning opportunity provides preparation for the credential, assessment, or learning opportunity being referenced.
    It is recommended to earn or complete this credential, assessment, or learning opportunity before attempting to earn or complete the referenced credential, assessment, or learning opportunity.
    This credential, assessment, or learning opportunity must be earned or completed prior to attempting to earn or complete the referenced credential, assessment, or learning opportunity.
    Another credential, learning opportunity or assessment that provides preparation for this credential, learning opportunity or assessment.
    Recommended 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 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.
    Set constraints, prerequisites, entry conditions, or requirements that are shared across an organization, organizational subdivision, set of credentials, or category of entities and activities.
    Set of costs maintained at an organizational or sub-organizational level, which apply to this credential, 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": "https://sandbox.credentialengineregistry.org/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": [
    		"https://sandbox.credentialengineregistry.org/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 a PublishForOrganizationIdentifier property. Naturally, this is where you specify the CTID of the owning organization (from the accounts site). The learning opportunity data itself will go in a LearningOpportunity property:

    {
    	"LearningOpportunity": {
    		"Name": "My learning opportunity name"
    	},
    	"PublishForOrganizationIdentifier": "CTID_of_owning_Organization"
    }

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

    C#

    using System;
    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 the api key - acquired from organization account of the organization doing the publishing
                var apiKey = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; 
                //this is the CTID of the organization that owns the data being published
                var organizationIdentifierFromAccountsSite = "ce-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; 
    			//Assign a CTID for the entity being published 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 identifier (CTID) for the owning organization
    			var myData = new LearningOpportunityRequest()
    			{
    				LearningOpportunity = myLopp,
                 	PublishForOrganizationIdentifier = organizationIdentifierFromAccountsSite
    			};
    			//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" ) );
                    //add API Key (for a publish request)
                    client.DefaultRequestHeaders.Add("Authorization", "ApiToken " + apiKey);
    				//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 PublishForOrganizationIdentifier { 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.

    Publishing Your CostManifest

    Introduction

    The CostManifestProfile class represents a description of a specific Cost Manifest for an organization. Generally, you only need to describe Cost Manifests that are used for many credentials, assessments or learning opportunities. Use of cost manifests will remove or reduce the reference to costs in many entities. For more information, review the CTDL Guide.

    To format or publish an Cost Manifest, use the following endpoints:

    Format Data (only)

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

    Publish Data (automatically formats first)

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

    Required Properties

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

    Statement, characterization or account of the entity.
    Webpage or online document containing human-readable, in-depth information about costs.
    Organization maintaining the cost manifest.
    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).

    Publishing a Basic Record

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

    {
    	"Type": "ceterms:CostManifest",
    	"Description": "This is some text that describes my cost manifest.",
    	"CostDetails": "http://example.com?t=costDetails",
    	"CTID": "ce-08c3dc49-a122-1233-a06c-b5e054f62dcc",
    	"costManifestOf": "https://sandbox.credentialengineregistry.org/resources/ce-DAB89265-AC31-41D3-894F-CFE1415AEC84"
    }

    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": "https://sandbox.credentialengineregistry.org/resources/ce-08c3dc49-a122-1233-a06c-b5e054f62dcc",
    	"@type": "ceterms:CostManifest",
    	"ceterms:description": "This is some text that describes my cost manifest.",
    	"ceterms:costDetails": "http://example.com?t=costDetails",
    	"ceterms:ctid": "ce-08c3dc49-a122-1233-a06c-b5e054f62dcc",
    	"ceterms:costManifestOf": "https://sandbox.credentialengineregistry.org/resources/ce-DAB89265-AC31-41D3-894F-CFE1415AEC84"
    }

    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": "https://sandbox.credentialengineregistry.org/resources/ce-08c3dc49-a122-1233-a06c-b5e054f62dcc",
    		"@type": "ceterms:CostManifest",
    		"ceterms:description": "This is some text that describes my cost manifest.",
    		"ceterms:costDetails": "http://example.com?t=costDetails",
    		"ceterms:ctid": "ce-08c3dc49-a122-1233-a06c-b5e054f62dcc",
    		"ceterms:costManifestOf": "https://sandbox.credentialengineregistry.org/resources/ce-DAB89265-AC31-41D3-894F-CFE1415AEC84"
    	}
    }

    Recommended Properties

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

    Name or title of the entity.
    Estimated cost of a credential, learning opportunity or assessment.
    Date the validity or usefulness of the information in this resource begins.
    Date some event or activity ends.

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

    {
    	"Type": "ceterms:CostManifest",
    	"Name": "My Cost Manifest Name",
    	"Description": "This is some text that describes my cost manifest.",
    	"CostDetails": "http://example.com?t=costDetails",
    	"CTID": "ce-08c3dc49-a122-1233-a06c-b5e054f62dcc",
    	"costManifestOf": "https://sandbox.credentialengineregistry.org/resources/ce-DAB89265-AC31-41D3-894F-CFE1415AEC84",
    	"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"
    			]
    		}
    	]
    }

    When transformed, the data would look like this:

    {
    	"@context": "http://credreg.net/ctdl/schema/context/json",
    	"@id": "https://sandbox.credentialengineregistry.org/resources/ce-08c3dc49-a122-1233-a06c-b5e054f62dcc",
    	"@type": "ceterms:CostManifest",
    	"ceterms:name": "My Cost Manifest Name",
    	"ceterms:description": "This is some text that describes my cost manifest.",
    	"ceterms:costDetails": "http://example.com?t=costDetails",
    	"ceterms:ctid": "ce-08c3dc49-a122-1233-a06c-b5e054f62dcc",
    	"ceterms:costManifestOf": "https://sandbox.credentialengineregistry.org/resources/ce-DAB89265-AC31-41D3-894F-CFE1415AEC84",
    	"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"
    				}
    			]
    		}
    	]
    }

    Sample

    To publish the data, you will need to wrap it in an object that also contains a PublishForOrganizationIdentifier property. Naturally, this is where you specify the CTID of the owning organization (from the accounts site). The Cost Manifest data itself will go in an CostManifest property:

    {
    	"CostManifest": {
    		"Name": "My Cost Manifest name"
    	},
    	"PublishForOrganizationIdentifier": "CTID_of_owning_Organization"
    }

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

    C#

    
    using System;
    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 the api key - acquired from organization account of the organization doing the publishing
                var apiKey = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; 
                //this is the CTID of the organization that owns the data being published
                var organizationIdentifierFromAccountsSite = "ce-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; 
    			//Assign a CTID for the entity being published and keep track of it
    			var myCTID = "ce-" + Guid.NewGuid().ToString();
    			DataService.SaveCostManifestCTID( myCTID );
    			//A simple Cost Manifest object - see below for sample class definition
    			var myData = new SampleCostManifest() 
    			{
    				Name = "My Cost Manifest Name",
    				Description = "This is some text that describes my Cost Manifest.",
    				CTID = myCTID,
             		CostDetails = "http://www.credreg.net/CostManifest/1234"
    			};
    			//This holds the Cost Manifest and the identifier (CTID) for the owning organization
    			var myData = new CostManifestRequest()
    			{
    				CostManifest = myData,
                 	PublishForOrganizationIdentifier = organizationIdentifierFromAccountsSite
    			};
    			//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" ) );
                    //add API Key (for a publish request)
                    client.DefaultRequestHeaders.Add("Authorization", "ApiToken " + apiKey);
    				//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/CostManifest/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 CostManifestRequest
    		{
    			public SampleCostManifest CostManifest { get; set; }
    			public string PublishForOrganizationIdentifier { get; set; }
    		}
    		public class SampleCostManifest
    		{
    			public string Name { get; set; }
    			public string CostManifestOf { get; set; } //URI Of the organization that asserts this manifest
                public string Description { get; set; } //A short description of the resource being described.
    			public string CostDetails { get; set; } //Webpage or online document containing human-readable, in-depth information about costs.
                public string StartDate { get; set; }   //Date the validity or usefulness of the information in this profile begins.
    			public string EndDate { get; set; }     //Date the validity or usefulness of the information in this profile ends.
    			public List<CostProfile> EstimatedCosts { get; set; } //List of Estimated costs
    
    			//Other properties
    		}
    		public class CostProfile 
    		{
    			public string Name { get; set; }
    			public string Description { get; set; }
                public string CostDetails { get; set; }
                public string DirectCostType { get; set; }
    			//Othe properties
    		}
    	}		
    }
    

    Summary

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

    Publishing Your Condition Manifest

    Introduction

    The Condition Manifest Profile class represents a description of a specific Condition Manifest for an organization. Generally, you only need to describe Condition Manifests that are used for many credentials, assessments or learning opportunities. Use of condition manifests will remove or reduce the reference to conditions in many entities. For more information, review the CTDL Guide.

    To format or publish an Condition Manifest, use the following endpoints:

    Format Data (only)

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

    Publish Data (automatically formats first)

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

    Required Properties

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

    Statement, characterization or account of the entity.
    The webpage that describes this entity.
    Organization maintaining the condition manifest.
    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).

    Publishing a Basic Record

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

    {
    	"Type": "ceterms:ConditionManifest",
    	"Name": "A descriptive name for my condition profile.",
    	"Description": "This is some text that describes my condition manifest.",
    	"SubjectWebpage": "http://example.com?t=conditionDetails",
    	"CTID": "ce-08c3dc49-a122-1233-a06c-b5e054f62dcc",
    	"conditionManifestOf": "https://sandbox.credentialengineregistry.org/resources/ce-DAB89265-AC31-41D3-894F-CFE1415AEC84"
    }

    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": "https://sandbox.credentialengineregistry.org/resources/ce-08c3dc49-a122-1233-a06c-b5e054f62dcc",
    	"@type": "ceterms:ConditionManifest",
    	"ceterms:name": "A descriptive name for my condition profile.",
    	"ceterms:description": "This is some text that describes my condition manifest.",
    	"ceterms:subjectWebpage": "http://example.com?t=conditionDetails",
    	"ceterms:ctid": "ce-08c3dc49-a122-1233-a06c-b5e054f62dcc",
    	"ceterms:conditionManifestOf": "https://sandbox.credentialengineregistry.org/resources/ce-DAB89265-AC31-41D3-894F-CFE1415AEC84"
    }

    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": "https://sandbox.credentialengineregistry.org/resources/ce-08c3dc49-a122-1233-a06c-b5e054f62dcc",
    		"@type": "ceterms:ConditionManifest",
    		"ceterms:name": "A descriptive name for my condition profile.",
    		"ceterms:description": "This is some text that describes my condition manifest.",
    		"ceterms:subjectWebpage": "http://example.com?t=conditionDetails",
    		"ceterms:ctid": "ce-08c3dc49-a122-1233-a06c-b5e054f62dcc",
    		"ceterms:conditionManifestOf": "https://sandbox.credentialengineregistry.org/resources/ce-DAB89265-AC31-41D3-894F-CFE1415AEC84"
    	}
    }

    Recommended Properties

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

    Recommended credential, learning opportunity or assessment.
    Name or title of the entity.
    Requirement or set of requirements for this credential, learning opportunity, or assessment.
    Prerequisites for entry into a credentialing program, a learning opportunity or an assessment including transcripts, records of previous experience, and lower-level learning opportunities.
    Credentials that must be pursued concurrently.

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

    {
    	"Type": "ceterms:ConditionManifest",
    	"Name": "A descriptive name for my condition profile.",
    	"Description": "This is some text that describes my condition manifest.",
    	"ConditionDetails": "http://example.com?t=conditionDetails",
    	"CTID": "ce-08c3dc49-a122-1233-a06c-b5e054f62dcc",
    	"conditionManifestOf": "https://sandbox.credentialengineregistry.org/resources/ce-DAB89265-AC31-41D3-894F-CFE1415AEC84",
    	"Requires": [
    		{
    			"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"
    			]
    		}
    	],
    	"EntryCondition": [
    		{
    			"Name": "Prerequisites for entry into a credentialing program, a learning opportunity or an assessment.",
    			"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"
    			]
    		}
    	]
    }

    When transformed, the data would look like this:

    {
    	"@context": "http://credreg.net/ctdl/schema/context/json",
    	"@id": "https://sandbox.credentialengineregistry.org/resources/ce-08c3dc49-a122-1233-a06c-b5e054f62dcc",
    	"@type": "ceterms:ConditionManifest",
    	"ceterms:name": "A descriptive name for my condition profile.",
    	"ceterms:description": "This is some text that describes my condition manifest.",
    	"ConditionDetails": "http://example.com?t=conditionDetails",
    	"ceterms:ctid": "ce-08c3dc49-a122-1233-a06c-b5e054f62dcc",
    	"ceterms:conditionManifestOf": "https://sandbox.credentialengineregistry.org/resources/ce-DAB89265-AC31-41D3-894F-CFE1415AEC84",
    	"ceterms:requires": [
    		{
    			"@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": [
    				"https://sandbox.credentialengineregistry.org/resources/ce-413704ba-f9fd-4f17-9815-370b42dda7bb"
    			],
    			"ceterms:targetAssessment": [
    				"https://sandbox.credentialengineregistry.org/resources/ce-9db20b92-0787-43b2-83e1-b967d73d5df9",
    				"https://sandbox.credentialengineregistry.org/resources/ce-7d838a41-88e1-4011-885b-7318ef31c3dd"
    			],
    			"ceterms:targetCompetency": [
    				"https://sandbox.credentialengineregistry.org/resources/f8a0eb87-791b-4749-918b-258610effa49",
    				"https://sandbox.credentialengineregistry.org/resources/f62ffde2-954d-42f1-bc1e-8f7904f0fbfe"
    			]
    		}
    	],
    	"ceterms:entryCondition": [
    		{
    			"@type": "ceterms:ConditionProfile",
    			"ceterms:name": "Prerequisites for entry into a credentialing program, a learning opportunity or an assessment.",
    			"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"
    			]
    		}
    	]
    }

    Sample

    To publish the data, you will need to wrap it in an object that also contains a PublishForOrganizationIdentifier property. Naturally, this is where you specify the CTID of the owning organization (from the accounts site). The Condition Manifest data itself will go in an Condition Manifest property:

    {
    	"ConditionManifest": {
    		"Name": "My Condition Manifest name"
    	},
    	"PublishForOrganizationIdentifier": "CTID_of_owning_Organization"
    }

    Below is some example code to publish a simple Condition Manifest object:

    C#

    
    using System;
    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 the api key - acquired from organization account of the organization doing the publishing
                var apiKey = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; 
                //this is the CTID of the organization that owns the data being published
                var organizationIdentifierFromAccountsSite = "ce-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; 
    			//Assign a CTID for the entity being published and keep track of it
    			var myCTID = "ce-" + Guid.NewGuid().ToString();
    			DataService.SaveConditionManifestCTID( myCTID );
    			//A simple ConditionManifest object - see below for sample class definition
    			var myData = new SampleConditionManifest() 
    			{
    				Name = "My Condition Manifest Name",
    				Description = "This is some text that describes my Condition Manifest.",
    				CTID = myCTID,
    				SubjectWebpage = "http://www.credreg.net/ConditionManifest/1234",
    				
    				Requires = new List<ConditionProfile>(),
    				{
    					new ConditionProfile()
    					{
    						Name = "My Requirements",
    						Condition = new List<string>() { "Condition One", "Condition Two", "Condition Three" }
    					}
    				}
    			};
    			//This holds the Condition Manifest and the identifier (CTID) for the owning organization
    			var myData = new ConditionManifestRequest()
    			{
    				ConditionManifest = myData,
                 	PublishForOrganizationIdentifier = organizationIdentifierFromAccountsSite
    			};
    			//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" ) );
                    //add API Key (for a publish request)
                    client.DefaultRequestHeaders.Add("Authorization", "ApiToken " + apiKey);
    				//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/ConditionManifest/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 ConditionManifestRequest
    		{
    			public SampleConditionManifest ConditionManifest { get; set; }
    			public string PublishForOrganizationIdentifier { get; set; }
    		}
    		public class SampleConditionManifest
    		{
    			public string Name { get; set; }
    			public string Description { get; set; }
    			public string SubjectWebpage { get; set; }
    			public List<string> Keyword { get; set; }
    			public List<string> ConditionManifestMethodType { get; set; }
    			public List<string> ConditionManifestUseType { 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 Condition Manifests.

    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:

    Amount and nature of required work, experiential learning or other relevant experience.
    Years of relevant experience.
    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.
    The webpage that describes this entity.
    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".
    The type of credential seeker for whom the entity 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".
    Date the validity or usefulness of the information in this resource begins.
    Date some event or activity ends.

    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.

    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.

    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.

    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.

    Scoring Method

    Types of applicable scoring.

    Scored based on a comparison to defined criteria and levels of performance.
    Scored based on a comparison to a distribution of performance in a reference population.

    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 only face-to-face.
    Delivery is only via the Internet.

    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.

    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.