Registry Assistant API Handbook

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.

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:

Overview Presentation

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

  • The Reference classes, EntityReference and OrganizationReference, were created to enable three scenarios:
    • Either the Uri to an Organization (or credential, etc.) in the registry, as @id,
    • Just the CTID of the organization.
      The API will insert the correct domain name and path, based on the target server, to enable independence from the publishing environment,
    • Or a reference to an organization that has not been published to the registry.
    • EntityReference - use for references to credentials, assessments, or learning opportunities.

      Example: Credential Property: 
      //HasPart - for example a list of included credentials List<EntityReference> HasPart
      public class EntityReference { // Id is a resovable URI // If the entity exists in the registry, provide the URI. // If not sure of the exact URI, especially if just publishing the entity, then provide the CTID and the API will format the URI. public string Id { get; set; } // Optionally, a CTID can be entered instead of an Id. // Only enter Id or CTID, but not both public string CTID { get; set; } //if there is no available Id/CTID, enter the following, where Type, Name, and SubjectWebpage would be required // the type of the entity must be provided if the Id was not provided. // ceterms:AssessmentProfile // ceterms:LearningOpportunityProfile // ceterms:ConditionManifest // ceterms:CostManifest // or the many credential subclasses!! public virtual string Type { get; set; } // Name of the entity (required) public string Name { get; set; } // Subject webpage of the entity (required) public string SubjectWebpage { get; set; } /// Description of the entity (optional) public string Description { get; set; } }
    • Example: OrganizationReference. Has the same properties as EntityReference, plus the additional optional property of SocialMedia
      Credential Property: List<OrganizationReference> OwnedBy 
      public class OrganizationReference { // Id is a resovable URI // If the entity exists in the registry, provide the URI. // If not sure of the exact URI, especially if just publishing the entity, then provide the CTID and the API will format the URI. public string Id { get; set; } // Optionally, a CTID can be entered instead of an Id. // Only enter Id or CTID, but not both public string CTID { get; set; } //if there is no available Id/CTID, enter the following, where Type, Name, and SubjectWebpage would be required // the type of the entity must be provided if the Id was not provided. //type (required): CredentialOrganization or QACredentialOrganization public virtual string Type { get; set; } // Name of the entity (required) public string Name { get; set; } // Subject webpage of the entity (required) public string SubjectWebpage { get; set; } // Description of the entity (optional) public string Description { get; set; } // Social Media URL links (optional) // For example, Facebook, LinkedIn public List SocialMedia { get; set; } }

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:

  • Use of single multiplicity for Jurisdiction.MainJurisdiction
  • FrameworkItem for known Occupations, Industry, and Classification Programs frameworks

Duration Items

  • DurationItem - used with DurationProfile class for the property EstimatedDuration. Rather than providing data in the ISO 8601 duration format (ex. for 10 hours, the format would be PT10H
    The DurationItem has properties for Years, Months, Weeks, Days, Hours, and Minutes.
    • Example: DurationProfile
      Credential Property: List<DurationProfile> EstimatedDuration 
      public class DurationProfile { // Description of this duration profile - optional public string Description { get; set; } public DurationItem MinimumDuration { get; set; } public DurationItem MaximumDuration { get; set; } public DurationItem ExactDuration { get; set; } } // Enter either the Duration_ISO8601 value, or the necessary combination of years, months, weeks, etc public class DurationItem { public string Duration_ISO8601 { get; set; } public int Years { get; set; } public int Months { get; set; } public int Weeks { get; set; } public int Days { get; set; } public int Hours { get; set; } public int Minutes { get; set; } }
  • Sample assignment
    
    					var profile = new DurationProfile();
    					profile.Description = "A full time student will typically complete this certificate in 15 hours.";
    					profile.ExactDuration = new DurationItem
    					{
    						Hours = 15
    					};
    				
  • Only the properties that will be used need to be defined in the local definition of the DurationItem class. If your organiztion only offers certifications with durations of hours or days, then the local copy of the class only needs to include those properties.
    
    				public class DurationItem
    				{
    					public int Days { get; set; }
    					public int Hours { get; set; }
    				}
    				

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:

  • Formatting your data in CTDL
  • Publishing your data in the Credential Registry

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/raSandbox/{CTDL object type}/format

Publish Data (automatically formats first)

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

Example: Format Credential

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

Example: Publish Organization

https://credentialengine.org/raSandbox/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:

  • Navigate to the Credential Engine Accounts site.
  • Create an account. After registering, you will receive an email to confirm your account.
  • After confirming your account, you can add your organization.
  • Complete the required information for the organization, along with publishing roles and methods, and submit the organization for approval.

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

  • An account will be created in the Credential Registry for the organization.
  • A secret publishing key will be generated and stored with the organization in the Accounts site.
  • An API key will be generated for use in publishing.
    • This key is a proxy to the actual secret publishing key, so that the secret key is not publically exposed.
    • If there is ever a concern that the public API key has been compromised, the current API key can be deactivated, and a new API key generated.
    • As part of the publishing process, the Registry Assistant will confirm that the combination of an API key and the CTID of the organization that owns the current data is valid.
    • Invalid combinations will be rejected.
    • The organization CTID and API key will be available on the organization dashboard on the accounts site, as shown below (click the Show API Key button to see the details):
      The organization CTID and API key can be found on the organization dashboard.
    • An API Key is required for a publish request, but not for a format request. The key is to be added in the authentication header of a request.
      Header Name: Authorization
      Header Value: ApiToken xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
  • For organizations that will publish on behalf of one or more other organizations, a separate API key will be required for each pairing.

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:

  • Determine the source of the target data from your environment
  • Develop process to retrieve the data
  • Get/View the latest input classes from Github: View/Download the C# API Input Classes here
  • These reference classes are in a C# syntax but can be easily adapted for alternate evironments
  • Map your to the latter input classes
  • Call the API

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/raSandbox/organization/format

Publish Data (automatically formats first)

https://credentialengine.org/raSandbox/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/graph/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/graph/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.
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.

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/graph/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/graph/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/raSandbox/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 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> 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; }

				}
			}		
		}
		

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/raSandbox/credential/format

