Overview

Introduction

The Career Coach Programs API is a RESTful service that stores academic program data for Career Coach clients. It acts as a document store that client developers can use to manage program data efficiently. It can be used in conjunction with the Career Coach Careers API to relate programs to careers.

All endpoints follow a JSONAPI-like format, with a top-level data object containing objects or arrays with type, id, and attributes.

Support: Please contact your Lightcast / Career Coach account manager for technical or customer support regarding API use.

Use Cases

This API is useful if you:

  • Need to store academic program information but cannot or do not wish to maintain your own program database.
  • Need a queryable, performant API interface for existing program data.
  • Want an API interface for your Career Coach site to dynamically manage programs.

You probably don’t need this API if:

  • You already have an accessible program database or API.
  • You have a complex student management system that is tightly integrated with program data.
  • You have no need for storing academic program information (e.g., only using Career Coach Careers API).

Data Overview

The CC Programs API uses a NoSQL data store for scalable, fast querying of program documents. All CRUD operations are supported per client subdomain:

  • POST
  • PATCH
  • GET
  • DELETE

Program Documents

  • application-link – A custom link to the program’s application page. Provides a direct path for users to apply.
  • careers – A list of O*NET, UK SOC, CA NOC, or LOT occupation codes that are mapped to the program as viable career options. Values must be valid codes; the API validates this field.
  • categories – A list of client-defined program categories or pathways that the program fits into. Managed via the program-category-mapping endpoint, not manually supplied.
  • created-at – Timestamp indicating when the program record was created.
  • credential (required) – Type of credential or award, e.g., Certificate, Associate, Bachelor, PhD. Forms part of the slug used for routing.
  • cip – Optional IPEDS academic classification. Used internally to map programs to careers via the CIP → O*NET crosswalk. Not required for client use. Must be a valid CIP or equivalent UK code if provided.
  • code – Optional attribute for internal reference. Can be used as an alternative query key instead of route-based slug queries.
  • credits – The number of credits required to complete the program.
  • institution-id – The ID of the institution offering the program (e.g., IPEDS ID in the US).
  • length – Numeric value of the program’s duration. Stored separately from the unit for aggregation and querying.
  • length-unit – Unit for program length, e.g., semester, year.
  • locations – List of campus locations where the program is offered.
  • name (required) – Name or title of the program. Used along with credential to generate the slug for routing.
  • request-info-email – Contact email address for the program.
  • transfers – Array of objects containing names and URLs of institutions to which the program may transfer.
  • tuition-link – Custom link to the program’s tuition information page.
  • tuition-range – Numeric array representing the lower and upper bounds of tuition costs, e.g., ["5000", "10000"].
  • updated-at – Timestamp of the last update to the program record.
  • url – Client’s program page URL. This link is used on the "Visit Program Page" button in Career Coach.
  • slug (auto-generated) – Unique ID for the program, generated from a combination of name and credential. Used for routing to individual programs.
  • subdomain (auto-generated) – Client subdomain associated with the program. Derived from the initial route where the program was posted.

Category Documents

  • color – A 6-digit HEX RGB code representing the color for the category. Useful for UI display and differentiation.
  • description – Text description of the category. Provides context and details about what the category represents.
  • image – URL of an image associated with the category. Can be used for display in listings or promotional materials.
  • name (required) – Name of the category. Used to generate the slug for routing and display purposes.
  • slug (auto-generated) – Unique ID for the category, generated from a slugified version of the name. Used for routing to individual category pages.
  • subdomain (auto-generated) – Client subdomain associated with the category. Derived from the initial route where the category was created (e.g., demo for demo.lightcastcc.com).

O*NET Information

This API includes information from O*NET OnLine by the U.S. Department of Labor, Employment and Training Administration (USDOL/ETA) used under the CC BY 4.0 license. O*NET® is a trademark of USDOL/ETA. Lightcast has modified some or all of this information, and USDOL/ETA has not approved, endorsed, or tested these modifications.

Resource Structure

The API provides access to the following collections:

Route PrefixDescription
/programsPrograms collection (all or single)
/program-categoriesProgram categories (all or single)
/program-category-mappingMapping programs to categories
/programs-meta-dataPrograms metadata
/related-programsPrograms related to a career

Routes Examples

Programs and Categories share a similar structure, that is:

  • /programs/{subdomain} for all programs
  • /programs/{subdomain}/{slug} for an individual program
  • /program-categories/{subdomain} for all categories
  • /program-categories/{subdomain}/{slug} for an individual category

Important Details:

  • Document insertion happens at the / {subdomain} level.
  • Required attributes for a basic program document: name and credential.
  • Required attribute for a category document: name.
  • slug and subdomain are automatically generated; they are not required in the payload.
  • Do not supply the categories attribute in the payload; it is managed via the Mapping Programs to Categories endpoint.
  • The type property on the data object is required and must be set to program or category depending on the document.
  • The id property is optional and mirrors the slug; it is ignored if supplied.
  • Routes are based on the slug; updating a program’s name or credential, or a category’s name, will automatically update the slug and route.
  • To use a permanent URI that does not change when the name or credential is updated, assign a code to the program and query via /programs/{subdomain}?code={code}.
Mapping Programs to Categories
  • Programs and Categories are separate collections with their own documents.
  • The purpose of categories is to organize programs, allowing multiple programs to be associated with one or more categories.
  • Category references are stored on program documents via the Mapping Programs to Categories endpoint: /program-category-mapping/{subdomain}
  • Using a single payload, you can efficiently map or un-map several categories to multiple programs in a single HTTP request.

Example Payload:

{
  "data": {
    "attributes": {
      "categories": [
        {
          "slug": "default-category",
          "program-slugs": [
            "test-program-associate",
            "test-program-bachelor"
          ]
        }
      ]
    },
    "type": "category-program-mapping"
  }
}
  • Sending the above payload with a POST request adds default-category to the categories attribute on both test-program-associate and test-program-bachelor.
  • Sending the same payload with a DELETE request removes default-category from both programs.

Important Details:

  • The operation will fail with a 404 if any slug in the categories array does not exist as a valid program slug.
  • If at least one program slug is valid, the operation succeeds; only if all program slugs are invalid does it return a 404.
  • This is a graceful fail designed to minimize database load when handling large numbers of programs.
Programs Meta Data
  • This is a read-only endpoint providing an overview of programs at a given subdomain: /programs-meta-data/{subdomain}
  • Returns aggregate information for programs in the database, including categories, credentials, length-units, and locations.

Example Response:

{
  "data": {
    "type": "programs-meta-data",
    "id": "testsite-programs-meta-data",
    "attributes": {
      "categories": [
        { "slug": "default-category", "name": "Default Category" },
        { "slug": "test-category", "name": "Test Category" },
        { "slug": "test-category-one", "name": "Test Category One" }
      ],
      "count": 8,
      "credentials": [ "AAS", "AS", "Associate", "Bachelor", "Certificate" ],
      "length-units": [ "semester" ],
      "locations": [ "Moscow, ID" ],
      "subdomain": "testsite"
    }
  }
}
  • Categories: list of all categories in the database
  • Count: total number of programs
  • Credentials, length-units, locations: distinct values across the programs
  • Subdomain: client subdomain associated with the programs
Common Program Operations

1. Create a Program

curl --request POST \
  --url https://cc.emsiservices.com/programs/Your-Subdomain-Here \
  --header 'Authorization: Bearer <ACCESS_TOKEN>' \
  --header 'Content-Type: application/json' \
  --data '{ "data": { "type": "program", "attributes": { ... } } }'

Response:

{
  "data": {
    "type": "program",
    "id": "test-program-associate",
    "attributes": { ... }
  }
}

2. Get Programs

curl --request GET \
  --url 'https://cc.emsiservices.com/programs/Your-Subdomain-Here?limit=5&fields=name,credential' \
  --header 'Authorization: Bearer <ACCESS_TOKEN>'

Response: returns array of programs.

3. Update Program Name

curl --request PATCH \
  --url https://cc.emsiservices.com/programs/Your-Subdomain-Here/test-program-associate \
  --header 'Authorization: Bearer <ACCESS_TOKEN>' \
  --header 'Content-Type: application/json' \
  --data '{ "data": { "type": "program", "attributes": { ... } } }'

Response: returns updated program with new slug if name changes.

4. Create Category

curl --request POST \
  --url https://cc.emsiservices.com/program-categories/Your-Subdomain-Here \
  --header 'Authorization: Bearer <ACCESS_TOKEN>' \
  --header 'Content-Type: application/json' \
  --data '{ "data": { "type": "program-category", "attributes": { ... } } }'

5. Map Category to Program

curl --request POST \
  --url https://cc.emsiservices.com/program-category-mapping/Your-Subdomain-Here \
  --header 'Authorization: Bearer <ACCESS_TOKEN>' \
  --header 'Content-Type: application/json' \
  --data '{ "data": { "type": "category-program-mapping", "attributes": { ... } } }'

6. Delete a Program

curl --request DELETE \
  --url https://cc.emsiservices.com/programs/Your-Subdomain-Here/test-program-aas \
  --header 'Authorization: Bearer <ACCESS_TOKEN>'

Response: confirms deletion.

API Endpoint

There are multiple endpoints within this category. Refer to individual API docs under the Career Coach Programs API section.

Request Headers

Header KeyValueDescription
*AuthorizationBearer <ACCESS_TOKEN>This is the token obtained from the Authentication API. Include it in this header to authorize the request. (This must be included in all authenticated requests)
Content-Typeapplication/jsonRequired for endpoints that accept a request body. Specifies that the body is in JSON format.

Authentication

All endpoints in this category require an OAuth 2.0 Bearer Token for authentication. Tokens are granted through Lightcast’s Authentication API and are valid for 1 hour.

To access the Career Coach Programs API, the token must include the following scope:

  • programs (for expanded access)

Sample Request

curl --request POST \
  --url https://auth.emsicloud.com/connect/token \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data 'client_id=<CLIENT_ID>' \
  --data 'client_secret=<CLIENT_SECRET>' \
  --data grant_type=client_credentials \
  --data scope=programs

Request Parameters

ParameterTypeDescription
client_idstringThe client ID provided by Lightcast.
client_secretstringThe client secret associated with your client ID.
grant_typestringMust be set to client_credentials.
scopestringUse programs based on your access.

Sample Response

{
  "access_token": "<ACCESS_TOKEN>",
  "expires_in": 3600,
  "token_type": "Bearer"
}

Note that the Tokens expire after 3600 seconds. To maintain uninterrupted access, refresh the token before it expires. To know more about this, refer to the Authentication guide.

Response Parameters

ParameterTypeDescription
access_tokenstringThe token used to authorize the API requests.
expires_inintegerNumber of seconds before the token expires.
token_typestringIndicates the type of token. (Always Bearer)

Status Code Summary

CodeMeaningDescription
200OKRequest was successful.
400Bad RequestThe request was unacceptable, often due to missing a required parameter.
401UnauthorizedAuthentication error.
404Not FoundResource not found.

Versioning

The Career Coach Programs API is currently at version 1.0. New data updates, fields, and minor hotfixes may be added at any time and are not considered breaking changes.

Data is typically refreshed once per quarter, as new economic information becomes available. Clients will be notified when new data or features are released.

In the rare event that a version is deprecated, clients will receive at least 90 days’ notice to update their queries to the new format.