Registry Assistant API Handbook

Last Updated on 6/19/2019

What's New

5/4/2019

5/3/2019

3/19/2019

The Registry Assistant API guide has been updated with better examples and clarifiction in its content.

2/21/2019

Added a section on deleting documents from the Credential Registry.

2/11/2019

Overview

The Credential Engine offers the Registry Assistant API as a way to streamline publishing to the Credential Registry. The Registry Assistant uses a simplified version of the CTDL schema designed to be easy to map your data to. This guide is a step-by-step walkthrough for using the Registry Assistant API.

To use the Registry Assistant API, you will need:

  • A Credential Engine Account, including an Organization account that has been approved to publish via the Registry Assistant API
  • Your API key (obtainable via your Credential Engine Account)
  • A working knowledge of CTDL and related concepts
  • Programmatic read/write access to your data to generate and store CTIDs and retrieve the data for publishing
  • The ability to update your website or system to publish data to the Registry

Overview Presentation

Working Knowledge

This guide assumes a working knowledge of:

Additionally, it is recommended to be familiar with:

Getting your API Key

In order to publish/consume 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. If you do not already have an account and/or an approved organization:

  1. Navigate to the Credential Engine Accounts site.
  2. Create an account. After registering, you will receive an email to confirm your account.
  3. After confirming your account, you can add your organization.
  4. 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 API key will be generated for your organization's account. This API key will be used for publishing and consuming (Note: You will not need the API key for requests to the Format endpoint).

Your organization's CTID and API key will be available on the organization dashboard on the accounts site, as shown below:

The organization CTID and API key can be found on the organization dashboard.

Managing your CTIDs

The CTID serves as the primary, unique identifier for all major objects in the Credential Registry. As such, it is critical that your system is able to associate each credential with its CTID, as this is the only way to update or delete the credential's data once it is published to the Registry.

CTIDs can be easily generated by concatenating ce- and a UUID or GUID. For example:

ce-fabac3e1-ba70-43b6-b0ce-5ff6108c8e7d

API and Registry Features

This section describes features of the API and the environments you can publish to with it.

Publishing Environments

The Credential Engine maintains two environments for publishing:

  • The sandbox environment, for testing your system and your data
  • The production environment, for real data

Sandbox

The Credential Engine offers a sandbox environment for both initial testing of publishing an organization's data and to allow feedback from CE on the range and type of data published. The sandbox should be used for all initial testing. An API key is normally not required for publishing to the sandbox. A partner who anticipates acting as a third party publisher may wish to use the sandbox environment to better understand the workflow. In this case, the CE team will work with the partner to simulate an environment in the sandbox similar to the anticipated workflow in production, including the use of API keys and identifying the CTIDs for 'client' organizations. The pattern for the sandbox URLs are as follows:

Format Data (no publishing)

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

Publish Data (automatically formats first)

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

The majority of the code samples in this section will use the sandbox URLs.

Production

The production environment, naturally, is used to publish data to the production registry. Typically an organization will be required to use the sandbox environment first to validate how their data is retrieved, and formatted for publishing. The pattern for the sandbox URLs are as follows:

Format Data (no publishing)

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

Publish Data (automatically formats first)

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

Services

The Registry Assistant API provides three main services related to the credential registry:

  • Formatting your data in CTDL JSON-LD
  • Publishing your data in the Credential Registry
  • Deleting your data from the Credential Registry

Request/Response

Request

The Publish and Format endpoints use an HTTP POST request. Each endpoint type will have a custom input class. The input object will be provided in the body of the Post request.

Response

Response class returned from publish and format endpoints.

/// Registry Assistant Response public class RegistryAssistantResponse { public RegistryAssistantResponse() { Messages = new List(); Payload = ""; } /// True if action was successful, otherwise false public bool Successful { get; set; } /// List of error or warning messages public List Messages { get; set; } public string CTID { get; set; } /// URL for the registry envelope that contains the document just add/updated public string EnvelopeUrl { get; set; } /// URL for the graph endpoint for the document just add/updated public string GraphUrl { get; set; } /// Credential Finder Detail Page URL for the document just published (within 30 minutes of publishing) public string CredentialFinderUrl { get; set; } /// Identifier for the registry envelope that contains the document just add/updated public string RegistryEnvelopeIdentifier { get; set; } /// Payload of request to registry, containing properties formatted as CTDL - JSON-LD public string Payload { get; set; } }

Response class returned from delete endpoints.

/// Registry Assistant Delete Response public class RegistryAssistantDeleteResponse { public RegistryAssistantDeleteResponse() { Messages = new List(); } /// True if action was successful, otherwise false public bool Successful { get; set; } /// List of error or warning messages public List Messages { get; set; } }

Format Endpoints

The primary purpose of the formatting endpoints are to be able to 'test' making publishing calls. These endpoints are called with the same data that would be provided when publishing. The format endpoints do the same data validation as happens when calling the publish endpoints, and then formats the data as JSON-LD - as would be found in the registry. However, instead of publishing the data, it is returned to the caller.

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

Example: Format Credential

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

Publish Endpoints

The publishing endpoints are used when you are ready to actually publish data to the registry.

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

Publish Data (automatically formats first)

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

Example: Publish Organization

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

Delete Endpoints

The delete endpoints are used when you want to remove a document from the registry.

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

Delete a Document

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

Example: Delete Credential

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

The requirements for a delete request are as follows. Note: The API key is passed in the header of the request (see the Getting Your API Key section for details)

  • Your API Key
  • The CTID of the document to be deleted
  • The CTID of the organization making the request

Example HTTP DELETE request body:

{ "Ctid": "ce-c774ac0f-b926-4e76-952f-4c5b6b4dc764", "PublishForOrganizationIdentifier": "ce-35677d3a-3430-4e6f-a1db-4d7375367b21" }

Publishing Process

This section describes the process for publishing to the Registry via the Registry Assistant API.

Workflows

There are two types of workflows related to publishing First Party and Third Party.

First Party Workflow

First Party workflow where the owner of the data to be published also performs the publishing.

  1. The organization registers with the CE accounts site.
  2. Upon approval, the organization will be given access to an API key (see Getting your API Key), that is used along with the CTID for their organization when calling the API to publish their data.
  3. The API process will validate whether a particular API key can be used to publish data for a particular organization CTID.

Third Party Workflow

Third Party workflow where an data organization has decided to have a third party publish data on their behalf.

  1. The organization, such as a state body, registers with the CE accounts site. Under their organization information, they would indicate that they plan to act as a third party publisher.
  2. The latter organization identifies 'client' organizations, and these bodies also register on the CE accounts site.
  3. After approval, a 'client' organization can submit a request to designate the third party organization to publish on their behalf.
  4. The third party organization must approve the request. Then CE staff will approve the completion of a third party publishing permission.
  5. Upon approval, the third party organization will be given access to an API key (see Getting your API Key).
  6. When publishing the third party organization would use their API key and the CTID for one of the client organizations.
  7. The API process will validate whether a particular API key can be used to publish data for a particular organization CTID.

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 to serialize 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:

Sample showing one-line serialization of a C# class to JSON using the Newtonsoft library

string postBody = Newtonsoft.Json.JsonConvert.SerializeObject( myCSharpDataClass );

Pattern for Calling the Publishing API

All publish requests follow the same pattern. A publish request consists of three main parts:

  • The API key for your organization, passed in the header (see below)
  • The CTID of the organization that owns the data (If you are publishing on behalf of another organization, use that organization's CTID. Otherwise, use your organization's CTID)
  • The data itself

Passing Your API Key

The API key will be provided in the header of the request using the Authorization header and a label of ApiToken.