Publish Data (automatically formats first)

https://credentialengine.org/raSandbox/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).
The primary language or languages of the entity, even if it makes use of other languages; e.g., a course offered in English to teach Spanish would have an inLanguage of English, while a credential in Quebec could have an inLanguage of both French and English.
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.
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/graph/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/graph/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.
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.

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/graph/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/graph/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/graph/ce-413704ba-f9fd-4f17-9815-370b42dda7bb"
			],
			"ceterms:targetAssessment": [
				"https://sandbox.credentialengineregistry.org/graph/ce-9db20b92-0787-43b2-83e1-b967d73d5df9",
				"https://sandbox.credentialengineregistry.org/graph/ce-7d838a41-88e1-4011-885b-7318ef31c3dd"
			],
			"ceterms:targetCompetency": [
				"https://sandbox.credentialengineregistry.org/graph/f8a0eb87-791b-4749-918b-258610effa49",
				"https://sandbox.credentialengineregistry.org/graph/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/raSandbox/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/raSandbox/assessment/format

Publish Data (automatically formats first)

https://credentialengine.org/raSandbox/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).
The primary language or languages of the entity, even if it makes use of other languages; e.g., a course offered in English to teach Spanish would have an inLanguage of English, while a credential in Quebec could have an inLanguage of both French and English.
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/graph/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/graph/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.
The primary language or languages of the entity, even if it makes use of other languages; e.g., a course offered in English to teach Spanish would have an inLanguage of English, while a credential in Quebec could have an inLanguage of both French and English.
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.
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.
Competency evaluated through the assessment.
Type of method used to conduct an assessment; select from an existing enumeration of such types.
Values must be URIs of terms in the Assessment Method Vocabulary.
Type of means by which a learning opportunity or assessment is delivered to credential seekers and by which they interact; select from an existing enumeration of such types.
Values must be URIs of terms in the Delivery Type Vocabulary.
Detailed description of the delivery type of an assessment or learning opportunity.

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

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

When transformed, the data would look like this:

{
	"@context": "http://credreg.net/ctdl/schema/context/json",
	"@id": "https://sandbox.credentialengineregistry.org/graph/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/graph/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/graph/f8a0eb87-791b-4749-918b-258610effa49",
		"https://sandbox.credentialengineregistry.org/graph/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/raSandbox/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/raSandbox/learningopportunity/format

Publish Data (automatically formats first)

https://credentialengine.org/raSandbox/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).
The primary language or languages of the entity, even if it makes use of other languages; e.g., a course offered in English to teach Spanish would have an inLanguage of English, while a credential in Quebec could have an inLanguage of both French and English.
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/graph/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/graph/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.
The primary language or languages of the entity, even if it makes use of other languages; e.g., a course offered in English to teach Spanish would have an inLanguage of English, while a credential in Quebec could have an inLanguage of both French and English.
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.
Competency that the learning opportunity is intended to teach.
Types of methods used to conduct the learning opportunity; select from an existing enumeration of such types.
Values must be URIs of terms in the Learning Method Vocabulary.
Type of means by which a learning opportunity or assessment is delivered to credential seekers and by which they interact; select from an existing enumeration of such types.
Values must be URIs of terms in the Delivery Type Vocabulary.
Detailed description of the delivery type of an assessment or learning opportunity.

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

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

When transformed, the data would look like this:

{
	"@context": "http://credreg.net/ctdl/schema/context/json",
	"@id": "https://sandbox.credentialengineregistry.org/graph/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/graph/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/raSandbox/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/raSandbox/CostManifest/format

Publish Data (automatically formats first)

https://credentialengine.org/raSandbox/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/graph/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/graph/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/graph/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/graph/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/graph/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/graph/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/graph/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/graph/ce-DAB89265-AC31-41D3-894F-CFE1415AEC84",
	"ceterms:estimatedCost": [
		{
			"Type": "ceterms:CostProfile",
			"Id": null,
			"Properties": {
				"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"
			},
			"MyConstraints": {
				"RequiredProperties": [
					{
						"ApiProperty": "Description",
						"TermUri": "ceterms:description",
						"Description": "Statement, characterization or account of the entity.",
						"Comment": null,
						"UsageNote": null,
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": false
					},
					{
						"ApiProperty": "CostDetails",
						"TermUri": "ceterms:costDetails",
						"Description": "Webpage or online document containing human-readable, in-depth information about costs.",
						"Comment": null,
						"UsageNote": null,
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": false
					}
				],
				"RequiredAnyProperties": [],
				"RecommendedProperties": [
					{
						"ApiProperty": "PaymentPattern",
						"TermUri": "ceterms:paymentPattern",
						"Description": "Applicable pattern for payments such as \"per sementer\" and \"every three months\".",
						"Comment": null,
						"UsageNote": null,
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": false
					},
					{
						"ApiProperty": "AudienceType",
						"TermUri": "ceterms:audienceType",
						"Description": "The type of credential seeker for whom the entity is applicable; select from an existing enumeration of such types.",
						"Comment": null,
						"UsageNote": "Best practice for developing credential descriptions for the Credential Engine Registry is to use the ceterms:Audience vocabulary.",
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": true
					},
					{
						"ApiProperty": "ResidencyType",
						"TermUri": "ceterms:residencyType",
						"Description": "Type of legal residency status of a person; select from an existing enumeration of such types.",
						"Comment": "Residency defines the duration of stay required by national, state, provincial or local laws that entitles a person to the legal protection and benefits provided to the applicable type.",
						"UsageNote": "Best practice for U.S. credentials and for submission to the Credential Engine Registry, is to use concepts from the ceterms:Residency vocabulary.",
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": true
					},
					{
						"ApiProperty": "Price",
						"TermUri": "ceterms:price",
						"Description": "Offer price of a credential, learning resource, assessment, related activity or resource.",
						"Comment": null,
						"UsageNote": null,
						"ManualGuidance": "",
						"ValueType": "int",
						"IsMultiValue": false
					},
					{
						"ApiProperty": "DirectCostType",
						"TermUri": "ceterms:directCostType",
						"Description": "Types of direct costs associated with earning or completing a credential, assessment or learning opportunity; select from an existing enumeration of such types.",
						"Comment": null,
						"UsageNote": "Best practice for developing credential descriptions for the Credential Engine Registry is to use the ceterms:CostType vocabulary.",
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": false
					},
					{
						"ApiProperty": "Currency",
						"TermUri": "ceterms:currency",
						"Description": "Currency in which the monetary amount is expressed in 3-letter ISO 4217 format such as \"USD\".",
						"Comment": null,
						"UsageNote": null,
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": false
					}
				]
			}
		},
		{
			"Type": "ceterms:CostProfile",
			"Id": null,
			"Properties": {
				"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"
				]
			},
			"MyConstraints": {
				"RequiredProperties": [
					{
						"ApiProperty": "Description",
						"TermUri": "ceterms:description",
						"Description": "Statement, characterization or account of the entity.",
						"Comment": null,
						"UsageNote": null,
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": false
					},
					{
						"ApiProperty": "CostDetails",
						"TermUri": "ceterms:costDetails",
						"Description": "Webpage or online document containing human-readable, in-depth information about costs.",
						"Comment": null,
						"UsageNote": null,
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": false
					}
				],
				"RequiredAnyProperties": [],
				"RecommendedProperties": [
					{
						"ApiProperty": "PaymentPattern",
						"TermUri": "ceterms:paymentPattern",
						"Description": "Applicable pattern for payments such as \"per sementer\" and \"every three months\".",
						"Comment": null,
						"UsageNote": null,
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": false
					},
					{
						"ApiProperty": "AudienceType",
						"TermUri": "ceterms:audienceType",
						"Description": "The type of credential seeker for whom the entity is applicable; select from an existing enumeration of such types.",
						"Comment": null,
						"UsageNote": "Best practice for developing credential descriptions for the Credential Engine Registry is to use the ceterms:Audience vocabulary.",
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": true
					},
					{
						"ApiProperty": "ResidencyType",
						"TermUri": "ceterms:residencyType",
						"Description": "Type of legal residency status of a person; select from an existing enumeration of such types.",
						"Comment": "Residency defines the duration of stay required by national, state, provincial or local laws that entitles a person to the legal protection and benefits provided to the applicable type.",
						"UsageNote": "Best practice for U.S. credentials and for submission to the Credential Engine Registry, is to use concepts from the ceterms:Residency vocabulary.",
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": true
					},
					{
						"ApiProperty": "Price",
						"TermUri": "ceterms:price",
						"Description": "Offer price of a credential, learning resource, assessment, related activity or resource.",
						"Comment": null,
						"UsageNote": null,
						"ManualGuidance": "",
						"ValueType": "int",
						"IsMultiValue": false
					},
					{
						"ApiProperty": "DirectCostType",
						"TermUri": "ceterms:directCostType",
						"Description": "Types of direct costs associated with earning or completing a credential, assessment or learning opportunity; select from an existing enumeration of such types.",
						"Comment": null,
						"UsageNote": "Best practice for developing credential descriptions for the Credential Engine Registry is to use the ceterms:CostType vocabulary.",
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": false
					},
					{
						"ApiProperty": "Currency",
						"TermUri": "ceterms:currency",
						"Description": "Currency in which the monetary amount is expressed in 3-letter ISO 4217 format such as \"USD\".",
						"Comment": null,
						"UsageNote": null,
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": false
					}
				]
			}
		}
	]
}

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/raSandbox/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/raSandbox/ConditionManifest/format

Publish Data (automatically formats first)

https://credentialengine.org/raSandbox/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/graph/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/graph/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/graph/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/graph/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/graph/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/graph/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/graph/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/graph/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/graph/ce-413704ba-f9fd-4f17-9815-370b42dda7bb"
			],
			"ceterms:targetAssessment": [
				"https://sandbox.credentialengineregistry.org/graph/ce-9db20b92-0787-43b2-83e1-b967d73d5df9",
				"https://sandbox.credentialengineregistry.org/graph/ce-7d838a41-88e1-4011-885b-7318ef31c3dd"
			],
			"ceterms:targetCompetency": [
				"https://sandbox.credentialengineregistry.org/graph/f8a0eb87-791b-4749-918b-258610effa49",
				"https://sandbox.credentialengineregistry.org/graph/f62ffde2-954d-42f1-bc1e-8f7904f0fbfe"
			]
		}
	],
	"ceterms:entryCondition": [
		{
			"Type": "ceterms:ConditionProfile",
			"Id": null,
			"Properties": {
				"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"
				]
			},
			"MyConstraints": {
				"RequiredProperties": [
					{
						"ApiProperty": "Description",
						"TermUri": "ceterms:description",
						"Description": "Statement, characterization or account of the entity.",
						"Comment": null,
						"UsageNote": null,
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": false
					}
				],
				"RequiredAnyProperties": [],
				"RecommendedProperties": [
					{
						"ApiProperty": "Name",
						"TermUri": "ceterms:name",
						"Description": "Name or title of the entity.",
						"Comment": null,
						"UsageNote": null,
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": false
					},
					{
						"ApiProperty": "SubmissionOf",
						"TermUri": "ceterms:submissionOf",
						"Description": "Artifact to be submitted such as a transcript, portfolio, or an affidavit.",
						"Comment": null,
						"UsageNote": null,
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": true
					},
					{
						"ApiProperty": "Condition",
						"TermUri": "ceterms:condition",
						"Description": "Single constraint, prerequisite, entry condition, requirement, or cost.",
						"Comment": null,
						"UsageNote": null,
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": true
					},
					{
						"ApiProperty": "SubjectWebpage",
						"TermUri": "ceterms:subjectWebpage",
						"Description": "The webpage that describes this entity.",
						"Comment": "The web page being referenced describes the entity. The value of subjectWebpage is an authoritative location for information about the subject but should not assumed to be a persistent identifier of the subject.",
						"UsageNote": null,
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": false
					},
					{
						"ApiProperty": "TargetCredential",
						"TermUri": "ceterms:targetCredential",
						"Description": "Credential that is a focus or target of the condition, process or verification service.",
						"Comment": null,
						"UsageNote": null,
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": true
					},
					{
						"ApiProperty": "TargetAssessment",
						"TermUri": "ceterms:targetAssessment",
						"Description": "Assessment that provides direct, indirect, formative or summative evaluation or estimation of the nature, ability, or quality for an entity.",
						"Comment": null,
						"UsageNote": null,
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": true
					},
					{
						"ApiProperty": "TargetLearningOpportunity",
						"TermUri": "ceterms:targetLearningOpportunity",
						"Description": "Learning opportunity that is the focus of a condition, process or another learning opportunity.",
						"Comment": null,
						"UsageNote": null,
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": true
					},
					{
						"ApiProperty": "TargetCompetency",
						"TermUri": "ceterms:targetCompetency",
						"Description": "A competency relevant to the condition being described.",
						"Comment": null,
						"UsageNote": null,
						"ManualGuidance": "",
						"ValueType": "string",
						"IsMultiValue": true
					}
				]
			}
		}
	]
}

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/raSandbox/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:

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".

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.
Organized group of entities in the public, private, government sectors that collaborates to achieve a common set of goals.
An organization that organizes multiple stakeholders around a common goal.
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.

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.

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.

Audience

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

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

Residency

Types of residency.

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

Cost Type

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

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