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 Prefix | Description |
|---|---|
/programs | Programs collection (all or single) |
/program-categories | Program categories (all or single) |
/program-category-mapping | Mapping programs to categories |
/programs-meta-data | Programs metadata |
/related-programs | Programs 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-categoryto thecategoriesattribute on bothtest-program-associateandtest-program-bachelor. - Sending the same payload with a DELETE request removes
default-categoryfrom both programs.
Important Details:
- The operation will fail with a 404 if any slug in the
categoriesarray 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 Key | Value | Description |
|---|---|---|
| *Authorization | Bearer <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-Type | application/json | Required 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=programsRequest Parameters
| Parameter | Type | Description |
|---|---|---|
| client_id | string | The client ID provided by Lightcast. |
| client_secret | string | The client secret associated with your client ID. |
| grant_type | string | Must be set to client_credentials. |
| scope | string | Use 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
| Parameter | Type | Description |
|---|---|---|
| access_token | string | The token used to authorize the API requests. |
| expires_in | integer | Number of seconds before the token expires. |
| token_type | string | Indicates the type of token. (Always Bearer) |
Status Code Summary
| Code | Meaning | Description |
|---|---|---|
| 200 | OK | Request was successful. |
| 400 | Bad Request | The request was unacceptable, often due to missing a required parameter. |
| 401 | Unauthorized | Authentication error. |
| 404 | Not Found | Resource 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.
