Table of Contents

Top

    Registry Assistant API Handbook

    Overview

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

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

    This guide assumes a working knowledge of:

    Additionally, it is recommended to be familiar with:

    Services

    The Registry Assistant API provides two main services:

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

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

    Format Data (only)

    https://credentialfinder.org/ra/{CTDL object type}/format

    Publish Data (automatically formats first)

    https://credentialfinder.org/ra/{CTDL object type}/publish

    Example: Format Credential

    https://credentialfinder.org/ra/credential/format

    Example: Publish Organization

    https://credentialfinder.org/ra/organization/publish

    Getting your API Key

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

    Getting Started

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

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

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

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

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

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

    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://credentialfinder.org/ra/organization/format

    Publish Data (automatically formats first)

    https://credentialfinder.org/ra/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
    The name of your organization.
    Description
    A brief description of the organization.
    SubjectWebpage
    The official URL for your organization. This is usually the URL for your organization's website.
    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.

    Publishing a Basic Record

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

    {
    	"Name": "My Organization Name",
    	"Description": "This is some text that describes my organization.",
    	"SubjectWebpage": "http://www.credreg.net",
    	"Type": "ceterms:CredentialOrganization"	
    }

    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": {
    		"ceterms": "http://credreg.net/ctdl/terms/"
    		"@language", "en"
    	},
    	"@id": "http://lr-staging.learningtapestry.com/resources/ce-28935e07-76dc-4562-8c43-3ece101686be",
    	"@type": "ceterms:CredentialOrganization",
    	"ceterms:name": "My Organization Name",
    	"ceterms:description": "This is some text that describes my organization.",
    	"ceterms:subjectWebpage": "http://www.credreg.net"
    }

    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": {
    			"ceterms": "http://credreg.net/ctdl/terms/"
    			"@language", "en"
    		},
    		"@id": "http://lr-staging.learningtapestry.com/resources/ce-28935e07-76dc-4562-8c43-3ece101686be",
    		"@type": "ceterms:CredentialOrganization",
    		"ceterms:name": "My Organization Name",
    		"ceterms:description": "This is some text that describes my organization.",
    		"ceterms:subjectWebpage": "http://www.credreg.net"
    	}
    }

    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:

    Image
    The URL of an image file for your organization's logo that can be loaded on a third-party website. This will help users associate your data with your organization.
    Keyword
    A list of keywords to help find your organization in searches. Each keyword may be a word or a phrase.
    SocialMedia
    A list of URLs to social media accounts that directly represent your organization.
    Owns
    A list of CTIDs of credentials, assessments, and/or learning opportunities owned by your organization.
    Offers
    A list of CTIDs of credentials, assessments, and/or learning opportunities offered by your organization.
    Department
    A list of CTIDs of organizations that are departments of your organization.
    AgentSectorType
    A list of strings indicating the economic sector(s) in which your organization operates. Values must come from the Agent Sector Vocabulary.
    ServiceType
    A list of strings indicating services offered by your organization. Values must come from the Agent Service Type Vocabulary.

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

    {
    	"Name": "My Organization Name",
    	"Description": "This is some text that describes my organization.",
    	"SubjectWebpage": "http://www.credreg.net",
    	"Type": "ceterms:CredentialOrganization",
    	"Image": "http://www.credreg.net/Images/Common/logo_widev2.png",
    	"Keyword": ["Credentials", "Technical Information", "Credential Registry"],
    	"SocialMedia": ["https://twitter.com/credengine", "https://www.facebook.com/credengine", "https://www.youtube.com/channel/UCyTpUktFYQNlLrLR4O_AcQA"],
    	"Owns": ["ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71", "ce-aab5a331-549b-416a-aa0e-0db87175aa0a"],
    	"Offers": ["ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71", "ce-aab5a331-549b-416a-aa0e-0db87175aa0a"],
    	"Department": ["ce-28935e07-76dc-4562-8c43-3ece101686be"],
    	"AgentSectorType": ["agentSector:PrivateNonProfit"],
    	"ServiceType": ["serviceType:ApproveService", "serviceType:RecognizeService"]
    }

    When transformed, the data would look like this:

    {
    	"@context": {
    		"ceterms": "http://credreg.net/ctdl/terms/"
    		"agentSector": "http://credreg.net/ctdl/vocabs/agentSector",
    		"serviceType": "http://credreg.net/ctdl/vocabs/serviceType",
    		"@language", "en"
    	},
    	"@id": "http://lr-staging.learningtapestry.com/resources/ce-28935e07-76dc-4562-8c43-3ece101686be",
    	"@type": "ceterms:CredentialOrganization",
    	"ceterms:name": "My Organization Name",
    	"ceterms:description": "This is some text that describes my organization.",
    	"ceterms:subjectWebpage": "http://www.credreg.net",
    	"ceterms:image": { "@id": "http://www.credreg.net/Images/Common/logo_widev2.png" },
    	"ceterms:keyword": [ "Credentials", "Technical Information", "Credential Registry" ],
    	"ceterms:socialMedia": [ "https://twitter.com/credengine", "https://www.facebook.com/credengine", "https://www.youtube.com/channel/UCyTpUktFYQNlLrLR4O_AcQA" ],
    	"ceterms:owns": [ { "@id": "http://lr-staging.learningtapestry.com/resources/ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71" }, { "@id": "http://lr-staging.learningtapestry.com/resources/ce-aab5a331-549b-416a-aa0e-0db87175aa0a" } ],
    	"ceterms:offers": [ { "@id": "http://lr-staging.learningtapestry.com/resources/ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71" }, { "@id": "http://lr-staging.learningtapestry.com/resources/ce-aab5a331-549b-416a-aa0e-0db87175aa0a" } ],
    	"ceterms:department": [ { "@id": "http://lr-staging.learningtapestry.com/resources/ce-28935e07-76dc-4562-8c43-3ece101686be" } ],
    	"ceterms:agentSectorType": [ 
    		{ 
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNode": { "@id": "agentSector:PrivateNonProfit" },
    			"ceterms:targetNodeName": "Private Not-For-Profit"
    		} 
    	],
    	"ceterms:serviceType": [
    		{ 
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNode": { "@id": "serviceType:ApproveService" },
    			"ceterms:targetNodeName": "Approve Service"
    		},
    		{ 
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNode": { "@id": "serviceType:RecognizeService" },
    			"ceterms:targetNodeName": "Recognize Service"
    		} 
    	]
    }

    Sample

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

    {
    	"Organization": {
    		"Name": "My organization name"
    	},
    	"APIKey": "Your_API_Key_here"
    }

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

    C#

    using System.Collections.Generic;
    using System.Text;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using Newtonsoft.Json;
    
    namespace Publish_Test {
    	public class Publisher 
    	{
    		public string PublishSimpleRecord() 
    		{
    			//Holds the result of the publish action
    			var result = "";
    
    			//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.",
    				SubjectWebpage = "http://www.credreg.net",
    				Type = "ceterms:CredentialOrganization",
    				Keyword = new List<string>() { "Credentials", "Technical Information", "Credential Registry" },
    				AgentSectorType = new List<string>() { "agentSector:PrivateNonProfit" }
    			};
    
    			//This holds the organization and the API key
    			var myData = new OrganizationRequest()
    			{
    				Organization = myOrg,
    				APIKey = "Your_API_Key_Here"
    			};
    
    			//Serialize the organization request object
    			var json = JsonConvert.SerializeObject( myData );
    
    			//Use HttpClient to perform the publish
    			using ( var client = new HttpClient() )
    			{
    				//Accept JSON
    				client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue( "application/json" ) );
    
    				//Format the json as content
    				var content = new StringContent( json, Encoding.UTF8, "application/json" );
    
    				//The endpoint to publish to
    				var publishEndpoint = "https://credentialfinder.org/ra/organization/publish/";
    
    				//Perform the actual publish action and store the result
    				result = client.PostAsync( publishEndpoint, content ).Result.Content.ReadAsStringAsync().Result;
    			}
    
    			//Return the result
    			return result;
    		}
    
    		public class OrganizationRequest
    		{
    			public SampleOrganization Organization { get; set; }
    			public string APIKey { get; set; }
    		}
    
    		public class SampleOrganization
    		{
    			public string Name { get; set; }
    			public string Description { get; set; }
    			public string SubjectWebpage { get; set; }
    			public string Type { get; set; }
    			public string Image { get; set; }
    			public List<string> Keyword { get; set; }
    			public List<string> SocialMedia { get; set; }
    			public List<string> Owns { get; set; }
    			public List<string> Offers { get; set; }
    			public List<string> Department { get; set; }
    			public List<string> AgentSectorType { get; set; }
    			public List<string> ServiceType { 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://credentialfinder.org/ra/credential/format

    Publish Data (automatically formats first)

    https://credentialfinder.org/ra/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
    The name of your credential.
    Description
    A brief description of your credential.
    SubjectWebpage
    The official URL for your credential. This is usually the URL for the official page about the credential on your organization's website.
    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.

    Publishing a Basic Record

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

    {
    	"Name": "My Credential Name",
    	"Description": "This is some text that describes my credential.",
    	"SubjectWebpage": "http://www.credreg.net/credential/1234",
    	"Type": "ceterms:Certificate"
    }

    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": {
    		"ceterms": "http://credreg.net/ctdl/terms/"
    		"@language", "en"
    	},
    	"@id": "http://lr-staging.learningtapestry.com/resources/ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71",
    	"@type": "ceterms:Certificate",
    	"ceterms:name": "My Credential Name",
    	"ceterms:description": "This is some text that describes my credential.",
    	"ceterms:subjectWebpage": { "@id": "http://www.credreg.net/credential/1234" }
    }

    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": {
    			"ceterms": "http://credreg.net/ctdl/terms/"
    			"@language", "en"
    		},
    		"@id": "http://lr-staging.learningtapestry.com/resources/ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71",
    		"@type": "ceterms:Certificate",
    		"ceterms:name": "My Credential Name",
    		"ceterms:description": "This is some text that describes my credential.",
    		"ceterms:subjectWebpage": { "@id": "http://www.credreg.net/credential/1234" }
    	}
    }

    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:

    Keyword
    A list of keywords to help find your credential in searches. Each keyword may be a word or a phrase.
    DateEffective
    A string in YYYY-MM-DD format (derived from ISO 8601) indicating the date on which this credential becomes available and valid.
    AudienceLevelType
    The approximate education level that this credential is associated with. Value must be a list of terms from the Audience Level Type vocabulary.
    IndustryType
    A list of industry categories, usually expressed as NAICS codes, in which this credential is most useful. Other plain-text values are acceptable, but you should use the NAICS codes whenever possible to ensure other systems can understand the data you publish.
    OccupationType
    A list of occupation categories, usually expressed as SOC codes, for which this credential would best prepare someone to obtain. Other plain-text values are acceptable, but you should use the SOC codes whenever possible to ensure other systems can understand the data you publish.
    EstimatedDuration
    The approximate overall time it will take to earn this credential. Value must be a list of Duration Profiles.
    EstimatedCosts
    The approximate overall costs for earning this credential. Value must be a list of Cost Profiles.
    Requires
    The conditions someone must meet to earn this credential. Value must be a list of Condition Profiles.
    Recommends
    Things that someone can do to significantly help them prepare for earning the credential, but which are not required. Value must be a list of Condition Profiles.

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

    {
    	"Name": "My Credential Name",
    	"Description": "This is some text that describes my credential.",
    	"SubjectWebpage": "http://www.credreg.net/credential/1234",
    	"Type": "ceterms:Certificate"
    	"Keyword": ["Credentials", "Technical Information", "Credential Registry"],
    	"DateEffective": "2015-05-15",
    	"IndustryType": ["333922", "333923", "333924"],
    	"OccupationType": ["51-4121", "11-3051"],
    	"EstimatedDuration": [
    		{
    			"Description": "This is about how long it takes to earn this credential.",
    			"MinimumDuration": "P1Y6M15D",
    			"MaximumDuration": "P2Y8M"
    		}
    	],
    	"EstimatedCosts": [
    		{
    			"Name": "General Tuition for this Credential",
    			"Description": "This is how much it costs to earn this credential in general for local residents.",
    			"Price": 101.50,
    			"Currency": "USD",
    			"PaymentPattern": "Every other month, on the 5th",
    			"DirectCostType": ["costType:Tuition"],
    			"Residency": ["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"],
    			"AudienceType": ["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": ["http://credentialengineregistry.org/competencies/competencies/f8a0eb87-791b-4749-918b-258610effa49", "http://credentialengineregistry.org/competencies/competencies/f62ffde2-954d-42f1-bc1e-8f7904f0fbfe"]
    		}
    	]
    }

    When transformed, the data would look like this:

    {
    	"@context": {
    		"ceterms": "http://credreg.net/ctdl/terms/"
    		"audLevel": "http://credreg.net/ctdl/vocabs/audLevel",
    		"audience": "http://credreg.net/ctdl/vocabs/audience",
    		"costType": "http://credreg.net/ctdl/vocabs/costType",
    		"residency": "http://credreg.net/ctdl/vocabs/residency",
    		"@language", "en"
    	},
    	"@id": "http://lr-staging.learningtapestry.com/resources/ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71",
    	"@type": "ceterms:Certificate",
    	"ceterms:name": "My Credential Name",
    	"ceterms:description": "This is some text that describes my credential.",
    	"ceterms:subjectWebpage": { "@id": "http://www.credreg.net/credential/1234" }
    	"ceterms:keyword": [ "Credentials", "Technical Information", "Credential Registry" ],
    	"ceterms:dateEffective": "2015-05-15",
    	"ceterms:industryType": [ 
    		{ 
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNode": { "@id": "https://www.naics.com/naics-code-description/?code=333922" },
    			"ceterms:targetNodeName": "Conveyor and Conveying Equipment Manufacturing"
    		},
    		{ 
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNode": { "@id": "https://www.naics.com/naics-code-description/?code=333923" },
    			"ceterms:targetNodeName": "Overhead Traveling Crane, Hoist, and Monorail System Manufacturing"
    		},
    		{ 
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNode": { "@id": "https://www.naics.com/naics-code-description/?code=333924" },
    			"ceterms:targetNodeName": "Industrial Truck, Tractor, Trailer, and Stacker Machinery Manufacturing"
    		} 
    	],
    	"ceterms:occupationType": [
    		{ 
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNode": { "@id": "https://www.bls.gov/soc/2010/soc514121.htm" },
    			"ceterms:targetNodeName": "Welders, Cutters, Solderers, and Brazers"
    		},
    		{ 
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNode": { "@id": "https://www.bls.gov/soc/2010/soc113051.htm" },
    			"ceterms:targetNodeName": "Industrial Production Managers"
    		}
    	],
    	"ceterms:estimatedDuration": [
    		{
    			"@type": "ceterms:DurationProfile",
    			"ceterms:description": "This is about how long it takes to earn this credential.",
    			"ceterms:minimumDuration": "P1Y6M15D",
    			"ceterms:maximumDuration": "P2Y8M"
    		}
    	],
    	"ceters:estimatedCost": [
    		{
    			"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.50,
    			"ceterms:currency": "USD",
    			"ceterms:paymentPattern": "Every other month, on the 5th",
    			"ceterms:directCostType": [
    				{ 
    					"@type": "ceterms:CredentialAlignmentObject",
    					"ceterms:targetNode": { "@id": "costType:Tuition" },
    					"ceterms:targetNodeName": "Tuition"
    				}
    			],
    			"ceterms:residency": [
    				{ 
    					"@type": "ceterms:CredentialAlignmentObject",
    					"ceterms:targetNode": { "@id": "costType:Local" },
    					"ceterms:targetNodeName": "Local"
    				},
    				{ 
    					"@type": "ceterms:CredentialAlignmentObject",
    					"ceterms:targetNode": { "@id": "costType:InState" },
    					"ceterms:targetNodeName": "InState"
    				}
    			]
    			"ceterms:startDate": "2014-04-12",
    			"ceterms:endDate": "2019-04-12"
    		},
    		{
    			"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:targetNode": { "@id": "costType:Tuition" },
    					"ceterms:targetNodeName": "Tuition"
    				}
    			],
    			"ceterms:audienceType": [
    				{ 
    					"@type": "ceterms:CredentialAlignmentObject",
    					"ceterms:targetNode": { "@id": "audience:CurrentMilitary" },
    					"ceterms:targetNodeName": "Local"
    				},
    				{ 
    					"@type": "ceterms:CredentialAlignmentObject",
    					"ceterms:targetNode": { "@id": "audience:FormerMilitary" },
    					"ceterms:targetNodeName": "InState"
    				}
    			]
    		}
    	],
    	"ceterms:requires": [
    		{
    			"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"],
    		},
    		{
    			"ceterms:name": "Deeper Requirements",
    			"ceterms:description": "These conditions only apply to a specific combination of audience type and level.",
    			"ceterms:audienceType": [
    				{ 
    					"@type": "ceterms:CredentialAlignmentObject",
    					"ceterms:targetNode": { "@id": "audience:FormerStudent" },
    					"ceterms:targetNodeName": "Former Student"
    				},
    				{ 
    					"@type": "ceterms:CredentialAlignmentObject",
    					"ceterms:targetNode": { "@id": "audience:CurrentStudent" },
    					"ceterms:targetNodeName": "Current Student"
    				}
    			],
    			"ceterms:audienceLevelType": [
    				{ 
    					"@type": "ceterms:CredentialAlignmentObject",
    					"ceterms:targetNode": { "@id": "audLevel:AssociatesDegreeLevel" },
    					"ceterms:targetNodeName": "Former Associates Degree Level"
    				},
    				{ 
    					"@type": "ceterms:CredentialAlignmentObject",
    					"ceterms:targetNode": { "@id": "audLevel:IntermediateLevel" },
    					"ceterms:targetNodeName": "Intermediate Level"
    				},
    				{ 
    					"@type": "ceterms:CredentialAlignmentObject",
    					"ceterms:targetNode": { "@id": "audLevel:PostSecondaryLevel" },
    					"ceterms:targetNodeName": "Post-Secondary Level"
    				}
    			],
    			"ceterms:targetCredential": [ 
    				{ "@id": "http://lr-staging.learningtapestry.com/resources/ce-413704ba-f9fd-4f17-9815-370b42dda7bb" } 
    			],
    			"ceterms:targetAssessment": [ 
    				{ "@id": "http://lr-staging.learningtapestry.com/resources/ce-9db20b92-0787-43b2-83e1-b967d73d5df9" }, 
    				{ "@id": "http://lr-staging.learningtapestry.com/resources/ce-7d838a41-88e1-4011-885b-7318ef31c3dd" } 
    			],
    			"ceterms:targetCompetency": [
    				{ "@id": "http://credentialengineregistry.org/competencies/f8a0eb87-791b-4749-918b-258610effa49" }, 
    				{ "@id": "http://credentialengineregistry.org/competencies/f62ffde2-954d-42f1-bc1e-8f7904f0fbfe" } 
    			]
    		}	
    	]
    }

    Sample

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

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

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

    C#

    using System.Collections.Generic;
    using System.Text;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using Newtonsoft.Json;
    
    namespace Publish_Test {
    	public class Publisher 
    	{
    		public string PublishSimpleRecord() 
    		{
    			//Holds the result of the publish action
    			var result = "";
    
    			//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.",
    				SubjectWebpage = "http://www.credreg.net/credential/1234",
    				Type = "ceterms:Certificate",
    				Keyword = new List<string>() { "Credentials", "Technical Information", "Credential Registry" },
    				IndustryType = new List<string>() { "333922", "333923", "333924" },
    				Requires = new List<ConditionProfile>() 
    				{
    					new ConditionProfile()
    					{
    						Name = "My Requirements",
    						Condition = new List<string>() { "Condition One", "Condition Two", "Condition Three" }
    					}
    				}
    			};
    
    			//This holds the credential and the API key
    			var myData = new CredentialRequest()
    			{
    				Credential = myCred,
    				APIKey = "Your_API_Key_Here"
    			};
    
    			//Serialize the credential request object
    			var json = JsonConvert.SerializeObject( myData );
    
    			//Use HttpClient to perform the publish
    			using ( var client = new HttpClient() )
    			{
    				//Accept JSON
    				client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue( "application/json" ) );
    
    				//Format the json as content
    				var content = new StringContent( json, Encoding.UTF8, "application/json" );
    
    				//The endpoint to publish to
    				var publishEndpoint = "https://credentialfinder.org/ra/credential/publish/";
    
    				//Perform the actual publish action and store the result
    				result = client.PostAsync( publishEndpoint, content ).Result.Content.ReadAsStringAsync().Result;
    			}
    
    			//Return the result
    			return result;
    		}
    
    		public class CredentialRequest
    		{
    			public SampleOrganization Organization { get; set; }
    			public string APIKey { get; set; }
    		}
    
    		public class SampleCredential
    		{
    			public string Name { get; set; }
    			public string Description { get; set; }
    			public string SubjectWebpage { get; set; }
    			public string Type { get; set; }
    			public string DateEffective { get; set; }
    			public List<string> Keyword { get; set; }
    			public List<string> AudienceLevelType { get; set; }
    			public List<string> IndustryType { get; set; }
    			public List<string> OccupationType { get; set; }
    			public List<ConditionProfile> Requires { get; set; }
    			public List<ConditionProfile> Recommends { get; set; }
    			//Other properties
    		}
    
    		public class ConditionProfile 
    		{
    			public string Name { get; set; }
    			public string Description { get; set; }
    			public List<string> Condition { get; set; }
    			//Othe properties
    		}
    	}		
    }
    

    Summary

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

    Publishing Your Assessment

    Introduction

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

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

    Format Data (only)

    https://credentialfinder.org/ra/assessment/format

    Publish Data (automatically formats first)

    https://credentialfinder.org/ra/assessment/publish

    Required Properties

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

    Name
    The name of your assessment.
    Description
    A brief description of your assessment.
    AssessmentMethodType
    A list of terms from the Assessment Method Type vocabulary that describe the primary method(s) this assessment uses to do its assessing.

    Publishing a Basic Record

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

    {
    	"Name": "My Assessment Name",
    	"Description": "This is some text that describes my assessment.",
    	"AssessmentMethodType": [ "assessMethod:Exam", "assessMethod:Performance" ]
    }

    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": {
    		"ceterms": "http://credreg.net/ctdl/terms/",
    		"assessMethod": "http://credreg.net/ctdl/vocabs/assessMethod/"
    		"@language", "en"
    	},
    	"@id": "http://lr-staging.learningtapestry.com/resources/ce-9db20b92-0787-43b2-83e1-b967d73d5df9",
    	"@type": "ceterms:AssessmentProfile",
    	"ceterms:name": "My Assessment Name",
    	"ceterms:description": "This is some text that describes my assessment.",
    	"ceterms:assessmentMethodType": [
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Exam",
    			"ceterms:targetNode": { "@id": "assessMethod:Exam" }
    		},
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Performance",
    			"ceterms:targetNode": { "@id": "assessMethod:Performance" }
    		},
    	]
    }

    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": {
    			"ceterms": "http://credreg.net/ctdl/terms/",
    			"assessMethod": "http://credreg.net/ctdl/vocabs/assessMethod/"
    			"@language", "en"
    		},
    		"@id": "http://lr-staging.learningtapestry.com/resources/ce-9db20b92-0787-43b2-83e1-b967d73d5df9",
    		"@type": "ceterms:AssessmentProfile",
    		"ceterms:name": "My Assessment Name",
    		"ceterms:description": "This is some text that describes my assessment.",
    		"ceterms:assessmentMethodType": [
    			{
    				"@type": "ceterms:CredentialAlignmentObject",
    				"ceterms:targetNodeName": "Exam",
    				"ceterms:targetNode": { "@id": "assessMethod:Exam" }
    			},
    			{
    				"@type": "ceterms:CredentialAlignmentObject",
    				"ceterms:targetNodeName": "Performance",
    				"ceterms:targetNode": { "@id": "assessMethod:Performance" }
    			},
    		]
    	}
    }

    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:

    CodedNotation
    Coded identifier for you assessment that others are likely to recognize.
    SubjectWebpage
    The official URL for your assessment. This is usually the URL for the official page about the assessment on your organization's website.
    Keyword
    A list of keywords to help find your assessment in searches. Each keyword may be a word or a phrase.
    Subject
    A list of subjects your assessment covers. Subjects should ideally be commonly used (such as "Mathematics" or "Social Studies") or taken from a controlled vocabulary.
    DeliveryType
    A list of terms from the Delivery Type vocabulary.
    TargetCompetency
    One or more competencies that are assessed by this assessment.
    OwnedBy
    Identifier for the organization that owns the assessment.
    OfferedBy
    A list of identifiers for organizations that offer the assessment.
    AssessmentExample
    A link to an example of the assessment.
    AssessmentUseType
    A list of terms from the Assessment Use Type vocabulary.
    EstimatedDuration
    The approximate overall time it will take to complete this assessment. Value must be a list of Duration Profiles.
    EstimatedCosts
    The approximate overall costs for taking this assessment. Value must be a list of Cost Profiles.
    Requires
    The conditions someone must meet to pass this assessment. Value must be a list of Condition Profiles.
    Recommends
    Things that someone can do to significantly help them prepare for taking the assessment, but which are not required. Value must be a list of Condition Profiles.

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

    {
    	"Name": "My Assessment Name",
    	"Description": "This is some text that describes my assessment.",
    	"SubjectWebpage": "http://www.credreg.net/assessment/1234",
    	"Type": "ceterms:AssessmentProfile",
    	"AssessmentMethodType": [ "assessMethod:Exam", "assessMethod:Performance" ]
    	"Keyword": ["Credentials", "Technical Information", "Credential Registry"],
    	"OwnedBy": ["ce-28935e07-76dc-4562-8c43-3ece101686be"],
    	"OfferedBy": ["ce-28935e07-76dc-4562-8c43-3ece101686be", "ce-e8305dc9-46cb-46be-8320-9a794df9e252"],
    	"AssessmentUseType": ["assessUse:Summative"],
    	"DeliveryType": ["deliveryType:OnlineOnly"],
    	"EstimatedDuration": [
    		{
    			"Description": "This is about how long it takes to complete this assessment.",
    			"MinimumDuration": "PT1H30M",
    			"MaximumDuration": "PT3H"
    		}
    	]
    }

    When transformed, the data would look like this:

    {
    	"@context": {
    		"ceterms": "http://credreg.net/ctdl/terms/",
    		"assessMethod": "http://credreg.net/ctdl/vocabs/assessMethod/",
    		"assessUse": "http://credreg.net/ctdl/vocabs/assessUse/",
    		"deliveryType": "http://credreg.net/ctdl/vocabs/deliveryType/",
    		"@language", "en"
    	},
    	"@id": "http://lr-staging.learningtapestry.com/resources/ce-9db20b92-0787-43b2-83e1-b967d73d5df9",
    	"@type": "ceterms:AssessmentProfile",
    	"ceterms:name": "My Assessment Name",
    	"ceterms:description": "This is some text that describes my assessment.",
    	"ceterms:subjectWebpage": { "@id": "http://www.credreg.net/assessment/1234" },
    	"ceterms:keyword": ["Credentials", "Technical Information", "Credential Registry"],
    	"ceterms:offeredBy": [
    		{ "@id": "http://lr-staging.learningtapestry.com/resources/ce-28935e07-76dc-4562-8c43-3ece101686be" }	
    	],
    	"ceterms:ownedBy": [
    		{ "@id": "http://lr-staging.learningtapestry.com/resources/ce-28935e07-76dc-4562-8c43-3ece101686be" },	
    		{ "@id": "http://lr-staging.learningtapestry.com/resources/ce-e8305dc9-46cb-46be-8320-9a794df9e252" }	
    	]
    	"ceterms:assessmentMethodType": [
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Exam",
    			"ceterms:targetNode": { "@id": "assessMethod:Exam" }
    		},
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Performance",
    			"ceterms:targetNode": { "@id": "assessMethod:Performance" }
    		},
    	],
    	"ceterms:assessmentUseType": [
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Summative",
    			"ceterms:targetNode": { "@id": "assessUse:Summative" }
    		}
    	],
    	"ceterms:deliveryType": [
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Online Only",
    			"ceterms:targetNode": { "@id": "deliveryType:OnlineOnly" }
    		}
    	],
    	"ceterms:estimatedDuration": [
    		{
    			"@type": "ceterms:DurationProfile",
    			"ceterms:description": "This is about how long it takes to complete this assessment.",
    			"ceterms:minimumDuration": "PT1H30M",
    			"ceterms:maximumDuration": "PT3H"
    		}
    	]
    }

    Sample

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

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

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

    C#

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

    Summary

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

    Publishing Your Learning Opportunity

    Introduction

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

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

    Format Data (only)

    https://credentialfinder.org/ra/learningopportunity/format

    Publish Data (automatically formats first)

    https://credentialfinder.org/ra/learningopportunity/publish

    Required Properties

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

    Name
    The name of your learning opportunity.
    Description
    A brief description of your learning opportunity.
    LearningMethodType
    A list of terms from the Learning Method Type vocabulary that describe the primary method(s) this learning opportunity uses to do its educating.

    Publishing a Basic Record

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

    {
    	"Name": "My Learning Opportunity Name",
    	"Description": "This is some text that describes my learning opportunity.",
    	"LearningMethodType": [ "learnMethod:Lecture", "learnMethod:Laboratory" ]
    }

    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": {
    		"ceterms": "http://credreg.net/ctdl/terms/",
    		"learnMethod": "http://credreg.net/ctdl/vocabs/learnMethod/"
    		"@language", "en"
    	},
    	"@id": "http://lr-staging.learningtapestry.com/resources/ce-08c3dc49-a133-4e7f-a06c-b5e054f62dcc",
    	"@type": "ceterms:LearningOpportunityProfile",
    	"ceterms:name": "My Learning Opportunity Name",
    	"ceterms:description": "This is some text that describes my learning opportunity.",
    	"ceterms:learningMethodType": [
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Lecture",
    			"ceterms:targetNode": { "@id": "learnMethod:Lecture" }
    		},
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Laboratory",
    			"ceterms:targetNode": { "@id": "learnMethod:Laboratory" }
    		},
    	]
    }

    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": {
    			"ceterms": "http://credreg.net/ctdl/terms/",
    			"learnMethod": "http://credreg.net/ctdl/vocabs/learnMethod/"
    			"@language", "en"
    		},
    		"@id": "http://lr-staging.learningtapestry.com/resources/ce-08c3dc49-a133-4e7f-a06c-b5e054f62dcc",
    		"@type": "ceterms:LearningOpportunityProfile",
    		"ceterms:name": "My Learning Opportunity Name",
    		"ceterms:description": "This is some text that describes my learning opportunity.",
    		"ceterms:learningMethodType": [
    			{
    				"@type": "ceterms:CredentialAlignmentObject",
    				"ceterms:targetNodeName": "Lecture",
    				"ceterms:targetNode": { "@id": "learnMethod:Lecture" }
    			},
    			{
    				"@type": "ceterms:CredentialAlignmentObject",
    				"ceterms:targetNodeName": "Laboratory",
    				"ceterms:targetNode": { "@id": "learnMethod:Laboratory" }
    			},
    		]
    	}
    }

    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:

    CodedNotation
    Coded identifier for you learning opportunity that others are likely to recognize.
    SubjectWebpage
    The official URL for your assessment. This is usually the URL for the official page about the assessment on your organization's website.
    Keyword
    A list of keywords to help find your learning opportunity in searches. Each keyword may be a word or a phrase.
    Subject
    A list of subjects your learning opportunity covers. Subjects should ideally be commonly used (such as "Mathematics" or "Social Studies") or taken from a controlled vocabulary.
    DeliveryType
    A list of terms from the Delivery Type vocabulary.
    TargetCompetency
    One or more competencies that are taught by this learning opportunity.
    OwnedBy
    Identifier for the organization that owns the learning opportunity.
    OfferedBy
    A list of identifiers for organizations that offer the learning opportunity.
    AudienceLevelType
    A list of terms from the Audience Level Type vocabulary.
    InstructionalProgramType
    A list of instructional program classifications, usually expressed as CIP codes, under which this learning opportunity is classified.
    EstimatedDuration
    The approximate overall time it will take to complete this learning opportunity. Value must be a list of Duration Profiles.
    EstimatedCosts
    The approximate overall costs for participating in this learning opportunity. Value must be a list of Cost Profiles.
    Requires
    The conditions someone must meet to finish this learning opportunity. Value must be a list of Condition Profiles.
    Recommends
    Things that someone can do to significantly help them prepare for entering into this learning opportunity, but which are not required. Value must be a list of Condition Profiles.

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

    {
    	"Name": "My Learning Opportunity Name",
    	"Description": "This is some text that describes my learning opportunity.",
    	"SubjectWebpage": "http://www.credreg.net/learningopportunity/1234",
    	"Type": "ceterms:AssessmentProfile",
    	"LearningMethodType": [ "learnMethod:Lecture", "learnMethod:Laboratory" ]
    	"Keyword": ["Credentials", "Technical Information", "Credential Registry"],
    	"OwnedBy": ["ce-28935e07-76dc-4562-8c43-3ece101686be"],
    	"OfferedBy": ["ce-28935e07-76dc-4562-8c43-3ece101686be", "ce-e8305dc9-46cb-46be-8320-9a794df9e252"],
    	"AudienceLevelType": ["audLevel:PostSecondaryLevel"],
    	"DeliveryType": ["deliveryType:OnlineOnly"],
    	"EstimatedDuration": [
    		{
    			"Description": "This is about how long it takes to complete this learning opportunity.",
    			"MinimumDuration": "P2W",
    			"MaximumDuration": "P3W"
    		}
    	]
    }

    When transformed, the data would look like this:

    {
    	"@context": {
    		"ceterms": "http://credreg.net/ctdl/terms/",
    		"learnMethod": "http://credreg.net/ctdl/vocabs/learnMethod/",
    		"audLevel": "http://credreg.net/ctdl/vocabs/audLevel/",
    		"deliveryType": "http://credreg.net/ctdl/vocabs/deliveryType/",
    		"@language", "en"
    	},
    	"@id": "http://lr-staging.learningtapestry.com/resources/ce-08c3dc49-a133-4e7f-a06c-b5e054f62dcc",
    	"@type": "ceterms:LearningOpportunityProfile",
    	"ceterms:name": "My Learning Opportunity Name",
    	"ceterms:description": "This is some text that describes my learning opportunity.",
    	"ceterms:subjectWebpage": { "@id": "http://www.credreg.net/learningopportunity/1234" },
    	"ceterms:keyword": ["Credentials", "Technical Information", "Credential Registry"],
    	"ceterms:offeredBy": [
    		{ "@id": "http://lr-staging.learningtapestry.com/resources/ce-28935e07-76dc-4562-8c43-3ece101686be" }	
    	],
    	"ceterms:ownedBy": [
    		{ "@id": "http://lr-staging.learningtapestry.com/resources/ce-28935e07-76dc-4562-8c43-3ece101686be" },	
    		{ "@id": "http://lr-staging.learningtapestry.com/resources/ce-e8305dc9-46cb-46be-8320-9a794df9e252" }	
    	]
    	"ceterms:learningMethodType": [
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Lecture",
    			"ceterms:targetNode": { "@id": "learnMethod:Lecture" }
    		},
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Laboratory",
    			"ceterms:targetNode": { "@id": "learnMethod:Laboratory" }
    		},
    	],
    	"ceterms:audienceLevelType": [
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Post-Secondary Level",
    			"ceterms:targetNode": { "@id": "audLevel:PostSecondaryLevel" }
    		}
    	],
    	"ceterms:deliveryType": [
    		{
    			"@type": "ceterms:CredentialAlignmentObject",
    			"ceterms:targetNodeName": "Online Only",
    			"ceterms:targetNode": { "@id": "deliveryType:OnlineOnly" }
    		}
    	],
    	"ceterms:estimatedDuration": [
    		{
    			"@type": "ceterms:DurationProfile",
    			"ceterms:description": "This is about how long it takes to complete this learning opportunity.",
    			"ceterms:minimumDuration": "P2W",
    			"ceterms:maximumDuration": "P3W"
    		}
    	]
    }

    Sample

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

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

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

    C#

    using System.Collections.Generic;
    using System.Text;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using Newtonsoft.Json;
    
    namespace Publish_Test {
    	public class Publisher 
    	{
    		public string PublishSimpleRecord() 
    		{
    			//Holds the result of the publish action
    			var result = "";
    
    			//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.",
    				SubjectWebpage = "http://www.credreg.net/learningopportunity/1234",
    				Keyword = new List<string>() { "Credentials", "Technical Information", "Credential Registry" },
    				LearningMethodType = new List<string>() { "learnMethod:Lecture", "learnMethod:Laboratory" },
    				Requires = new List<ConditionProfile>() 
    				{
    					new ConditionProfile()
    					{
    						Name = "My Requirements",
    						Condition = new List<string>() { "Condition One", "Condition Two", "Condition Three" }
    					}
    				}
    			};
    
    			//This holds the learning opportunity and the API key
    			var myData = new LearningOpportunityRequest()
    			{
    				LearningOpportunity = myLopp,
    				APIKey = "Your_API_Key_Here"
    			};
    
    			//Serialize the credential request object
    			var json = JsonConvert.SerializeObject( myData );
    
    			//Use HttpClient to perform the publish
    			using ( var client = new HttpClient() )
    			{
    				//Accept JSON
    				client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue( "application/json" ) );
    
    				//Format the json as content
    				var content = new StringContent( json, Encoding.UTF8, "application/json" );
    
    				//The endpoint to publish to
    				var publishEndpoint = "https://credentialfinder.org/ra/learningopportunity/publish/";
    
    				//Perform the actual publish action and store the result
    				result = client.PostAsync( publishEndpoint, content ).Result.Content.ReadAsStringAsync().Result;
    			}
    
    			//Return the result
    			return result;
    		}
    
    		public class LearningOpportunityRequest
    		{
    			public SampleLearningOpportunity LearningOpportunity { get; set; }
    			public string APIKey { get; set; }
    		}
    
    		public class SampleLearningOpportunity
    		{
    			public string Name { get; set; }
    			public string Description { get; set; }
    			public string SubjectWebpage { get; set; }
    			public List<string> Keyword { get; set; }
    			public List<string> LearningMethodType { get; set; }
    			public List<string> AudienceLevelType { get; set; }
    			public List<string> DeliveryType { get; set; }
    			public List<ConditionProfile> Requires { get; set; }
    			public List<ConditionProfile> Recommends { get; set; }
    			//Other properties
    		}
    
    		public class ConditionProfile 
    		{
    			public string Name { get; set; }
    			public string Description { get; set; }
    			public List<string> Condition { get; set; }
    			//Othe properties
    		}
    	}		
    }
    

    Summary

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

    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:

    Agent Sector

    Enumeration of types of sociological, economic, or political subdivision of society.

    The sector that contains privately-owned organizations that operate for profit.
    The sector that contains privately-owned organizations that operate on a non-profit basis.
    These include both independent not-for-profit schools and those affiliated with a religious organization.
    The sector that contains government and quasi-government organizations.

    Agent Service Type

    An enumeration of types of services offered by an agent.

    The resource being described provides accreditation service.
    The resource being described provides approval service.
    The resource being described offers other resources.
    The service offers resources such as credentials, assessments, or learning opportunities.
    The resource being described provides recognition service.
    The resource being described provides regulation service.
    The resource being described provides renewal service.
    The resource being described provides revocation service.

    Assessment Method Type

    An enumeration of assessment methods.

    A work or product created to be persistent in some medium.
    Artifact includes, but is not limited to, an academic paper, video documentary, computer software, music composition, choreography, novel, short story, journal article, news article, report, lesson plan, product design, manufactured product, etc. Methods of evaluation may include multiple evaluators either individually or as an expert panel using general criteria or more structured rubrics whose scores are combined, etc. Criteria and methods of evaluation are often very similar to those for assessing a performance, without the facets specific to a live performance
    A mix of scored items presented in fixed or open response formats.
    Exams may be human- or machine-scored and include, but are not limited to, multiple choice, true-false, written essay, short-answer, fill-in or oral response formats that could include measurements of reasoning, problem-solving, critical thinking.
    A demonstration or performance that is usually assessed while the performance is taking place or as recorded for assessment purposes after the performance.
    Performance includes, but is not limited to, dance, music, teaching, acting, medical procedures, truck driving, manufacturing production, etc. Criteria include the categories and benchmarks on which the performance is assessed. Methods of evaluation can include multiple evaluators either individually or as an expert panel using general criteria or more structured rubrics whose scores are combined (e.g., assessing a dance performance, evaluating the performance of a medical procedure, truck driving procedure, manufacturing process such as machining).

    Assessment Use Type

    An enumeration 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.

    Audience Level Type

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

    The resource is intended for advanced level individuals.
    An Individual at this level has the competencies to function independently at a high level of proficiency.
    The resource is intended for the associate degree level or lower-division individuals.
    The resource is intended for baccalaureate or upper-division level individuals.
    The resource is intended for entry level individuals.
    An individual at this level has or should develop basic competencies to function with supervision.
    The resource is intended for doctoral level individuals.
    The resource is intended for intermediate level individuals.
    An individual at this level has foundational competencies to function independently with occasional supervision.
    The resource is intended for the master degree level individuals.
    The resource is intended for post-secondary level individuals.
    The resource is intended for secondary (high school) level individuals.

    Audience Type

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

    A person who is a legally recognized subject of a particular nation, state, province, or commonwealth.
    A current member of a nation's military.
    A Dependent (usually a child) of a current member of a nation's military.
    A Spouse of a current member of a nation's military.
    A student currently participating in a learning opportunity.
    A veteran of military service.
    A Dependent (usually a child) of a veteran of a nation's military.
    A Spouse of a veteran of a nation's military.
    A student who previously participated in a learning opportunity.
    Participation in or with a learning opportunity to an extent that meets the opportunity's requirements for full-time status.
    A member of an organization, society, or recognized group.
    A person who is not a legally recognized subject of a particular nation, state, province, or commonwealth.
    A non-member of an organization, society, or recognized group.
    A person whose primary residence is not in a particular nation, state, province, or commonwealth.
    Participation in or with a learning opportunity to an extent that meets the opportunity's requirements for part-time status.
    A person employed in the private sector.
    A person employed in the public sector.
    A person whose primary residence is in a particular nation, state, province, or commonwealth.

    Cost Type

    Enumerations of the types of direct cost to attaining the credential.

    The sum of direct costs.
    Cost of applying for the resource being described.
    Cost for a background check.
    Cost to enroll in the resource being described.
    A separate fee charged for graduating from an educational program.
    Cost for one or more learning resources related to the resource being described.
    Examples include resources such as textbooks, workbooks, laboratory supplies, and other related supplies.
    Cost for meals while participating in or with the resource being described.
    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.
    Examples include: 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 or residence while participating in or with the resource being described.
    Cost for scoring the resource being described.
    Cost for standalone assessments.
    Cost for student services related to the resource being described.
    Cost for accessing technologies related to the resource being described.
    Cost for accessing technologies related to the resource being described.

    Delivery Type

    The technical form of providing instances of the resource being described.

    Delivery includes in person and online.
    Delivery is in person.
    Delivery is via the Internet.

    Learning Method Type

    Enumeration of methods used to conduct the learning opportunity.

    Provides learning opportunities in the context of real world examples, cases, and applications.
    Applied includes methods such as contextual learning, applied academics, academic-technical integration, problem-based learning, project-based learning, and case methods.
    Delivery of learning material via one-way broadcast or storage media that take advantage of electronic technology or any other medium that requires electricity or digital encoding of information.
    Electronic Media Based includes methods such as television, radio, Internet, fax, distributed media, and gaming.
    Hands-on individual or group experiences for applied learning concepts and methods, procedures and protocols with equipment and technologies.
    Laboratory includes methods such as direct or indirect, physical or virtual simulation or participation.
    The primary method is presentation by an instructor of learning material and may include student discussion.
    Lecture courses may involve student questions and answers, but the role of the instructor is clearly differentiated from that of the students.
    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.
    Self paced includes methods such competency-based education, open-entry/open exit, independent study, private study, and correspondence.
    The primary method is active student discussion leading to advancement of the topic and facilitated by an instructor.
    Seminars typically involve small groups to facilitate equal opportunity with the instructor and colleagues to be engaged and occasionally may include students leading discussions.
    Provides real-world work experiences that may be paid or unpaid and provided in group or individual formats normally outside the classroom.
    Work based includes methods such as apprenticeships, internships, externships, work study, clinical rotations, residencies, practicums, field study, team projects, and cooperative education.

    Residency Type

    An enumeration of types of residency.

    The legal residency or domicile status of the agent is the state or province of the relevant activity.
    The legal residency, domicile, or citizen status of the agent is the foreign nation.
    The legal residency or domicile status of the agent is local.
    The legal residency or domicile status of the agent is a state or province different from the state or provincial locus of the relevant activity.
    The legal residency or domicile status of the agent is the same geopolitical region as that of the relevant activity.

    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.

    Name
    A name for this Condition Profile. This is useful if you are providing several Condition Profiles and want or need to refer to individual ones by a human-readable name.
    Description
    A short summary of this Cost Profile.
    Condition
    A text string that helps refine the Description field. A single "condition" is equivalent to a single item in a bulleted list, and this property is intended to convey such "bulleted list" style information. Provide as many "conditions" as are needed.
    SubjectWebpage
    A URL to a page that describes the conditions defined by this Condition Profile in more detail.
    AudienceType
    The particular type(s) of audience to which the conditions described by this Condition Profile apply. Value must be a list of terms from the Audience Type vocabulary.
    AudienceLevelType
    The approximate education level of the audience that these conditions apply to. Value must be a list of terms from the Audience Level Type vocabulary.
    EstimatedCost
    Cost-related information that only applies under the conditions defined by this Condition Profile. Value must be a list of Cost Profiles.
    TargetCredential
    A list of credentials that are a part of these conditions. For instance, if this Condition Profile is attached to a "requires" property, the TargetCredential field would indicate other credentials that must be obtained as part of meeting the requirements for the Credential that "requires" this Condition Profile.
    TargetAssessment
    A list of assessments that are a part of these conditions. For instance, if this Condition Profile is attached to a "requires" property, the TargetAssessment field would indicate assessments that must be passed as part of meeting the requirements for the Credential that "requires" this Condition Profile.
    TargetLearningOpportunity
    A list of learning opportunities that are a part of these conditions. For instance, if this Condition Profile is attached to a "requires" property, the TargetLearningOpportunity field would indicate learning opportunities that must be completed as part of meeting the requirements for the Credential that "requires" this Condition Profile.
    TargetCompetency
    A list of competencies that are a part of these conditions. For instance, if this Condition Profile is attached to a "requires" property, the TargetCompetency field would indicate competencies that must be obtained as part of meeting the requirements for the Credential that "requires" this Condition Profile.

    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.

    Name
    A name for this Cost Profile. This is useful if you are providing several cost profiles and want or need to refer to individual ones by a human-readable name.
    Description
    A short summary of this Cost Profile.
    Price
    The numeric amount of the cost defined by this Cost Profile. Do not include a currency symbol or notation. Use the Currency field to indicate currency information.
    Currency
    The ISO 4217 currency code for the unit of currency that this Cost Profile's Price field is measured in.
    CostDetails
    Details specific to this cost that cannot be adequately conveyed by the other properties or vocabularies.
    PaymentPattern
    Text describing the recurring payment pattern, if any, of the cost defined by this Cost Profile.
    StartDate
    A string in YYYY-MM-DD format (derived from ISO 8601) indicating the date on which this Cost Profile's information becomes valid.
    EndDate
    A string in YYYY-MM-DD format (derived from ISO 8601) indicating the date on which this Cost Profile's information becomes invalid.
    DirectCostType
    The overall type of cost defined by this Cost Profile. Value must be a list of terms from the Cost Type vocabulary.
    AudienceType
    The particular type(s) of audience to which the cost described by this Cost Profile applies. Value must be a list of terms from the Audience Type vocabulary.
    ResidencyType
    The type(s) of residency to which the cost described by this Cost Profile applies. Value must be a list of terms from the Residency Type vocabulary.

    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.

    Description
    A short summary of this duration profile.
    ExactDuration
    An ISO 8601-formatted duration string indicating an exact, known duration.
    MinimumDuration
    An ISO 8601-formatted duration string indicating the minimum amount of time something is expected to require.
    MaximumDuration
    An ISO 8601-formatted duration string indicating the maximum amount of time something is expected to require.