Adding an API key to an HTTP Request using HttpClient (C#)

Error: Unable to find file: AddAuthorizationHeader_CSharp.cshtml

The CTID for the data owner is provided in the body of the request along with the main data class.

Creating a request body for an organization (C#)

//Instantiate the request var request = new OrganizationRequest(); //assign the CTID request.PublishForOrganizationIdentifier = organizationCTIDFromAccountsSite; //assign the organization data. request.Organization = myOrganizationData;

Assistant Key Input Classes

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

The API input classes clarify the multiplicity of the input properties, which is not immediately clear by just reviewing the CTDL terms. 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, Industries, and Instructional Programs frameworks

Language Maps

October 31, 2018. Several major updates were made to how data is stored in the registry. These changes, for the most part, were transparent to API users. One of the additions was to store simple strings as language maps. For example, previously the ceterms:name property was formated as:

Previous name format

"ceterms:name": "Certificate in Electrical Specialist"

Properties defined as a language map are now an object with a property for each language provided. The property name is the BCP 47 language code (optionally including the region, e.g. "en" or "en-us"). This allows describing data for the same property in multiple languages, which in turn allows a system consuming the data to select the language(s) it wants to display.

Sample language map with one language

"ceterms:name": { "en": "Certificate in Electrical Specialist" }

Sample language map with multiple languages

"ceterms:name": { "en": "Certificate in Electrical Specialist", "es": "Certificado en Especialista Eléctrico", "ru": "Сертификат в области электротехники" }

As noted, one of the main tenets of the API is to simiplify publishing to the Credential Registry. To this end, users of the API can choose to provide data as a simple string or as a language map. If all of your data is in one language, the language provided in the inLanguage property will be used when formatting a language map for publishing to the registry.

In the API input classes, the language Map is defined as Dictionary with string keys and values (expressed in C# as Dictionary<string, string>).

Sample language map usage (C#)

//Sample Credential public class Credential { //Simple string public string Name { get; set; } // Language Map public LanguageMap Name_Map { get; set; } = new LanguageMap(); } //Language map extends Dictionary<string, string> public class LanguageMap : Dictionary<string, string> { //Default constructor public LanguageMap() { } //Construct a language map using a default language public LanguageMap( string text ) { this.Add( "en-us", text ); } //Add a language map using a passed language code and string public LanguageMap( string languageCode, string text ) { this.Add( languageCode, text ); } } //Add some languages public void AddSomeLanguages(){ var map = new LanguageMap(); map.Add( "Bachelor of Science in Computer Science" ); //Using default english constructor map.Add( "fr", "Baccalauréat en sciences en informatique" ); }

Organization and Entity References

The Reference classes, EntityReference and OrganizationReference, were created to enable three scenarios:

  • The Uri to an Organization (or credential, etc.) in the registry
  • 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.
  • A reference to an organization that has not been published to the registry

Entity Reference

EntityReference - used for references to credentials, assessments, or learning opportunities.

Sample usage (C#)

//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; } } //if you know the CTID, then only specify CTID for a credential that this QA org accredits myQAOrgRequest.Accredits.Add( new EntityReference() { CTID = "ce-541da30c-15dd-4ead-881b-729796024b8f" } ); //if the CTID is not known, or if not sure a credential is in the registry, use a reference to an entity myQAOrgRequest.Approves.Add( new EntityReference() { Type = "ceterms:Certification", Name = "A certification that is approved by our ORG", Description = "A helpful but optional description of this certification", SubjectWebpage = "http://example.com/certification" } );

Organization Reference

An OrganizationReference has the same properties as EntityReference, plus the additional optional property of SocialMedia. The Organization reference is used in properties like ownedBy, offeredBy, accreditedBy, etc.

Sample usage (C#)

//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<string> SocialMedia { get; set; } } //if i know the CTID, then only specify CTID myOrg.AccreditedBy.Add( new OrganizationReference() { CTID = "ce-541da30c-15dd-4ead-881b-729796024b8f" } ); //if the CTID is not known, or if not sure a QA organization is in the registry, use a refer myOrg.Department.Add( new OrganizationReference() { Name = "A Quality Assurance Organization", SubjectWebpage = "http://example.com/qualityAssuranceIsUs", Type = OrganizationReference.QACredentialOrganization } );

Occupations, Industries and Instructional Programs

Occupations, Industries and Instructional Programs from known frameworks are stored in the credential registry as credential alignment objects (see: CredentialAlignmentObject). The commonly used properties are:

  • framework - URL for the framework
  • frameworkName - the name of the framework
  • codedNotation - for example a SOC code of 49-9081.00 (Wind Turbine Service Technicians)
  • targetNode - public URL to this code
  • targetNodeName - name of this code
  • targetNodeDescription - a description of this code

The equivalent class in the API is FrameworkItem.

Example for adding Occupations to a credential request

//Initialization var request = new Credential(); var fi = new FrameworkItem(); var occupationTypes = new List<FrameworkItem>(); var frameworkName = "The Occupational Information Network (O*NET)"; var framework = "https://www.onetonline.org"; //Get occupations var occupations = MyDataSource.GetOccupationData(); foreach ( var item in occupations.Items ) { fi = new FrameworkItem(); fi.FrameworkName = frameworkName; fi.Framework = framework; fi.CodedNotation = item.CodedNotation; fi.Name = item.Name; fi.Description = item.Description ?? ""; fi.TargetNode = "https://www.onetonline.org/link/summary/" + fi.CodedNotation; request.OccupationType.Add( fi ); } //Occupations, etc. that are not part of a formal framework. The only required property for a framework item is the name (or targetNodeName) request.OccupationType.Add( new FrameworkItem() { Name = "Cybersecurity Specialist" } ); //NOTE: See AlternativeOccupationType to allow for quickly adding a long list of occupations that are not part of a framework.

Alternative Framework Items

Feb. 22, 2019.

The API has helper properties for handling occupations, industries and instructional programs that are not part of a formal framework. The new properites are:

  • AlternativeIndustryType
  • AlternativeOccupationType
  • AlternativeInstructionalProgramType

Sample usage:

//Setup var cred = new Credential(); //Add some industries cred.AlternativeIndustryType.Add( "Cyber security" ); cred.AlternativeIndustryType.Add( "Some industry name not found in NAICS" ); //Add some occupations cred.AlternativeOccupationType.Add( "Cyber security analyst" ); cred.AlternativeIndustryType.Add( "Cyber Security Risk Manager" ); //using language map lists cred.AlternativeIndustryType_Map.Add( "en-us", new List<string> () { "Cyber security", "Analysts" } ); cred.AlternativeIndustryType_Map.Add( "fr", new List<string>() { "La cyber-sécurité", "Les analystes" } );

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.

Sample usage:

//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 usage var profile = new DurationProfile(); profile.Description = "A full time student will typically complete this certificate in 15 hours."; profile.ExactDuration = new DurationItem() { Hours = 15 };

Getting Started

To call the publish API, you will need to make an HTTP POST request to the API endpoint specific to the data type being published. For example, to publish a credential you would use:

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

NOTE: The remaining examples on this page will use URLs for the sandbox version of the credential registry.

With your request, include two things: First, you will need to pass your organization's API key (see Getting your API Key) as a request header using the format:

Authorization: ApiToken [YOUR API KEY]

Second, a JSON object with properties to publish. The provided JSON object will be specific to the type of data being published. The following sections will have examples of the properties for each data that may be published.

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

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

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. Refer to the Minimum Data Policy for the required properties for the Credential Organization and QA Credential Organization classes.

Publishing a Basic Record

Your system will need to output the data in JSON format.

Sample data sent by your system:

{ "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", "SocialMedia": [ "https://twitter.com/credengine", "https://www.facebook.com/credengine", "https://www.youtube.com/channel/UCyTpUktFYQNlLrLR4O_AcQA" ], "Email": "contact@myorganization.com", "AccreditedBy": [ "https://sandbox.credentialengineregistry.org/graph/ce-e8305dc9-46cb-46be-8320-9a794df9e252" ], "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:

Sample data returned from the format endpoint:

{ "@type": "ceterms:CredentialOrganization", "ceterms:name": { "en": "My Organization Name" }, "ceterms:description": { "en": "This is some text that describes my organization." }, "ceterms:subjectWebpage": "http://www.credreg.net", "ceterms:ctid": "ce-28935e07-76dc-4562-8c43-3ece101686be", "ceterms:socialMedia": [ "https://twitter.com/credengine", "https://www.facebook.com/credengine", "https://www.youtube.com/channel/UCyTpUktFYQNlLrLR4O_AcQA" ], "ceterms:email": "contact@myorganization.com", "ceterms:accreditedBy": [ "https://sandbox.credentialengineregistry.org/graph/ce-e8305dc9-46cb-46be-8320-9a794df9e252" ], "ceterms:agentType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Primarily Online", "ceterms:targetNode": "orgType:PrimarilyOnline" }, { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Vendor", "ceterms:targetNode": "orgType:Vendor" } ], "cetemrs: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:

Sample envelope returned from the Registry:

{ "envelope_community": "ce_registry", "envelope_id": "9ffb4f94-edd5-4239-9526-967c60c12f1d", "envelope_ceterms_ctid": "ce-28935e07-76dc-4562-8c43-3ece101686be", "envelope_ctdl_type": "ceterms:CredentialOrganization", "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": "https://credreg.net/ctdl/schema/context/json", "@id": "https://credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be", "@graph": { "@id": "https://credentialengineregistry.org/resources/ce-28935e07-76dc-4562-8c43-3ece101686be", "@type": "ceterms:CredentialOrganization", "ceterms:name": { "en": "My Organization Name" }, "ceterms:description": { "en": "This is some text that describes my organization." }, "ceterms:subjectWebpage": "http://www.credreg.net", "ceterms:ctid": "ce-28935e07-76dc-4562-8c43-3ece101686be", "ceterms:socialMedia": [ "https://twitter.com/credengine", "https://www.facebook.com/credengine", "https://www.youtube.com/channel/UCyTpUktFYQNlLrLR4O_AcQA" ], "ceterms:email": "contact@myorganization.com", "ceterms:accreditedBy": [ "https://sandbox.credentialengineregistry.org/graph/ce-e8305dc9-46cb-46be-8320-9a794df9e252" ], "ceterms:agentType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Primarily Online", "ceterms:targetNode": "orgType:PrimarilyOnline" }, { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Vendor", "ceterms:targetNode": "orgType:Vendor" } ], "cetemrs: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 recommended properties for the organization classes. For example:

Sample data sent by your system:

{ "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", "SocialMedia": [ "https://twitter.com/credengine", "https://www.facebook.com/credengine", "https://www.youtube.com/channel/UCyTpUktFYQNlLrLR4O_AcQA" ], "Keyword": [ "Credentials", "Technical Information", "Credential Registry" ], "Email": "contact@myorganization.com", "Image": "http://myorganization.com/image/logo.png", "AccreditedBy": [ "https://sandbox.credentialengineregistry.org/graph/ce-e8305dc9-46cb-46be-8320-9a794df9e252" ], "AgentType": [ "orgType:PrimarilyOnline", "orgType:Vendor" ], "AgentSectorType": [ "agentSector:PrivateForProfit" ], "ServiceType": [ "serviceType:ApproveService", "serviceType:RenewService" ] }

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:

Sample data returned from the format endpoint:

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

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:

Sample envelope returned from the Registry:

{ "envelope_community": "ce_registry", "envelope_id": "db2d613b-0436-4cb9-86ef-355279acc19d", "envelope_ceterms_ctid": "ce-28935e07-76dc-4562-8c43-3ece101686be", "envelope_ctdl_type": "ceterms:CredentialOrganization", "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": "https://credreg.net/ctdl/schema/context/json", "@id": "https://credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be", "@graph": { "@id": "https://credentialengineregistry.org/resources/ce-28935e07-76dc-4562-8c43-3ece101686be", "@type": "ceterms:CredentialOrganization", "ceterms:name": { "en": "My Organization Name" }, "ceterms:description": { "en": "This is some text that describes my organization." }, "ceterms:subjectWebpage": "http://www.credreg.net", "ceterms:ctid": "ce-28935e07-76dc-4562-8c43-3ece101686be", "ceterms:socialMedia": [ "https://twitter.com/credengine", "https://www.facebook.com/credengine", "https://www.youtube.com/channel/UCyTpUktFYQNlLrLR4O_AcQA" ], "ceterms:keyword": { "en": [ "Credentials", "Technical Information", "Credential Registry" ] }, "ceterms:email": "contact@myorganization.com", "ceterms:image": "http://myorganization.com/image/logo.png", "ceterms:accreditedBy": [ "https://sandbox.credentialengineregistry.org/graph/ce-e8305dc9-46cb-46be-8320-9a794df9e252" ], "ceterms:agentType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Primarily Online", "ceterms:targetNode": "orgType:PrimarilyOnline" }, { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Vendor", "ceterms:targetNode": "orgType:Vendor" } ], "cetemrs:agentSectorType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Private For-Profit", "ceterms:targetNode": "agentSector:PrivateForProfit" } ], "ceterms:serviceType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Approve Service", "ceterms:targetNode": "serviceType:ApproveService" }, { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Renew Service", "ceterms:targetNode": "serviceType:RenewService" } ] } } }

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:

Sample organization wrapper:

{ //Your organization's data "Organization": { "Name": "My organization name", "Description": "My organization description" //Other properties... }, //This is where you put the CTID of the organization that owns the data. //Usually, this will be your own organization's CTID. However, third-party publishers will use the CTID of the organization on behalf of which they are publishing. "PublishForOrganizationIdentifier": "ce-9f60a9b3-0001-4ab4-b2d1-feee7bd0e5d1" }

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

Sample organization publishing code (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(); //Call a method to retrieve your organization data 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", //Note namespace prefixes like agentSector are optional, the API will validate properly AgentSectorType = "agentSector:PrivateNonProfit", Email = new List<string> () { "info@credreg.net" } }; //Use organization reference to add a department for the organization myOrg.Department.Add( new OrganizationReference() { Name = "A Department for my organization", Description = "A test Department - third party format", SubjectWebpage = "http://example.com?t=testDepartment", Type = OrganizationReference.CredentialOrganization } ); //If we know the CTID, then only specify CTID myOrg.AccreditedBy.Add( new OrganizationReference() { CTID = "ce-541da30c-15dd-4ead-881b-729796024b8f" } ); //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> Address { get; set; } public List<string> Email { get; set; } public List<string> SocialMedia { get; set; } public List<string> Keyword { get; set; } public List<string> ServiceType { get; set; } public string AgentSectorType { get; set; } public List<OrganizationReference> ParentOrganization { get; set; } public List<OrganizationReference> Department { get; set; } public List<OrganizationReference> AccreditedBy { get; set; } public List<OrganizationReference> ApprovedBy { get; set; } public List<OrganizationReference> RecognizedBy { get; set; } public List<OrganizationReference> RegulatedBy { get; set; } } //See the Organization Reference section public class OrganizationReference { public string Id { get; set; } public string CTID { get; set; } public virtual string Type { get; set; } public string Name { get; set; } public string SubjectWebpage { get; set; } public string Description { get; set; } public List<string> SocialMedia { 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 types (ceterms:Badge, ceterms:OpenBadge, and ceterms:DigitalBadge) are 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 the required properties. Refer to the Minimum Data Policy for the required properties for the Credential classes.

Publishing a Basic Record

Your system will need to output the data in JSON format.

Sample data sent by your system:

{ "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", "OwnedBy": [ { "CTID": "ce-28935e07-76dc-4562-8c43-3ece101686be" } ], "CredentialStatusType": "credentialStat:Active", "InLanguage": [ "en" ] }

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:

Sample data returned from the format endpoint:

{ "@type": "ceterms:Certificate", "ceterms:name": { "en": "My Credential Name" }, "ceterms:description": { "en": "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:ownedBy": [ { "ceterms:ctid": "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" } ], "ceterms:credentialStatusType": { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Active", "ceterms:targetNode": "credentialStat:Active" }, "ceterms:inLanguage": [ "en" ] }

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:

Sample envelope returned from the Registry:

{ "envelope_community": "ce_registry", "envelope_id": "fbab9ab3-e0b0-479b-bc9c-d9b603bc734d", "envelope_ceterms_ctid": "ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71", "envelope_ctdl_type": "ceterms:Certificate", "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": "https://credreg.net/ctdl/schema/context/json", "@id": "https://credentialengineregistry.org/graph/ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71", "@graph": { "@id": "https://credentialengineregistry.org/resources/ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71", "@type": "ceterms:Certificate", "ceterms:name": { "en": "My Credential Name" }, "ceterms:description": { "en": "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:ownedBy": [ { "ceterms:ctid": "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" } ], "ceterms:credentialStatusType": { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Active", "ceterms:targetNode": "credentialStat:Active" }, "ceterms:inLanguage": [ "en" ] } } }

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:

Sample data sent by your system:

{ "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", "OwnedBy": [ { "CTID": "ce-28935e07-76dc-4562-8c43-3ece101686be" } ], "OfferedBy": [ { "CTID": "https://sandbox.credentialengineregistry.org/graph/ce-e8305dc9-46cb-46be-8320-9a794df9e252" } ], "CredentialStatusType": "credentialStat:Active", "InLanguage": [ "en" ], "Keyword": [ "Credentials", "Technical Information", "Credential Registry" ], "Naics": [ "3339222", "333923", "333924" ], "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" ], "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:AssociateDegreeLevel", "audLevel:IntermediateLevel", "audLevel:PostSecondaryLevel" ], "TargetCredential": [ "ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71" ], "TargetAssessment": [ "ce-9db20b92-0787-43b2-83e1-b967d73d5df9", "ce-7d838a41-88e1-4011-885b-7318ef31c3dd" ], "TargetCompetency": [ "ce-08c3dc49-a122-1233-a06c-b5e054f62dcc", "ce-2210c363-bd33-5443-af79-af8d95615154" ] } ] }

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:

Sample data returned from the format endpoint:

{ "@type": "ceterms:Certificate", "ceterms:name": { "en": "My Credential Name" }, "ceterms:description": { "en": "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:ownedBy": [ { "ceterms:ctid": "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" } ], "ceterms:offeredBy": [ { "ceterms:ctid": "https://sandbox.credentialengineregistry.org/graph/ce-e8305dc9-46cb-46be-8320-9a794df9e252" } ], "ceterms:credentialStatusType": { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Active", "ceterms:targetNode": "credentialStat:Active" }, "ceterms:inLanguage": [ "en" ], "ceterms:keyword": { "en": [ "Credentials", "Technical Information", "Credential Registry" ] }, "ceterms:naics": [ "3339222", "333923", "333924" ], "ceterms:dateEffective": "2016-07-18", "ceterms:estimatedDuration": [ { "ceterms:description": { "en": "This is about how long it takes to earn this credential." }, "ceterms:minimumDuration": "P1Y6M15D", "ceterms:maximumDuration": "P2Y8M" } ], "ceterms:estimatedCost": [ { "ceterms:name": { "en": "General Tuition for this Credential" }, "ceterms:description": { "en": "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" }, { "ceterms:name": { "en": "Tuition Fees for Veterans" }, "ceterms:description": { "en": "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:audienceType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Current Military", "ceterms:targetNode": "audience:CurrentMilitary" }, { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Former Military", "ceterms:targetNode": "audience:FormerMilitary" } ] } ], "ceterms:requires": [ { "ceterms:name": { "en": "Simple Requirements" }, "ceterms:description": { "en": "A Condition Profile has many properties, but sometimes you only need a few of them." }, "ceterms:condition": { "en": [ "Bullet point", "Another list item", "a third list item" ] } }, { "ceterms:name": { "en": "Deeper Requirements" }, "ceterms:description": { "en": "These conditions only apply to a specific combination of audience type and level." }, "ceterms:audienceType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Former Student", "ceterms:targetNode": "audience:FormerStudent" }, { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Current Student", "ceterms:targetNode": "audience:CurrentStudent" } ], "ceterms:audienceLevelType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Associate Degree Level", "ceterms:targetNode": "audLevel:AssociateDegreeLevel" }, { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Intermediate Level", "ceterms:targetNode": "audLevel:IntermediateLevel" }, { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "PostSecondary Level", "ceterms:targetNode": "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/ce-08c3dc49-a122-1233-a06c-b5e054f62dcc", "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154" ] } ] }

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:

Sample envelope returned from the Registry:

{ "envelope_community": "ce_registry", "envelope_id": "00c8bc2d-8982-4900-aedc-65e886c11670", "envelope_ceterms_ctid": "ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71", "envelope_ctdl_type": "ceterms:Certificate", "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": "https://credreg.net/ctdl/schema/context/json", "@id": "https://credentialengineregistry.org/graph/ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71", "@graph": { "@id": "https://credentialengineregistry.org/resources/ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71", "@type": "ceterms:Certificate", "ceterms:name": { "en": "My Credential Name" }, "ceterms:description": { "en": "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:ownedBy": [ { "ceterms:ctid": "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" } ], "ceterms:offeredBy": [ { "ceterms:ctid": "https://sandbox.credentialengineregistry.org/graph/ce-e8305dc9-46cb-46be-8320-9a794df9e252" } ], "ceterms:credentialStatusType": { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Active", "ceterms:targetNode": "credentialStat:Active" }, "ceterms:inLanguage": [ "en" ], "ceterms:keyword": { "en": [ "Credentials", "Technical Information", "Credential Registry" ] }, "ceterms:naics": [ "3339222", "333923", "333924" ], "ceterms:dateEffective": "2016-07-18", "ceterms:estimatedDuration": [ { "ceterms:description": { "en": "This is about how long it takes to earn this credential." }, "ceterms:minimumDuration": "P1Y6M15D", "ceterms:maximumDuration": "P2Y8M" } ], "ceterms:estimatedCost": [ { "ceterms:name": { "en": "General Tuition for this Credential" }, "ceterms:description": { "en": "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" }, { "ceterms:name": { "en": "Tuition Fees for Veterans" }, "ceterms:description": { "en": "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:audienceType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Current Military", "ceterms:targetNode": "audience:CurrentMilitary" }, { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Former Military", "ceterms:targetNode": "audience:FormerMilitary" } ] } ], "ceterms:requires": [ { "ceterms:name": { "en": "Simple Requirements" }, "ceterms:description": { "en": "A Condition Profile has many properties, but sometimes you only need a few of them." }, "ceterms:condition": { "en": [ "Bullet point", "Another list item", "a third list item" ] } }, { "ceterms:name": { "en": "Deeper Requirements" }, "ceterms:description": { "en": "These conditions only apply to a specific combination of audience type and level." }, "ceterms:audienceType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Former Student", "ceterms:targetNode": "audience:FormerStudent" }, { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Current Student", "ceterms:targetNode": "audience:CurrentStudent" } ], "ceterms:audienceLevelType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Associate Degree Level", "ceterms:targetNode": "audLevel:AssociateDegreeLevel" }, { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Intermediate Level", "ceterms:targetNode": "audLevel:IntermediateLevel" }, { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "PostSecondary Level", "ceterms:targetNode": "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/ce-08c3dc49-a122-1233-a06c-b5e054f62dcc", "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154" ] } ] } } }

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 an Credential property:

Sample credential wrapper:

{ //Your credential's data "Credential": { "Name": "My credential name", "Description": "My credential description" //Other properties... }, //This is where you put the CTID of the organization that owns the data. //Usually, this will be your own organization's CTID. However, third-party publishers will use the CTID of the organization on behalf of which they are publishing. "PublishForOrganizationIdentifier": "ce-5e12dad5-bb75-436e-b50e-b344eff30644" }

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

Sample credential publishing code (C#)

using System.Collections.Generic; using System.Text; using System.Net.Http; using System.Net.Http.Headers; using Newtonsoft.Json; namespace Publish_Test { public class Publisher { public string PublishSimpleRecord() { //Holds the result of the publish action var result = ""; //Assign 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", InLanguage = new List () { "en-US" }, Keyword = new List<string>() { "Credentials", "Technical Information", "Credential Registry" }, Naics = 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" } } } }; //Typically the ownedBy is the same as the CTID for the data owner myCred.OwnedBy.Add( new OrganizationReference() { CTID = "ce-541da30c-15dd-4ead-881b-729796024b8f" } ); //CTID for Higher learning commission. myCred.AccreditedBy.Add( new OrganizationReference() { CTID = "ce-541da30c-15dd-4ead-881b-729796024b8f" } ); //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 List<string> InLanguage { get; set; } public List<OrganizationReference> OwnedBy { get; set; } public List<OrganizationReference> AccreditedBy { 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; } //Other 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. Refer to the Minimum Data Policy for the required properties for the Assessment class.

Publishing a Basic Record

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

Sample data sent by your system:

{ "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", "OwnedBy": [ { "CTID": "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" } ], "InLanguage": [ "en" ], "AvailableOnlineAt": "http://www.my-assessment.com/take/123", "AvailabilityListing": [ "http://www.credreg.net/assessment/1234/locations" ], "DeliveryType": [ "deliveryType:OnlineOnly" ] }

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:

Sample data returned from the format endpoint:

{ "@type": "ceterms:AssessmentProfile", "ceterms:name": { "en": "My Assessment Name" }, "ceterms:description": { "en": "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:ownedBy": [ { "ceterms:ctid": "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" } ], "ceterms:inLanguage": [ "en" ], "ceterms:availableOnlineAt": "http://www.my-assessment.com/take/123", "ceterms:availabilityListing": [ "http://www.credreg.net/assessment/1234/locations" ], "ceterms:deliveryType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Online Only", "ceterms:targetNode": "deliveryType:OnlineOnly" } ] }

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:

Sample envelope returned from the Registry:

{ "envelope_community": "ce_registry", "envelope_id": "c75eba3c-04fd-463b-9fad-944e912bef28", "envelope_ceterms_ctid": "ce-9db20b92-0787-43b2-83e1-b967d73d5df9", "envelope_ctdl_type": "ceterms:AssessmentProfile", "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": "https://credreg.net/ctdl/schema/context/json", "@id": "https://credentialengineregistry.org/graph/ce-9db20b92-0787-43b2-83e1-b967d73d5df9", "@graph": { "@id": "https://credentialengineregistry.org/resources/ce-9db20b92-0787-43b2-83e1-b967d73d5df9", "@type": "ceterms:AssessmentProfile", "ceterms:name": { "en": "My Assessment Name" }, "ceterms:description": { "en": "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:ownedBy": [ { "ceterms:ctid": "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" } ], "ceterms:inLanguage": [ "en" ], "ceterms:availableOnlineAt": "http://www.my-assessment.com/take/123", "ceterms:availabilityListing": [ "http://www.credreg.net/assessment/1234/locations" ], "ceterms:deliveryType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Online Only", "ceterms:targetNode": "deliveryType:OnlineOnly" } ] } } }

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:

Sample data sent by your system:

{ "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", "OwnedBy": [ { "CTID": "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" } ], "OfferedBy": [ { "CTID": "https://sandbox.credentialengineregistry.org/graph/ce-e8305dc9-46cb-46be-8320-9a794df9e252" } ], "InLanguage": [ "en" ], "AvailableOnlineAt": "http://www.my-assessment.com/take/123", "AvailabilityListing": [ "http://www.credreg.net/assessment/1234/locations" ], "DateEffective": "2016-07-18", "EstimatedDuration": [ { "Description": "This is about how long it takes to finish this assessment.", "MinimumDuration": "PT1H", "MaximumDuration": "PT3H" } ], "Assesses": [ "ce-08c3dc49-a122-1233-a06c-b5e054f62dcc", "ce-2210c363-bd33-5443-af79-af8d95615154" ], "DeliveryType": [ "deliveryType:OnlineOnly" ] }

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:

Sample data returned from the format endpoint:

{ "@type": "ceterms:AssessmentProfile", "ceterms:name": { "en": "My Assessment Name" }, "ceterms:description": { "en": "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:ownedBy": [ { "ceterms:ctid": "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" } ], "ceterms:offeredBy": [ { "ceterms:ctid": "https://sandbox.credentialengineregistry.org/graph/ce-e8305dc9-46cb-46be-8320-9a794df9e252" } ], "ceterms:inLanguage": [ "en" ], "ceterms:availableOnlineAt": "http://www.my-assessment.com/take/123", "ceterms:availabilityListing": [ "http://www.credreg.net/assessment/1234/locations" ], "ceterms:dateEffective": "2016-07-18", "ceterms:estimatedDuration": [ { "ceterms:description": { "en": "This is about how long it takes to finish this assessment." }, "ceterms:minimumDuration": "PT1H", "ceterms:maximumDuration": "PT3H" } ], "ceterms:assesses": [ "https://sandbox.credentialengineregistry.org/graph/ce-08c3dc49-a122-1233-a06c-b5e054f62dcc", "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154" ], "ceterms:deliveryType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Online Only", "ceterms:targetNode": "deliveryType:OnlineOnly" } ] }

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:

Sample envelope returned from the Registry:

{ "envelope_community": "ce_registry", "envelope_id": "8f35ba56-a9d2-46a1-b1f3-46965a6d0c39", "envelope_ceterms_ctid": "ce-9db20b92-0787-43b2-83e1-b967d73d5df9", "envelope_ctdl_type": "ceterms:AssessmentProfile", "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": "https://credreg.net/ctdl/schema/context/json", "@id": "https://credentialengineregistry.org/graph/ce-9db20b92-0787-43b2-83e1-b967d73d5df9", "@graph": { "@id": "https://credentialengineregistry.org/resources/ce-9db20b92-0787-43b2-83e1-b967d73d5df9", "@type": "ceterms:AssessmentProfile", "ceterms:name": { "en": "My Assessment Name" }, "ceterms:description": { "en": "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:ownedBy": [ { "ceterms:ctid": "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" } ], "ceterms:offeredBy": [ { "ceterms:ctid": "https://sandbox.credentialengineregistry.org/graph/ce-e8305dc9-46cb-46be-8320-9a794df9e252" } ], "ceterms:inLanguage": [ "en" ], "ceterms:availableOnlineAt": "http://www.my-assessment.com/take/123", "ceterms:availabilityListing": [ "http://www.credreg.net/assessment/1234/locations" ], "ceterms:dateEffective": "2016-07-18", "ceterms:estimatedDuration": [ { "ceterms:description": { "en": "This is about how long it takes to finish this assessment." }, "ceterms:minimumDuration": "PT1H", "ceterms:maximumDuration": "PT3H" } ], "ceterms:assesses": [ "https://sandbox.credentialengineregistry.org/graph/ce-08c3dc49-a122-1233-a06c-b5e054f62dcc", "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154" ], "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:

Sample assessment wrapper:

{ //Your assessment's data "Assessment": { "Name": "My assessment name", "Description": "My assessment description" //Other properties... }, //This is where you put the CTID of the organization that owns the data. //Usually, this will be your own organization's CTID. However, third-party publishers will use the CTID of the organization on behalf of which they are publishing. "PublishForOrganizationIdentifier": "ce-104f85c7-0514-4a6f-b3d6-ffea354664e7" }

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

Sample assessment publishing code (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", InLanguage = new List<string>() { "en" }, 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" } } } }; //typically the ownedBy is the same as the CTID for the data owner myData.OwnedBy.Add( new OrganizationReference() { CTID = "ce-541da30c-15dd-4ead-881b-729796024b8f" } ); //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> InLanguage { 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; } //Other 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 a learning opportunity. Refer to the Minimum Data Policy for the required properties for the Learning Opportunity class.

Publishing a Basic Record

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

Sample data sent by your system:

{ "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", "OwnedBy": [ { "CTID": "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" } ], "InLanguage": [ "en" ], "AvailableOnlineAt": "http://www.my-learning-opportunity.com/take/123", "AvailabilityListing": [ "http://www.credreg.net/learningopportunity/1234/locations" ], "DeliveryType": [ "deliveryType:OnlineOnly" ] }

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:

Sample data returned from the format endpoint:

{ "@type": "ceterms:LearningOpportunityProfile", "ceterms:name": { "en": "My Learning Opportunity Name" }, "ceterms:description": { "en": "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:ownedBy": [ { "ceterms:ctid": "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" } ], "ceterms:inLanguage": [ "en" ], "ceterms:availableOnlineAt": "http://www.my-learning-opportunity.com/take/123", "ceterms:availabilityListing": [ "http://www.credreg.net/learningopportunity/1234/locations" ], "ceterms:deliveryType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Online Only", "ceterms:targetNode": "deliveryType:OnlineOnly" } ] }

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:

Sample envelope returned from the Registry:

{ "envelope_community": "ce_registry", "envelope_id": "b60fb855-4d57-4dbe-b3b3-6647115c5f55", "envelope_ceterms_ctid": "ce-08c3dc49-a133-4e7f-a06c-b5e054f62dcc", "envelope_ctdl_type": "ceterms:LearningOpportunityProfile", "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": "https://credreg.net/ctdl/schema/context/json", "@id": "https://credentialengineregistry.org/graph/ce-08c3dc49-a133-4e7f-a06c-b5e054f62dcc", "@graph": { "@id": "https://credentialengineregistry.org/resources/ce-08c3dc49-a133-4e7f-a06c-b5e054f62dcc", "@type": "ceterms:LearningOpportunityProfile", "ceterms:name": { "en": "My Learning Opportunity Name" }, "ceterms:description": { "en": "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:ownedBy": [ { "ceterms:ctid": "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" } ], "ceterms:inLanguage": [ "en" ], "ceterms:availableOnlineAt": "http://www.my-learning-opportunity.com/take/123", "ceterms:availabilityListing": [ "http://www.credreg.net/learningopportunity/1234/locations" ], "ceterms:deliveryType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Online Only", "ceterms:targetNode": "deliveryType:OnlineOnly" } ] } } }

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:

Sample data sent by your system:

{ "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", "OwnedBy": [ { "CTID": "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" } ], "OfferedBy": [ { "CTID": "https://sandbox.credentialengineregistry.org/graph/ce-e8305dc9-46cb-46be-8320-9a794df9e252" } ], "InLanguage": [ "en" ], "AvailableOnlineAt": "http://www.my-learning-opportunity.com/take/123", "AvailabilityListing": [ "http://www.credreg.net/learningopportunity/1234/locations" ], "DateEffective": "2016-07-18", "EstimatedDuration": [ { "Description": "This is about how long it takes to finish this learning opportunity.", "MinimumDuration": "PT1H", "MaximumDuration": "PT3H" } ], "Teaches": [ "ce-08c3dc49-a122-1233-a06c-b5e054f62dcc", "ce-2210c363-bd33-5443-af79-af8d95615154" ], "DeliveryType": [ "deliveryType:OnlineOnly" ] }

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:

Sample data returned from the format endpoint:

{ "@type": "ceterms:LearningOpportunityProfile", "ceterms:name": { "en": "My Learning Opportunity Name" }, "ceterms:description": { "en": "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:ownedBy": [ { "ceterms:ctid": "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" } ], "ceterms:offeredBy": [ { "ceterms:ctid": "https://sandbox.credentialengineregistry.org/graph/ce-e8305dc9-46cb-46be-8320-9a794df9e252" } ], "ceterms:inLanguage": [ "en" ], "ceterms:availableOnlineAt": "http://www.my-learning-opportunity.com/take/123", "ceterms:availabilityListing": [ "http://www.credreg.net/learningopportunity/1234/locations" ], "ceterms:dateEffective": "2016-07-18", "ceterms:estimatedDuration": [ { "ceterms:description": { "en": "This is about how long it takes to finish this learning opportunity." }, "ceterms:minimumDuration": "PT1H", "ceterms:maximumDuration": "PT3H" } ], "ceterms:teaches": [ "https://sandbox.credentialengineregistry.org/graph/ce-08c3dc49-a122-1233-a06c-b5e054f62dcc", "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154" ], "ceterms:deliveryType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Online Only", "ceterms:targetNode": "deliveryType:OnlineOnly" } ] }

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:

Sample envelope returned from the Registry:

{ "envelope_community": "ce_registry", "envelope_id": "333b634e-cd6c-45dd-802b-61f51dcb0358", "envelope_ceterms_ctid": "ce-08c3dc49-a133-4e7f-a06c-b5e054f62dcc", "envelope_ctdl_type": "ceterms:LearningOpportunityProfile", "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": "https://credreg.net/ctdl/schema/context/json", "@id": "https://credentialengineregistry.org/graph/ce-08c3dc49-a133-4e7f-a06c-b5e054f62dcc", "@graph": { "@id": "https://credentialengineregistry.org/resources/ce-08c3dc49-a133-4e7f-a06c-b5e054f62dcc", "@type": "ceterms:LearningOpportunityProfile", "ceterms:name": { "en": "My Learning Opportunity Name" }, "ceterms:description": { "en": "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:ownedBy": [ { "ceterms:ctid": "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" } ], "ceterms:offeredBy": [ { "ceterms:ctid": "https://sandbox.credentialengineregistry.org/graph/ce-e8305dc9-46cb-46be-8320-9a794df9e252" } ], "ceterms:inLanguage": [ "en" ], "ceterms:availableOnlineAt": "http://www.my-learning-opportunity.com/take/123", "ceterms:availabilityListing": [ "http://www.credreg.net/learningopportunity/1234/locations" ], "ceterms:dateEffective": "2016-07-18", "ceterms:estimatedDuration": [ { "ceterms:description": { "en": "This is about how long it takes to finish this learning opportunity." }, "ceterms:minimumDuration": "PT1H", "ceterms:maximumDuration": "PT3H" } ], "ceterms:teaches": [ "https://sandbox.credentialengineregistry.org/graph/ce-08c3dc49-a122-1233-a06c-b5e054f62dcc", "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154" ], "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 an LearningOpportunity property:

Sample learning opportunity wrapper:

{ //Your learning opportunity's data "LearningOpportunity": { "Name": "My learning opportunity name", "Description": "My learning opportunity description" //Other properties... }, //This is where you put the CTID of the organization that owns the data. //Usually, this will be your own organization's CTID. However, third-party publishers will use the CTID of the organization on behalf of which they are publishing. "PublishForOrganizationIdentifier": "ce-1f35f947-f771-476a-931b-80df82c85228" }

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

Sample learning opportunity publishing code (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", InLanguage = new List<string>() { "en" }, 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" } } } }; //typically the ownedBy is the same as the CTID for the data owner myData.OwnedBy.Add( new OrganizationReference() { CTID = "ce-541da30c-15dd-4ead-881b-729796024b8f" } ); //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> InLanguage { 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; } //Other 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. Refer to the Minimum Data Policy for the required properties for this class.

Publishing a Basic Record

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

Sample data sent by your system:

{ "Type": "ceterms:CostManifest", "Description": "This is some text that describes my cost manifest.", "CostDetails": "http://example.com?t=costDetails", "CTID": "ce-2210c363-bd33-5443-af79-af8d95615154", "CostManifestOf": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ] }

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:

Sample data returned from the format endpoint:

{ "@type": "ceterms:CostManifest", "ceterms:description": { "en": "This is some text that describes my cost manifest." }, "ceterms:costDetails": "http://example.com?t=costDetails", "ceterms:ctid": "ce-2210c363-bd33-5443-af79-af8d95615154", "ceterms:costManifestOf": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ] }

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:

Sample envelope returned from the Registry:

{ "envelope_community": "ce_registry", "envelope_id": "b95a35e1-938d-4f79-9813-cf5c29e1608e", "envelope_ceterms_ctid": "ce-2210c363-bd33-5443-af79-af8d95615154", "envelope_ctdl_type": "ceterms:CostManifest", "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": "https://credreg.net/ctdl/schema/context/json", "@id": "https://credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "@graph": { "@id": "https://credentialengineregistry.org/resources/ce-2210c363-bd33-5443-af79-af8d95615154", "@type": "ceterms:CostManifest", "ceterms:description": { "en": "This is some text that describes my cost manifest." }, "ceterms:costDetails": "http://example.com?t=costDetails", "ceterms:ctid": "ce-2210c363-bd33-5443-af79-af8d95615154", "ceterms:costManifestOf": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ] } } }

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:

Sample data sent by your system:

{ "Type": "ceterms:CostManifest", "Description": "This is some text that describes my cost manifest.", "CostDetails": "http://example.com?t=costDetails", "CTID": "ce-2210c363-bd33-5443-af79-af8d95615154", "CostManifestOf": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "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" ], "AudienceType": [ "audience:CurrentMilitary", "audience:FormerMilitary" ] } ] }

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:

Sample data returned from the format endpoint:

{ "@type": "ceterms:CostManifest", "ceterms:description": { "en": "This is some text that describes my cost manifest." }, "ceterms:costDetails": "http://example.com?t=costDetails", "ceterms:ctid": "ce-2210c363-bd33-5443-af79-af8d95615154", "ceterms:costManifestOf": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "ceterms:estimatedCost": [ { "ceterms:name": { "en": "General Tuition for this Credential" }, "ceterms:description": { "en": "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" }, { "ceterms:name": { "en": "Tuition Fees for Veterans" }, "ceterms:description": { "en": "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:audienceType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Current Military", "ceterms:targetNode": "audience:CurrentMilitary" }, { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Former Military", "ceterms:targetNode": "audience:FormerMilitary" } ] } ] }

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:

Sample envelope returned from the Registry:

{ "envelope_community": "ce_registry", "envelope_id": "234ab3cf-2b36-421d-935a-bf5603a93c92", "envelope_ceterms_ctid": "ce-2210c363-bd33-5443-af79-af8d95615154", "envelope_ctdl_type": "ceterms:CostManifest", "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": "https://credreg.net/ctdl/schema/context/json", "@id": "https://credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "@graph": { "@id": "https://credentialengineregistry.org/resources/ce-2210c363-bd33-5443-af79-af8d95615154", "@type": "ceterms:CostManifest", "ceterms:description": { "en": "This is some text that describes my cost manifest." }, "ceterms:costDetails": "http://example.com?t=costDetails", "ceterms:ctid": "ce-2210c363-bd33-5443-af79-af8d95615154", "ceterms:costManifestOf": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "ceterms:estimatedCost": [ { "ceterms:name": { "en": "General Tuition for this Credential" }, "ceterms:description": { "en": "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" }, { "ceterms:name": { "en": "Tuition Fees for Veterans" }, "ceterms:description": { "en": "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:audienceType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Current Military", "ceterms:targetNode": "audience:CurrentMilitary" }, { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Former Military", "ceterms:targetNode": "audience:FormerMilitary" } ] } ] } } }

Sample

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

Sample cost manifest wrapper:

{ //Your cost manifest's data "Organization": { "Name": "My cost manifest name", "Description": "My cost manifest description" //Other properties... }, //This is where you put the CTID of the organization that owns the data. //Usually, this will be your own organization's CTID. However, third-party publishers will use the CTID of the organization on behalf of which they are publishing. "PublishForOrganizationIdentifier": "ce-58976f18-9608-4d34-9421-8dff2805f1c3" }

Below is some example code to publish a simple cost manifest object:

Sample cost manifest publishing code (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; } //Other 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. Refer to the Minimum Data Policy for the required properties for this class.

Publishing a Basic Record

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

Sample data sent by your system:

{ "Type": "ceterms:ConditionManifest", "Description": "This is some text that describes my condition manifest.", "SubjectWebpage": "http://example.com?t=conditionDetails", "CTID": "ce-2210c363-bd33-5443-af79-af8d95615154", "CostManifestOf": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "EntryCondition": [ { "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" ] } ] }

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:

Sample data returned from the format endpoint:

{ "@type": "ceterms:ConditionManifest", "ceterms:description": { "en": "This is some text that describes my condition manifest." }, "ceterms:subjectWebpage": "http://example.com?t=conditionDetails", "ceterms:ctid": "ce-2210c363-bd33-5443-af79-af8d95615154", "ceterms:costManifestOf": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "ceterms:entryCondition": [ { "ceterms:name": { "en": "Simple Requirements" }, "ceterms:description": { "en": "A Condition Profile has many properties, but sometimes you only need a few of them." }, "ceterms:condition": { "en": [ "Bullet point", "Another list item", "a third list item" ] } } ] }

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:

Sample envelope returned from the Registry:

{ "envelope_community": "ce_registry", "envelope_id": "1610cf57-6965-4e89-bdb4-3ba8ee68fcdf", "envelope_ceterms_ctid": "ce-2210c363-bd33-5443-af79-af8d95615154", "envelope_ctdl_type": "ceterms:ConditionManifest", "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": "https://credreg.net/ctdl/schema/context/json", "@id": "https://credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "@graph": { "@id": "https://credentialengineregistry.org/resources/ce-2210c363-bd33-5443-af79-af8d95615154", "@type": "ceterms:ConditionManifest", "ceterms:description": { "en": "This is some text that describes my condition manifest." }, "ceterms:subjectWebpage": "http://example.com?t=conditionDetails", "ceterms:ctid": "ce-2210c363-bd33-5443-af79-af8d95615154", "ceterms:costManifestOf": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "ceterms:entryCondition": [ { "ceterms:name": { "en": "Simple Requirements" }, "ceterms:description": { "en": "A Condition Profile has many properties, but sometimes you only need a few of them." }, "ceterms:condition": { "en": [ "Bullet point", "Another list item", "a third list item" ] } } ] } } }

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:

Sample data sent by your system:

{ "Type": "ceterms:ConditionManifest", "Description": "This is some text that describes my condition manifest.", "SubjectWebpage": "http://example.com?t=conditionDetails", "CTID": "ce-2210c363-bd33-5443-af79-af8d95615154", "CostManifestOf": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "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:AssociateDegreeLevel", "audLevel:IntermediateLevel", "audLevel:PostSecondaryLevel" ], "TargetCredential": [ "ce-c5abf83d-6ab4-4711-80ad-68b3a560fb71" ], "TargetAssessment": [ "ce-9db20b92-0787-43b2-83e1-b967d73d5df9", "ce-7d838a41-88e1-4011-885b-7318ef31c3dd" ], "TargetCompetency": [ "ce-08c3dc49-a122-1233-a06c-b5e054f62dcc", "ce-2210c363-bd33-5443-af79-af8d95615154" ] } ], "EntryCondition": [ { "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" ] } ] }

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:

Sample data returned from the format endpoint:

{ "@type": "ceterms:ConditionManifest", "ceterms:description": { "en": "This is some text that describes my condition manifest." }, "ceterms:subjectWebpage": "http://example.com?t=conditionDetails", "ceterms:ctid": "ce-2210c363-bd33-5443-af79-af8d95615154", "ceterms:costManifestOf": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "ceterms:requires": [ { "ceterms:name": { "en": "Deeper Requirements" }, "ceterms:description": { "en": "These conditions only apply to a specific combination of audience type and level." }, "ceterms:audienceType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Former Student", "ceterms:targetNode": "audience:FormerStudent" }, { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Current Student", "ceterms:targetNode": "audience:CurrentStudent" } ], "ceterms:audienceLevelType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Associate Degree Level", "ceterms:targetNode": "audLevel:AssociateDegreeLevel" }, { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Intermediate Level", "ceterms:targetNode": "audLevel:IntermediateLevel" }, { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "PostSecondary Level", "ceterms:targetNode": "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/ce-08c3dc49-a122-1233-a06c-b5e054f62dcc", "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154" ] } ], "ceterms:entryCondition": [ { "ceterms:name": { "en": "Simple Requirements" }, "ceterms:description": { "en": "A Condition Profile has many properties, but sometimes you only need a few of them." }, "ceterms:condition": { "en": [ "Bullet point", "Another list item", "a third list item" ] } } ] }

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:

Sample envelope returned from the Registry:

{ "envelope_community": "ce_registry", "envelope_id": "17bf36b2-bd20-435c-8782-3626bc2dcb8f", "envelope_ceterms_ctid": "ce-2210c363-bd33-5443-af79-af8d95615154", "envelope_ctdl_type": "ceterms:ConditionManifest", "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": "https://credreg.net/ctdl/schema/context/json", "@id": "https://credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "@graph": { "@id": "https://credentialengineregistry.org/resources/ce-2210c363-bd33-5443-af79-af8d95615154", "@type": "ceterms:ConditionManifest", "ceterms:description": { "en": "This is some text that describes my condition manifest." }, "ceterms:subjectWebpage": "http://example.com?t=conditionDetails", "ceterms:ctid": "ce-2210c363-bd33-5443-af79-af8d95615154", "ceterms:costManifestOf": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "ceterms:requires": [ { "ceterms:name": { "en": "Deeper Requirements" }, "ceterms:description": { "en": "These conditions only apply to a specific combination of audience type and level." }, "ceterms:audienceType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Former Student", "ceterms:targetNode": "audience:FormerStudent" }, { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Current Student", "ceterms:targetNode": "audience:CurrentStudent" } ], "ceterms:audienceLevelType": [ { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Associate Degree Level", "ceterms:targetNode": "audLevel:AssociateDegreeLevel" }, { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "Intermediate Level", "ceterms:targetNode": "audLevel:IntermediateLevel" }, { "@type": "ceterms:CredentialAlignmentObject", "ceterms:targetNodeName": "PostSecondary Level", "ceterms:targetNode": "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/ce-08c3dc49-a122-1233-a06c-b5e054f62dcc", "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154" ] } ], "ceterms:entryCondition": [ { "ceterms:name": { "en": "Simple Requirements" }, "ceterms:description": { "en": "A Condition Profile has many properties, but sometimes you only need a few of them." }, "ceterms:condition": { "en": [ "Bullet point", "Another list item", "a third list item" ] } } ] } } }

Sample

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

Sample condition manifest wrapper:

{ //Your condition manifest's data "ConditionManifest": { "Name": "My condition manifest name", "Description": "My condition manifest description" //Other properties... }, //This is where you put the CTID of the organization that owns the data. //Usually, this will be your own organization's CTID. However, third-party publishers will use the CTID of the organization on behalf of which they are publishing. "PublishForOrganizationIdentifier": "ce-0512bba3-3b86-472c-ace7-1535fbe0200a" }

Below is some example code to publish a simple condition manifest object:

Sample condition manifest publishing code (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.

Publishing Your Competency Frameworks

Introduction

The Competency Framework class represents a description of a specific Competency Framework for an organization. For more information, review the CTDL Guide.

To format or publish an Competency Framework, use the following endpoints:

Format Data (only)

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

Publish Data (automatically formats first)

https://credentialengine.org/raSandbox/CompetencyFramework/publish

Required Properties

The Registry Assistant API uses a simplified version of the Competency Framework class to convey the data for an Competency Framework. Refer to the Minimum Data Policy for the required properties for this class and Minimum Data Policy for a competency.

Publishing a Basic Record

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

Sample data sent by your system:

{ "CompetencyFramework": [ { "Type": "ceasn:CompetencyFramework", "Name": "My competency framework name.", "Description": "This is some text that describes my competency Framework.", "CTID": "ce-2210c363-bd33-5443-af79-af8d95615154", "DateCreated": "2010-01-01", "InLanguage": [ "en" ], "Creator": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "Publisher": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "PublisherName": "Name of Publisher.", "HasTopChild": [ "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "ce-b7c86ef0-aa37-45a1-bbff-5d5b8b7152e3", "ce-c1ecdcaa-3664-4fa9-a2ce-056209133fd3" ], "Rights": "Description of rights for this framework.", "Date Copyrighted": "2010-02-01", "Source": [ "https://example.com/sourceForFramework" ] } ], "Competencies": [ { "Type": "ceasn:Competency", "CompetencyText": "My first competency name.", "Comment": "This is some text that describes my competency.", "CTID": "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "DateCreated": "2010-01-01", "InLanguage": [ "en" ], "IsPartOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "IsTopChildOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "CodedNotation": "abc.01", "ListId": "1" }, { "Type": "ceasn:Competency", "CompetencyText": "My second competency name.", "Comment": "This is some text that describes my competency.", "CTID": "ce-b7c86ef0-aa37-45a1-bbff-5d5b8b7152e3", "DateCreated": "2010-01-01", "InLanguage": [ "en" ], "IsPartOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "IsTopChildOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "CodedNotation": "abc.02", "ListId": "2" } ] }

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:

Sample data returned from the format endpoint:

{ "ceasn:CompetencyFramework": [ { "@type": "ceasn:CompetencyFramework", "ceasn:name": { "en": "My competency framework name." }, "ceasn:description": { "en": "This is some text that describes my competency Framework." }, "ceterms:ctid": "ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:dateCreated": "2010-01-01", "ceasn:inLanguage": [ "en" ], "ceasn:creator": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "ceasn:publisher": { "en": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ] }, "ceasn:publisherName": { "en": "Name of Publisher." }, "ceasn:hasTopChild": [ "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "ce-b7c86ef0-aa37-45a1-bbff-5d5b8b7152e3", "ce-c1ecdcaa-3664-4fa9-a2ce-056209133fd3" ], "ceasn:rights": { "en": "Description of rights for this framework." }, "ceasn:datecopyrighted": "2010-02-01", "ceasn:source": [ "https://example.com/sourceForFramework" ] } ], "ceasn:Competency": [ { "@type": "ceasn:Competency", "ceasn:CompetencyText": { "en": "My first competency name." }, "ceasn:comment": { "en": "This is some text that describes my competency." }, "ceterms:ctid": "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "ceasn:dateCreated": "2010-01-01", "ceasn:inLanguage": [ "en" ], "ceasn:isPartOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:IsTopChildOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:codedNotation": "abc.01", "ceasn:listID": "1" }, { "@type": "ceasn:Competency", "ceasn:CompetencyText": { "en": "My second competency name." }, "ceasn:comment": { "en": "This is some text that describes my competency." }, "ceterms:ctid": "ce-b7c86ef0-aa37-45a1-bbff-5d5b8b7152e3", "ceasn:dateCreated": "2010-01-01", "ceasn:inLanguage": [ "en" ], "ceasn:isPartOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:IsTopChildOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:codedNotation": "abc.02", "ceasn:listID": "2" } ] }

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:

Sample envelope returned from the Registry:

{ "envelope_community": "ce_registry", "envelope_id": "14db8c13-e03a-4204-a094-1057a7059315", "envelope_ceterms_ctid": "ce-474460bb-617c-4181-8bb5-94cca3e2dde7", "envelope_ctdl_type": "ceterms:Credential", "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": "https://credreg.net/ctdl/schema/context/json", "@id": "https://credentialengineregistry.org/graph/ce-474460bb-617c-4181-8bb5-94cca3e2dde7", "@graph": { "@id": "https://credentialengineregistry.org/resources/ce-474460bb-617c-4181-8bb5-94cca3e2dde7", "ceasn:CompetencyFramework": [ { "@type": "ceasn:CompetencyFramework", "ceasn:name": { "en": "My competency framework name." }, "ceasn:description": { "en": "This is some text that describes my competency Framework." }, "ceterms:ctid": "ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:dateCreated": "2010-01-01", "ceasn:inLanguage": [ "en" ], "ceasn:creator": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "ceasn:publisher": { "en": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ] }, "ceasn:publisherName": { "en": "Name of Publisher." }, "ceasn:hasTopChild": [ "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "ce-b7c86ef0-aa37-45a1-bbff-5d5b8b7152e3", "ce-c1ecdcaa-3664-4fa9-a2ce-056209133fd3" ], "ceasn:rights": { "en": "Description of rights for this framework." }, "ceasn:datecopyrighted": "2010-02-01", "ceasn:source": [ "https://example.com/sourceForFramework" ] } ], "ceasn:Competency": [ { "@type": "ceasn:Competency", "ceasn:CompetencyText": { "en": "My first competency name." }, "ceasn:comment": { "en": "This is some text that describes my competency." }, "ceterms:ctid": "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "ceasn:dateCreated": "2010-01-01", "ceasn:inLanguage": [ "en" ], "ceasn:isPartOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:IsTopChildOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:codedNotation": "abc.01", "ceasn:listID": "1" }, { "@type": "ceasn:Competency", "ceasn:CompetencyText": { "en": "My second competency name." }, "ceasn:comment": { "en": "This is some text that describes my competency." }, "ceterms:ctid": "ce-b7c86ef0-aa37-45a1-bbff-5d5b8b7152e3", "ceasn:dateCreated": "2010-01-01", "ceasn:inLanguage": [ "en" ], "ceasn:isPartOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:IsTopChildOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:codedNotation": "abc.02", "ceasn:listID": "2" } ] } } }

Recommended Properties

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

Sample data sent by your system:

{ "CompetencyFramework": [ { "Type": "ceasn:CompetencyFramework", "Name": "My competency framework name.", "Description": "This is some text that describes my competency Framework.", "CTID": "ce-2210c363-bd33-5443-af79-af8d95615154", "DateCreated": "2010-01-01", "InLanguage": [ "en" ], "Creator": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "Publisher": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "PublisherName": "Name of Publisher.", "HasTopChild": [ "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "ce-b7c86ef0-aa37-45a1-bbff-5d5b8b7152e3", "ce-c1ecdcaa-3664-4fa9-a2ce-056209133fd3" ], "Rights": "Description of rights for this framework.", "Date Copyrighted": "2010-02-01", "Source": [ "https://example.com/sourceForFramework" ] } ], "Competencies": [ { "Type": "ceasn:Competency", "CompetencyText": "My first competency name.", "Comment": "This is some text that describes my competency.", "CTID": "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "DateCreated": "2010-01-01", "InLanguage": [ "en" ], "IsPartOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "IsTopChildOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "CodedNotation": "abc.01", "ListId": "1" }, { "Type": "ceasn:Competency", "CompetencyText": "My second competency name.", "Comment": "This is some text that describes my competency.", "CTID": "ce-b7c86ef0-aa37-45a1-bbff-5d5b8b7152e3", "DateCreated": "2010-01-01", "InLanguage": [ "en" ], "IsPartOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "IsTopChildOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "CodedNotation": "abc.02", "ListId": "2" } ] }

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:

Sample data returned from the format endpoint:

{ "ceasn:CompetencyFramework": [ { "@type": "ceasn:CompetencyFramework", "ceasn:name": { "en": "My competency framework name." }, "ceasn:description": { "en": "This is some text that describes my competency Framework." }, "ceterms:ctid": "ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:dateCreated": "2010-01-01", "ceasn:inLanguage": [ "en" ], "ceasn:creator": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "ceasn:publisher": { "en": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ] }, "ceasn:publisherName": { "en": "Name of Publisher." }, "ceasn:hasTopChild": [ "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "ce-b7c86ef0-aa37-45a1-bbff-5d5b8b7152e3", "ce-c1ecdcaa-3664-4fa9-a2ce-056209133fd3" ], "ceasn:rights": { "en": "Description of rights for this framework." }, "ceasn:datecopyrighted": "2010-02-01", "ceasn:source": [ "https://example.com/sourceForFramework" ] } ], "ceasn:Competency": [ { "@type": "ceasn:Competency", "ceasn:CompetencyText": { "en": "My first competency name." }, "ceasn:comment": { "en": "This is some text that describes my competency." }, "ceterms:ctid": "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "ceasn:dateCreated": "2010-01-01", "ceasn:inLanguage": [ "en" ], "ceasn:isPartOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:IsTopChildOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:codedNotation": "abc.01", "ceasn:listID": "1" }, { "@type": "ceasn:Competency", "ceasn:CompetencyText": { "en": "My second competency name." }, "ceasn:comment": { "en": "This is some text that describes my competency." }, "ceterms:ctid": "ce-b7c86ef0-aa37-45a1-bbff-5d5b8b7152e3", "ceasn:dateCreated": "2010-01-01", "ceasn:inLanguage": [ "en" ], "ceasn:isPartOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:IsTopChildOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:codedNotation": "abc.02", "ceasn:listID": "2" } ] }

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:

Sample envelope returned from the Registry:

{ "envelope_community": "ce_registry", "envelope_id": "2f165655-0baf-4335-be26-2e932f67226c", "envelope_ceterms_ctid": "ce-474460bb-617c-4181-8bb5-94cca3e2dde7", "envelope_ctdl_type": "ceterms:Credential", "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": "https://credreg.net/ctdl/schema/context/json", "@id": "https://credentialengineregistry.org/graph/ce-474460bb-617c-4181-8bb5-94cca3e2dde7", "@graph": { "@id": "https://credentialengineregistry.org/resources/ce-474460bb-617c-4181-8bb5-94cca3e2dde7", "ceasn:CompetencyFramework": [ { "@type": "ceasn:CompetencyFramework", "ceasn:name": { "en": "My competency framework name." }, "ceasn:description": { "en": "This is some text that describes my competency Framework." }, "ceterms:ctid": "ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:dateCreated": "2010-01-01", "ceasn:inLanguage": [ "en" ], "ceasn:creator": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "ceasn:publisher": { "en": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ] }, "ceasn:publisherName": { "en": "Name of Publisher." }, "ceasn:hasTopChild": [ "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "ce-b7c86ef0-aa37-45a1-bbff-5d5b8b7152e3", "ce-c1ecdcaa-3664-4fa9-a2ce-056209133fd3" ], "ceasn:rights": { "en": "Description of rights for this framework." }, "ceasn:datecopyrighted": "2010-02-01", "ceasn:source": [ "https://example.com/sourceForFramework" ] } ], "ceasn:Competency": [ { "@type": "ceasn:Competency", "ceasn:CompetencyText": { "en": "My first competency name." }, "ceasn:comment": { "en": "This is some text that describes my competency." }, "ceterms:ctid": "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "ceasn:dateCreated": "2010-01-01", "ceasn:inLanguage": [ "en" ], "ceasn:isPartOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:IsTopChildOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:codedNotation": "abc.01", "ceasn:listID": "1" }, { "@type": "ceasn:Competency", "ceasn:CompetencyText": { "en": "My second competency name." }, "ceasn:comment": { "en": "This is some text that describes my competency." }, "ceterms:ctid": "ce-b7c86ef0-aa37-45a1-bbff-5d5b8b7152e3", "ceasn:dateCreated": "2010-01-01", "ceasn:inLanguage": [ "en" ], "ceasn:isPartOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:IsTopChildOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:codedNotation": "abc.02", "ceasn:listID": "2" } ] } } }

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 competency framework data itself will go in an CompetencyFramework property:

Sample competency framework wrapper:

{ //Your competency framework's data "CompetencyFramework": { "Name": "My competency framework name", "Description": "My competency framework description", "hasTopChild": [ "ce-3581fcd6-e4b9-449f-865b-784a4fc09fac", "ce-640165cc-51dd-4545-bbb4-cdd56bbb74a6" ], //Other properties... }, //This is where you put all of the competencies that are part of this framework. "Competencies": [ { "Ctid": "ce-3581fcd6-e4b9-449f-865b-784a4fc09fac", "dateCreated": "2015-07-01", "isPartOf": "ce-4f484791-aca7-44a0-ba9f-3d4ef6aa4253", "isTopChildOf": "ce-4f484791-aca7-44a0-ba9f-3d4ef6aa4253", "competencyText": "Introduction to Mechatronics: Safety", "hasChild": [ "ce-81611f75-b64d-459c-b55c-fae070fd6e89", "ce-c565d5da-2273-470b-af19-b6c18a167251" ] }, { "Ctid": "ce-81611f75-b64d-459c-b55c-fae070fd6e89", "dateCreated": "2015-07-01", "isPartOf": "ce-4f484791-aca7-44a0-ba9f-3d4ef6aa4253", "isTopChildOf": "ce-3581fcd6-e4b9-449f-865b-784a4fc09fac", "competencyText": "Follow workplace electrical safety guidelines (NEC) lock-out/tag-out)" } ] }, //This is where you put the CTID of the organization that owns the data. //Usually, this will be your own organization's CTID. However, third-party publishers will use the CTID of the organization on behalf of which they are publishing. "PublishForOrganizationIdentifier": "ce-f77b45a5-ae29-462e-96fa-52aa2a010c98" }

Below is some example code to publish a simple competency framework object:

Sample competency framework publishing code (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.SaveCompetencyFrameworkCTID( myCTID ); //A simple CompetencyFramework object - see below for sample class definition var myData = new SampleCompetencyFramework() { Name = "My Competency Framework Name", Description = "This is some text that describes my Competency Framework.", CTID = myCTID, HasTopChild = new List<string>() {"ce-0a013e71-1111-48e3-b23e-ca7a33da72a0", "ce-0a013e71-2222-48e3-b23e-ca7a33da72a0"}; }; var myCompetencies = new List<Competency>(); myCompetencies.Add( New Competency() { CTID="ce-0a013e71-1111-48e3-b23e-ca7a33da72a0", CompetencyText="First Competency", Comment="competency description"}); myCompetencies.Add( New Competency() { CTID="ce-0a013e71-2222-48e3-b23e-ca7a33da72a0", CompetencyText="Second Competency", Comment="competency description"}); //This holds the Competency Framework and the identifier (CTID) for the owning organization var myData = new CompetencyFrameworkRequest() { CompetencyFramework = myData, Competencies = myCompetencies 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/CompetencyFramework/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 CompetencyFrameworkRequest { public SampleCompetencyFramework CompetencyFramework { get; set; } public List<Competency> Competencies{ get; set; } public string PublishForOrganizationIdentifier { get; set; } } public class SampleCompetencyFramework { public string CTID { get; set; } public string Name { get; set; } public string Description { get; set; } //Other properties } public class Competency { public string CTID { get; set; } public string CompetencyText { get; set; } public string Comment { get; set; } //Othe properties } } }

Summary

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

Publishing Your Concept Schemes

Introduction

The Concept Scheme class represents a description of a specific Concept Scheme for an organization. For more information, review the CTDL Guide.

To format or publish an Concept Scheme, use the following endpoints:

Format Data (only)

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

Publish Data (automatically formats first)

https://credentialengine.org/raSandbox/ConceptScheme/publish

Required Properties

The Registry Assistant API uses a simplified version of the Concept Scheme class to convey the data for an Concept Scheme. Refer to the Minimum Data Policy for the required properties for this class and Minimum Data Policy for concepts.

Publishing a Basic Record

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

Sample data sent by your system:

{ "ConceptScheme": [ { "Type": "ceasn:ConceptScheme", "Name": "My concept scheme name.", "Description": "This is some text that describes my concept Scheme.", "CTID": "ce-2210c363-bd33-5443-af79-af8d95615154", "DateCreated": "2010-01-01", "InLanguage": [ "en" ], "HasTopConcept": [ "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "ce-b7c86ef0-aa37-45a1-bbff-5d5b8b7152e3", "ce-c1ecdcaa-3664-4fa9-a2ce-056209133fd3" ], "PublicationStatusType": "http://credreg.net/ctdlasn/vocab/publicationStatus/Published", "Source": [ "https://example.com/sourceForScheme" ], "Creator": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "Publisher": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "PublisherName": "Name of Publisher.", "Rights": "Description of rights for this scheme.", "Date Copyrighted": "2010-02-01" } ], "Concepts": [ { "Type": "ceasn:Concept", "CTID": "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "PrefLabel": "My first concept name.", "InScheme": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "InLanguage": [ "en" ], "TopConceptOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "Definition": "This is some text that describes my concept." }, { "Type": "ceasn:Concept", "CTID": "ce-140214c4-aaa4-4a45-a07b-5d5b8b7152e3", "PrefLabel": "My second concept name.", "InScheme": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "InLanguage": [ "en" ], "TopConceptOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "Definition": "This is some text that describes my concept." } ] }

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:

Sample data returned from the format endpoint:

{ "ceasn:ConceptScheme": [ { "@type": "ceasn:ConceptScheme", "ceasn:name": { "en": "My concept scheme name." }, "ceasn:description": { "en": "This is some text that describes my concept Scheme." }, "ceterms:ctid": "ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:dateCreated": "2010-01-01", "ceasn:inLanguage": [ "en" ], "ceasn:hasTopChild": [ "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "ce-b7c86ef0-aa37-45a1-bbff-5d5b8b7152e3", "ce-c1ecdcaa-3664-4fa9-a2ce-056209133fd3" ], "ceasn:publicationStatusType": "http://credreg.net/ctdlasn/vocab/publicationStatus/Published", "ceasn:source": [ "https://example.com/sourceForScheme" ], "ceasn:creator": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "ceasn:publisher": { "en": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ] }, "ceasn:publisherName": { "en": "Name of Publisher." }, "ceasn:rights": { "en": "Description of rights for this scheme." }, "ceasn:datecopyrighted": "2010-02-01" } ], "ceasn:Concept": [ { "@type": "ceasn:Concept", "ceterms:ctid": "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "skos:prefLabel": { "en": "My first concept name." }, "ceasn:inScheme": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:inLanguage": [ "en" ], "ceasn:topConceptOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:definition": { "en": "This is some text that describes my concept." } }, { "@type": "ceasn:Concept", "ceterms:ctid": "ce-140214c4-aaa4-4a45-a07b-5d5b8b7152e3", "skos:prefLabel": { "en": "My second concept name." }, "ceasn:inScheme": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:inLanguage": [ "en" ], "ceasn:topConceptOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:definition": { "en": "This is some text that describes my concept." } } ] }

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:

Sample envelope returned from the Registry:

{ "envelope_community": "ce_registry", "envelope_id": "4cbf2c4a-4144-41e5-94d8-4339384f5652", "envelope_ceterms_ctid": "ce-474460bb-617c-4181-8bb5-94cca3e2dde7", "envelope_ctdl_type": "ceterms:Credential", "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": "https://credreg.net/ctdl/schema/context/json", "@id": "https://credentialengineregistry.org/graph/ce-474460bb-617c-4181-8bb5-94cca3e2dde7", "@graph": { "@id": "https://credentialengineregistry.org/resources/ce-474460bb-617c-4181-8bb5-94cca3e2dde7", "ceasn:ConceptScheme": [ { "@type": "ceasn:ConceptScheme", "ceasn:name": { "en": "My concept scheme name." }, "ceasn:description": { "en": "This is some text that describes my concept Scheme." }, "ceterms:ctid": "ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:dateCreated": "2010-01-01", "ceasn:inLanguage": [ "en" ], "ceasn:hasTopChild": [ "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "ce-b7c86ef0-aa37-45a1-bbff-5d5b8b7152e3", "ce-c1ecdcaa-3664-4fa9-a2ce-056209133fd3" ], "ceasn:publicationStatusType": "http://credreg.net/ctdlasn/vocab/publicationStatus/Published", "ceasn:source": [ "https://example.com/sourceForScheme" ], "ceasn:creator": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "ceasn:publisher": { "en": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ] }, "ceasn:publisherName": { "en": "Name of Publisher." }, "ceasn:rights": { "en": "Description of rights for this scheme." }, "ceasn:datecopyrighted": "2010-02-01" } ], "ceasn:Concept": [ { "@type": "ceasn:Concept", "ceterms:ctid": "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "skos:prefLabel": { "en": "My first concept name." }, "ceasn:inScheme": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:inLanguage": [ "en" ], "ceasn:topConceptOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:definition": { "en": "This is some text that describes my concept." } }, { "@type": "ceasn:Concept", "ceterms:ctid": "ce-140214c4-aaa4-4a45-a07b-5d5b8b7152e3", "skos:prefLabel": { "en": "My second concept name." }, "ceasn:inScheme": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:inLanguage": [ "en" ], "ceasn:topConceptOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:definition": { "en": "This is some text that describes my concept." } } ] } } }

Recommended Properties

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

Sample data sent by your system:

{ "ConceptScheme": [ { "Type": "ceasn:ConceptScheme", "Name": "My concept scheme name.", "Description": "This is some text that describes my concept Scheme.", "CTID": "ce-2210c363-bd33-5443-af79-af8d95615154", "DateCreated": "2010-01-01", "InLanguage": [ "en" ], "HasTopConcept": [ "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "ce-b7c86ef0-aa37-45a1-bbff-5d5b8b7152e3", "ce-c1ecdcaa-3664-4fa9-a2ce-056209133fd3" ], "PublicationStatusType": "http://credreg.net/ctdlasn/vocab/publicationStatus/Published", "Source": [ "https://example.com/sourceForScheme" ], "Creator": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "Publisher": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "PublisherName": "Name of Publisher.", "Rights": "Description of rights for this scheme.", "Date Copyrighted": "2010-02-01" } ], "Concepts": [ { "Type": "ceasn:Concept", "CTID": "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "PrefLabel": "My first concept name.", "InScheme": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "InLanguage": [ "en" ], "TopConceptOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "Definition": "This is some text that describes my concept." }, { "Type": "ceasn:Concept", "CTID": "ce-140214c4-aaa4-4a45-a07b-5d5b8b7152e3", "PrefLabel": "My second concept name.", "InScheme": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "InLanguage": [ "en" ], "TopConceptOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "Definition": "This is some text that describes my concept." } ] }

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:

Sample data returned from the format endpoint:

{ "ceasn:ConceptScheme": [ { "@type": "ceasn:ConceptScheme", "ceasn:name": { "en": "My concept scheme name." }, "ceasn:description": { "en": "This is some text that describes my concept Scheme." }, "ceterms:ctid": "ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:dateCreated": "2010-01-01", "ceasn:inLanguage": [ "en" ], "ceasn:hasTopChild": [ "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "ce-b7c86ef0-aa37-45a1-bbff-5d5b8b7152e3", "ce-c1ecdcaa-3664-4fa9-a2ce-056209133fd3" ], "ceasn:publicationStatusType": "http://credreg.net/ctdlasn/vocab/publicationStatus/Published", "ceasn:source": [ "https://example.com/sourceForScheme" ], "ceasn:creator": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "ceasn:publisher": { "en": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ] }, "ceasn:publisherName": { "en": "Name of Publisher." }, "ceasn:rights": { "en": "Description of rights for this scheme." }, "ceasn:datecopyrighted": "2010-02-01" } ], "ceasn:Concept": [ { "@type": "ceasn:Concept", "ceterms:ctid": "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "skos:prefLabel": { "en": "My first concept name." }, "ceasn:inScheme": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:inLanguage": [ "en" ], "ceasn:topConceptOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:definition": { "en": "This is some text that describes my concept." } }, { "@type": "ceasn:Concept", "ceterms:ctid": "ce-140214c4-aaa4-4a45-a07b-5d5b8b7152e3", "skos:prefLabel": { "en": "My second concept name." }, "ceasn:inScheme": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:inLanguage": [ "en" ], "ceasn:topConceptOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:definition": { "en": "This is some text that describes my concept." } } ] }

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:

Sample envelope returned from the Registry:

{ "envelope_community": "ce_registry", "envelope_id": "56a2fecd-e5a9-407c-8c11-997beffc2447", "envelope_ceterms_ctid": "ce-474460bb-617c-4181-8bb5-94cca3e2dde7", "envelope_ctdl_type": "ceterms:Credential", "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": "https://credreg.net/ctdl/schema/context/json", "@id": "https://credentialengineregistry.org/graph/ce-474460bb-617c-4181-8bb5-94cca3e2dde7", "@graph": { "@id": "https://credentialengineregistry.org/resources/ce-474460bb-617c-4181-8bb5-94cca3e2dde7", "ceasn:ConceptScheme": [ { "@type": "ceasn:ConceptScheme", "ceasn:name": { "en": "My concept scheme name." }, "ceasn:description": { "en": "This is some text that describes my concept Scheme." }, "ceterms:ctid": "ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:dateCreated": "2010-01-01", "ceasn:inLanguage": [ "en" ], "ceasn:hasTopChild": [ "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "ce-b7c86ef0-aa37-45a1-bbff-5d5b8b7152e3", "ce-c1ecdcaa-3664-4fa9-a2ce-056209133fd3" ], "ceasn:publicationStatusType": "http://credreg.net/ctdlasn/vocab/publicationStatus/Published", "ceasn:source": [ "https://example.com/sourceForScheme" ], "ceasn:creator": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ], "ceasn:publisher": { "en": [ "https://sandbox.credentialengineregistry.org/graph/ce-28935e07-76dc-4562-8c43-3ece101686be" ] }, "ceasn:publisherName": { "en": "Name of Publisher." }, "ceasn:rights": { "en": "Description of rights for this scheme." }, "ceasn:datecopyrighted": "2010-02-01" } ], "ceasn:Concept": [ { "@type": "ceasn:Concept", "ceterms:ctid": "ce-140214c4-aaa4-4a45-a07b-4b91b8185962", "skos:prefLabel": { "en": "My first concept name." }, "ceasn:inScheme": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:inLanguage": [ "en" ], "ceasn:topConceptOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:definition": { "en": "This is some text that describes my concept." } }, { "@type": "ceasn:Concept", "ceterms:ctid": "ce-140214c4-aaa4-4a45-a07b-5d5b8b7152e3", "skos:prefLabel": { "en": "My second concept name." }, "ceasn:inScheme": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:inLanguage": [ "en" ], "ceasn:topConceptOf": "https://sandbox.credentialengineregistry.org/graph/ce-2210c363-bd33-5443-af79-af8d95615154", "ceasn:definition": { "en": "This is some text that describes my concept." } } ] } } }

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 concept scheme data itself will go in an ConceptScheme property:

Sample concept scheme wrapper:

{ //Your concept scheme's data "ConceptScheme": { "Name": "My concept scheme name", "Description": "My concept scheme description", "hasTopConcept": [ "ce-3581fcd6-e4b9-449f-865b-784a4fc09fac", "ce-640165cc-51dd-4545-bbb4-cdd56bbb74a6" ], //Other properties... }, //This is where you put all of the concepts that are part of this scheme. "Concepts": [ { "Ctid": "ce-3581fcd6-e4b9-449f-865b-784a4fc09fac", "dateCreated": "2015-07-01", "isPartOf": "ce-4f484791-aca7-44a0-ba9f-3d4ef6aa4253", "isTopChildOf": "ce-4f484791-aca7-44a0-ba9f-3d4ef6aa4253", "conceptText": "Introduction to Mechatronics: Safety", "hasChild": [ "ce-81611f75-b64d-459c-b55c-fae070fd6e89", "ce-c565d5da-2273-470b-af19-b6c18a167251" ] }, { "Ctid": "ce-81611f75-b64d-459c-b55c-fae070fd6e89", "dateCreated": "2015-07-01", "isPartOf": "ce-4f484791-aca7-44a0-ba9f-3d4ef6aa4253", "isTopChildOf": "ce-3581fcd6-e4b9-449f-865b-784a4fc09fac", "conceptText": "Follow workplace electrical safety guidelines (NEC) lock-out/tag-out)" } ] }, //This is where you put the CTID of the organization that owns the data. //Usually, this will be your own organization's CTID. However, third-party publishers will use the CTID of the organization on behalf of which they are publishing. "PublishForOrganizationIdentifier": "ce-19028b59-b4e9-4f6b-bfb1-343b261d83ee" }

Below is some example code to publish a simple concept scheme object:

Sample concept scheme publishing code (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.SaveConceptSchemeCTID( myCTID ); //A simple ConceptScheme object - see below for sample class definition var myData = new SampleConceptScheme() { Name = "My Concept Scheme Name", Description = "This is some text that describes my Concept Scheme.", CTID = myCTID, HasTopConcept = new List<string>() {"ce-0a013e71-1111-48e3-b23e-ca7a33da72a0", "ce-0a013e71-2222-48e3-b23e-ca7a33da72a0"}; }; var myConcepts = new List<Concept>(); myConcepts.Add( New Concept() { CTID="ce-0a013e71-1111-48e3-b23e-ca7a33da72a0", ConceptText="First Concept", Comment="concept description"}); myConcepts.Add( New Concept() { CTID="ce-0a013e71-2222-48e3-b23e-ca7a33da72a0", ConceptText="Second Concept", Comment="concept description"}); //This holds the Concept Scheme and the identifier (CTID) for the owning organization var myData = new ConceptSchemeRequest() { ConceptScheme = myData, Concepts = myConcepts 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/ConceptScheme/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 ConceptSchemeRequest { public SampleConceptScheme ConceptScheme { get; set; } public List<Concept> Competencies{ get; set; } public string PublishForOrganizationIdentifier { get; set; } } public class SampleConceptScheme { public string CTID { get; set; } public string Name { get; set; } public string Description { get; set; } //Other properties } public class Concept { public string CTID { get; set; } public string PrefLabel { get; set; } public string InScheme { get; set; } //Othe properties } } }

Summary

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

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.

Refer to the Minimum Data Policy for the required properties for this class.

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.

Refer to the Minimum Data Policy for the required properties for this class.

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:

Refer to the Minimum Data Policy for the required properties for this class.

Data in the Registry

Data in the registry is wrapped in a common container, called an envelope. The data your system publishes is transformed into the decoded_payload property of the envelope, and is tracked with other properties. The Registry generates and maintains this structure; you do not publish an envelope.

Structure of a Registry Envelope

The properties for an enevelope are:

PropertyDefinition
envelope_communityThe community related to this envelope. Each community has a different schema for the resource to be encoded.
envelope_idThe unique identifier for this envelope, defined as a UUID
envelope_ceterms_ctidThe unique CTID for the primary document in this envelope.
envelope_ctdl_typeThe CTDL type of the primary document in this envelope, for example: ceterms:CredentialOrganization
envelope_typeCurrently will only have a type of resource_data.
envelope_versionThe version that our envelope is using. The current version is "1.0.0"
resourceA string containing the JWT encoded content. The original resource should follow the corresponding envelope_community's schema.
decoded_resourceThe Resource in the original decoded form.
resource_formatOnly json is allowed.
resource_encodingThe algorithm used to encode the resource. Currently we only support "jwt"
resource_public_keyThe public key, in PEM format, whose private part was used to sign the resource. This is strictly needed for signature validation purposes.
publisher_id
secondary_publisher_id
node_headers

Headers for the envelope

PropertyDefinition
revision_historyContains list of revision history events for the data.
created_atDate (UTC) the data was orginally published to the registry.
updated_atDate (UTC) the data was last published to the registry.
deleted_atDate (UTC) the data was deleted (tombstoned/virtually deleted) from the registry.

Sample envelope structure

{ "envelope_community": "ce_registry", "envelope_id": "88ae841a-fa1e-4d8f-a99c-35521e68c21e", "envelope_ceterms_ctid": "ce-474460bb-617c-4181-8bb5-94cca3e2dde7", "envelope_ctdl_type": "ceterms:AssessmentProfile", "envelope_type": "resource_data", "envelope_version": "1.0.0", "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://credentialengineregistry.org/graph/ce-474460bb-617c-4181-8bb5-94cca3e2dde7", "@graph": [ { "@id": "https://credentialengineregistry.org/resources/ce-474460bb-617c-4181-8bb5-94cca3e2dde7", "@type": "ceterms:AssessmentProfile", "ceterms:ctid": "ce-474460bb-617c-4181-8bb5-94cca3e2dde7", "ceterms:name": { "en": "Health Informatics" }, "ceterms:ownedBy": [ "https://credentialengineregistry.org/graph/ce-6A62B250-A1A2-4D31-A702-CDC2437EFD31" ] } ] } }

Retrieving Data from the Registry

A single record in the registry can be accessed using several methods:

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.

Refer to the Concept Schemes section of the terms page to review the concept schemes in CTDL.