Back to top

Kuali Developers

General

Authentication

All API requests require a valid API key. API keys are created in the Kuali Users screen. It’s important to understand that the API key is tied to a specific user and allows the API to interact with the API on behalf of that user. The API permissions are limited to the role of the API key’s user. So an API key for a user with role ‘user’ will only be able to do things that user is allowed to do.

The API key is set via a Bearer Authorization header on each request. For example, the following is an example of a valid Bearer Authorization header.

Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MTIzMjY2MjI5OTgyMDU3MDk4MSwiaWF0IjoxNDQwODAyNzk3LCJleHAiOjE0NzIzNjAzOTcsImlzcyI6Imt1YWxpLmNvIn0.21ts7oh0QrlTMCvomXh0yBPuYHub_ZO2FtSrXG9zgCw

Our API keys are JSON Web tokens. They have a built in expiration and SHA256 signatures specific to the institution in which they are created.

You can use Basic Authentication to retrieve an API key using the Kuali username and password of the user. Use the Basic Auth header as you post to the following endpoint.

https://university.kuali.co/api/v1/auth/authenticate Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

This will return a json response containing the API key.

{ “token”: “eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MTIzMjY2MjI5OTgyMDU3MDk4MSwiaWF0IjoxNDQwODAyNzk3LCJleHAiOjE0NzIzNjAzOTcsImlzcyI6Imt1YWxpLmNvIn0.21ts7oh0QrlTMCvomXh0yBPuYHub_ZO2FtSrXG9zgCw” }

Service to Service

Some api endpoints require a ‘Service’ role. Do the following to create an api key for service to service communication.

  1. Open the Users application.

  2. Add a new user with the role: ‘Service’.

  3. Create an API Key for that user.

Pass that api key in the Authorization header to api endpoints that require a ‘Service’ role.

You can retrieve the role for an api-key by making a request to /api/v1/users/current with the appropriate api key. If successful, the response will include the role of that user and the role will equal ‘service’.

Version

A version is required to make a request to the API. The version is set via the url.

https://university.kuali.co/api/v1/users https://college.kuali.co/api/v1/courses

DEPRECATED

The following mechanisms for setting version are deprecated and will soon be removed.

Accept Header

Accept: application/vnd.kuali.v1+json

Query Param

?version=1

Dates

All dates are returned in UNIX timestamp format (number of milliseconds since 1970 GMT). For example:

12592188003892

Error states

The common HTTP Response Status Codes are used.

Settings

Settings

Get Settings
GET/cor/settings/api/v1/settings

Requires valid API key with role of user or admin.

Example URI

GET /cor/settings/api/v1/settings
Request
HideShow
Headers
Content-Type: application/json
Authorization: Bearer {api-key}
Response  200
HideShow
Headers
Content-Type: application/json; charset=utf-8
Body
{
  "id": "1206493138879318188",
  "subdomain": "kuali",
  "provider": "kuali",
  "createdAt": 1259218800,
  "updatedAt": 1259218800,
  "name": "Kuali University",
  "featureFlagsCm": null,
  "idp": "",
  "eppn": "",
  "signInExpiresWithSession": "true",
  "signInExpiresIn": 12000,
  "timezone": "America/Denver"
}

Update Settings
PUT/cor/settings/api/v1/settings

Requires valid API key with admin role.

Example URI

PUT /cor/settings/api/v1/settings
Request
HideShow
Headers
Content-Type: application/json
Authorization: Bearer {api-key}
Body
{
  "subdomain": "kuali",
  "provider": "kuali",
  "createdAt": 1259218800,
  "updatedAt": 1259218800,
  "name": "Kuali University",
  "featureFlagsCm": null,
  "idp": "",
  "eppn": "",
  "signInExpiresWithSession": "true",
  "signInExpiresIn": 12000,
  "timezone": "America/Los_Angeles"
}
Response  200
HideShow
Headers
Content-Type: application/json; charset=utf-8
Body
{
  "id": "1206493138879318188",
  "subdomain": "kuali",
  "provider": "kuali",
  "createdAt": 1259218800,
  "updatedAt": 1259218800,
  "name": "Kuali University",
  "featureFlagsCm": null,
  "idp": "",
  "eppn": "",
  "signInExpiresWithSession": "true",
  "signInExpiresIn": 12000,
  "timezone": "America/Los_Angeles"
}

Users

User

Retrieve a User
GET/api/v1/users/{id}

Requires valid API key with role of user or admin.

Example URI

GET /api/v1/users/id
URI Parameters
HideShow
id
number (required) 

ID of the User in the form of a big integer

Request
HideShow
Headers
Content-Type: application/json
Authorization: Bearer {api-key}
Response  200
HideShow
Headers
Content-Type: application/json
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Always returned as a string"
    },
    "name": {
      "type": "string"
    },
    "username": {
      "type": "string"
    },
    "email": {
      "type": "string",
      "description": "Either username/email are required. You only need one or the other."
    },
    "createdAt": {
      "type": "number"
    },
    "updatedAt": {
      "type": "number"
    },
    "role": {
      "type": "string",
      "description": "Must be user or admin"
    },
    "firstName": {
      "type": "string"
    },
    "lastName": {
      "type": "string"
    },
    "phone": {
      "type": "string"
    },
    "scopesCm": {
      "type": "string"
    },
    "ssoId": {
      "type": "string"
    },
    "schoolId": {
      "type": "string"
    },
    "approved": {
      "type": "boolean"
    },
    "active": {
      "type": "boolean"
    }
  },
  "required": [
    "email"
  ]
}

Update a User
PUT/api/v1/users/{id}

Requires valid API key with role of user, admin, or service. A user can only update their own user account. An admin or service can update any user account.

Requires valid API key with role of admin or service to update role field.

The user’s SSO provider’s identifier (ssoId) can only be set by passing its value in the uid field of the body (as opposed to ssoId). uid can be set to null for any user by an admin. A service user may set it to null or any string, if and only if the request URL has a query string parameter update_uid=1 or update_uid=true (e.g. PUT /api/v1/users/{id}?update_uid=1).

Example URI

PUT /api/v1/users/id
URI Parameters
HideShow
id
number (required) 

ID of the User in the form of a big integer

Request
HideShow
Headers
Content-Type: application/json
Authorization: Bearer {api-key}
Body
{
  "name": "Jane Smith",
  "username": "janesmith",
  "email": "janesmith@email.com",
  "role": "admin",
  "firstName": "Jane",
  "lastName": "Smith",
  "phone": "801-322-3323",
  "password": "password",
  "passwordConfirmation": "password",
  "schoolId": null,
  "approved": true,
  "active": true
}
Response  200
HideShow
Headers
Content-Type: application/json
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Always returned as a string"
    },
    "name": {
      "type": "string"
    },
    "username": {
      "type": "string"
    },
    "email": {
      "type": "string",
      "description": "Either username/email are required. You only need one or the other."
    },
    "createdAt": {
      "type": "number"
    },
    "updatedAt": {
      "type": "number"
    },
    "role": {
      "type": "string",
      "description": "Must be user or admin"
    },
    "firstName": {
      "type": "string"
    },
    "lastName": {
      "type": "string"
    },
    "phone": {
      "type": "string"
    },
    "scopesCm": {
      "type": "string"
    },
    "ssoId": {
      "type": "string"
    },
    "schoolId": {
      "type": "string"
    },
    "approved": {
      "type": "boolean"
    },
    "active": {
      "type": "boolean"
    }
  },
  "required": [
    "email"
  ]
}

Deactivate User
DELETE/api/v1/users/{id}

Requires valid API key with role of admin. Also, this is essentially just sets the “active” property to false. An admin can reactivate a user.

Example URI

DELETE /api/v1/users/id
URI Parameters
HideShow
id
number (required) 

ID of the User in the form of a big integer

Request
HideShow
Headers
Content-Type: application/json
Authorization: Bearer {api-key}
Response  204

Current User

Get Current User
GET/api/v1/users/current

Example URI

GET /api/v1/users/current
Request
HideShow
Headers
Content-Type: application/json
Authorization: Bearer {api-key}
Response  200
HideShow
Headers
Content-Type: application/json
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Always returned as a string"
    },
    "name": {
      "type": "string"
    },
    "username": {
      "type": "string"
    },
    "email": {
      "type": "string",
      "description": "Either username/email are required. You only need one or the other."
    },
    "createdAt": {
      "type": "number"
    },
    "updatedAt": {
      "type": "number"
    },
    "role": {
      "type": "string",
      "description": "Must be user or admin"
    },
    "firstName": {
      "type": "string"
    },
    "lastName": {
      "type": "string"
    },
    "phone": {
      "type": "string"
    },
    "scopesCm": {
      "type": "string"
    },
    "ssoId": {
      "type": "string"
    },
    "schoolId": {
      "type": "string"
    },
    "approved": {
      "type": "boolean"
    },
    "active": {
      "type": "boolean"
    }
  },
  "required": [
    "email"
  ]
}

Users

List Users
GET/api/v1/users{?q,sort,limit,skip,attribute,fields,includeInactive}

Requires valid API key with role of user or admin.

Example URI

GET /api/v1/users?q=&sort=&limit=&skip=&attribute=&fields=&includeInactive=
URI Parameters
HideShow
q
string (optional) 

Full text search

Examples

?q=john

?q=jane.smith@university.com

sort
string (optional) 

Sorts results ascending or descending by one or more attributes

Add a dash to sort descending. Separate multiple attributes with a comma. Nested attributes are referenced with dot notation.

Examples

?sort=username

?sort=-updatedAt

?sort=username,email

?sort=updatedBy.impersonatedBy

limit
number (optional) 

Limits results

Examples

?limit=20

?limit=100

skip
number (optional) 

Skips a number of results. Useful for paging through results.

Examples

?limit=20&skip=0

?limit=20&skip=20

?limit=20&skip=40

attribute
string (optional) 

Search on one or more attributes.

Examples

?username=janesmith

?firstName=jim&email=jim@university.com

?active=false

fields
string (optional) 

Return only specific attributes

Examples

?fields=username,email

?fields=firstName,lastName,email

?fields=username,updatedBy.impersonatedBy

gt
string (optional) 

Return documents where the specified field is greater than a value. Add e to include equals

Examples

?created=gt(1490645684620)

?updated=gte(1490645684620)

lt
string (optional) 

Return documents where the specified field is less than a value. Add e to include equals

Examples

?created=lt(1490645684620)

?updated=lte(1490645684620)

includeInactive
boolean (optional) 

Return users that are both active and inactive

Examples

?includeInactive=true

Request
HideShow
Headers
Content-Type: application/json
Authorization: Bearer {authToken}
Response  200
HideShow
Headers
Content-Type: application/json
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "array"
}

Create a New User
POST/api/v1/users

Requires valid API key with role of admin. Email is the only required field. Email and username must be unique.

Example URI

POST /api/v1/users
Request
HideShow
Headers
Content-Type: application/json
Authorization: Bearer {api-key}
Body
{
  "name": "Jane Smith",
  "username": "janesmith",
  "email": "janesmith@email.com",
  "role": "admin",
  "firstName": "Jane",
  "lastName": "Smith",
  "phone": "801-322-3323",
  "password": "password",
  "passwordConfirmation": "password",
  "schoolId": "3j33134HH",
  "approved": true,
  "active": true
}
Response  201
HideShow
Headers
Content-Type: application/json
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Always returned as a string"
    },
    "name": {
      "type": "string"
    },
    "username": {
      "type": "string"
    },
    "email": {
      "type": "string",
      "description": "Either username/email are required. You only need one or the other."
    },
    "createdAt": {
      "type": "number"
    },
    "updatedAt": {
      "type": "number"
    },
    "role": {
      "type": "string",
      "description": "Must be user or admin"
    },
    "firstName": {
      "type": "string"
    },
    "lastName": {
      "type": "string"
    },
    "phone": {
      "type": "string"
    },
    "scopesCm": {
      "type": "string"
    },
    "ssoId": {
      "type": "string"
    },
    "schoolId": {
      "type": "string"
    },
    "approved": {
      "type": "boolean"
    },
    "active": {
      "type": "boolean"
    }
  },
  "required": [
    "email"
  ]
}

Groups

Groups usually belong to Categories. An example Category is Department, and an example Group is Math Department.

Both Groups and Categories have an optional parentId. This ID refers to it’s parent in the hierarchy. For example: Department’s parentID could point to College. The parentID always refers to the same type of thing. Meaning Group -> Group and Category -> Category.

A Group will inherit it’s rolesSchemas and fieldsSchemas from it’s Category. The Group may optionally override these schemas. If the Group is uncategorized, this step isn’t optional.

Determining field/role data goes as such: We look up the ID of the field, then try to find that ID in the Group’s fieldSchemas. If the Group doesn’t have a fieldSchemas then we look in this Group’s Category’s fieldSchemas.

Groups now support extra relationships besides the main hierarchy. You do this by adding in relationship schemas to the category:

{
  "name": "My Category",
  "relationshipSchemas": [
    {
      "id": "{this is autogenerated, do not include when creating a new relationship}",
      "name": "Other Relationship",
      "categoryId": "{some other category's id}"
    }
  ]
}

Then in your Group, you can reference that relationship schema when you create or edit your group:

{
  "name": "My Group",
  "categoryId": "{the parent category's id}",
  "relationships": [
    {
      "id": "{this is the id from the relationship schema from the parent category}",
      "value": "{the group id of the group that belongs to the category of the relationshipSchema}"
    }
  ]
}

Groups

GET All Groups
GET/api/v1/groups/

Note that you can also perform queries like these to get a group which has a specific field or role value set:

/api/v1/groups/?:field(:id)=:value

/api/v1/groups/?fields(abc)=Pizza

/api/v1/groups/?roles(def)=12345

You can also query all groups that are active during a specific date:

/api/v1/groups/?date=2016-10-05T21:36:21.261Z

Example URI

GET /api/v1/groups/
URI Parameters
HideShow
limit
number (optional) Example: 100
q
string (optional) 
skip
number (optional) Example: 50
sort
string (optional) Example: name
fields
string (optional) 
date
date (optional) Example: 2015-08-21T22:11:06.819Z
attrs
string (optional) 
Response  200
HideShow
Headers
Content-Type: application/json
Body
[
  {
    "createdAt": "2015-08-21T03:54:08.037Z",
    "updatedAt": "2015-08-21T03:54:08.037Z",
    "parentId": "NkmhsBPWg",
    "categoryId": "119f7a58-e1fc-413a-a142-4aee79bce1dd",
    "roleSchemas": null,
    "fieldSchemas": null,
    "relationships": [],
    "roles": [
      {
        "id": "V1MdR8Wa",
        "value": [
          "1222441197546670425"
        ]
      },
      {
        "id": "VJgLTsS3",
        "value": [
          "1222441197546670425"
        ]
      }
    ],
    "name": "Anthropology ",
    "fields": [],
    "updatedBy": {
      "id": null,
      "impersonatedBy": null
    },
    "startDate": "2016-05-11T19:04:44.000Z",
    "id": "Nymd9BPZl",
    "newId": "5723833601089f965098b752",
    "versionId": "5723833601089f965098b753"
  },
  {
    "createdAt": "2015-08-21T03:54:08.037Z",
    "updatedAt": "2016-05-01T21:53:13.992Z",
    "parentId": "NyT-3rvZg",
    "categoryId": "119f7a58-e1fc-413a-a142-4aee79bce1dd",
    "roleSchemas": null,
    "fieldSchemas": null,
    "relationships": [],
    "roles": [
      {
        "id": "V1MdR8Wa",
        "value": [
          "1265960897903199194"
        ]
      },
      {
        "id": "VJgLTsS3",
        "value": [
          "1211458244238715555"
        ]
      }
    ],
    "name": "Accounting ",
    "fields": [],
    "updatedBy": {
      "id": null,
      "impersonatedBy": null
    },
    "startDate": "2016-05-11T19:04:44.000Z",
    "id": "VyU69HPZx",
    "newId": "5723833601089f965098b755",
    "versionId": "5723833601089f965098b756"
  }
]

Groups

Create Groups
POST/api/v1/groups/

Requires valid API key with role of user or admin.

Calling this endpoint will create a group. A Group has an optional categoryId that should be given during the POST and can’t be changed after the Group has been created. It refers to the Category that this Group belongs to. If it isn’t present, it means the Group is uncategorized (i.e: Financial Aid).

Example URI

POST /api/v1/groups/
Request
HideShow
Body
{
  "name": "",
  "parentId": null,
  "categoryId": null,
  "fields": [],
  "roles": [],
  "relationships": [],
  "startDate": "2016-05-11T19:04:44.000Z"
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "updatedAt": "2016-05-11T19:04:44.000Z",
  "createdAt": "2016-05-11T19:04:44.000Z",
  "parentId": null,
  "categoryId": null,
  "roleSchemas": null,
  "fieldSchemas": null,
  "relationships": [],
  "roles": [],
  "name": "",
  "fields": [],
  "updatedBy": {
    "id": null,
    "impersonatedBy": null
  },
  "startDate": "2016-05-11T19:04:44.000Z",
  "id": "5733824ccd04dfaf58f5a2e9",
  "newId": "5733824ccd04dfaf58f5a2e9",
  "versionId": "5733824ccd04dfaf58f5a2f0"
}

GET Group
GET/api/v1/groups/{id}/{?date,fields}

Example URI

GET /api/v1/groups/NJEY2BvZg/?date=2015-08-21T22:11:06.819Z&fields=
URI Parameters
HideShow
id
string (required) Example: NJEY2BvZg
fields
string (optional) 
date
date (optional) Example: 2015-08-21T22:11:06.819Z
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "createdAt": "2015-08-21T22:11:06.819Z",
  "updatedAt": "2015-08-21T22:11:06.819Z",
  "parentId": "EyuEAXdn",
  "categoryId": "f6da4d4a-b490-4172-9e54-07b56ab1fc4d",
  "roleSchemas": null,
  "fieldSchemas": null,
  "relationships": [
    {
      "id": "1275390383522169639",
      "value": "1275390383522169640"
    }
  ],
  "roles": [
    {
      "id": "EysWRQdh",
      "value": [
        "1275390383522169638"
      ]
    },
    {
      "id": "NyaBoBep",
      "value": [
        "1275390383522169638"
      ]
    },
    {
      "id": "V1TydEZC",
      "value": [
        "1275390383522169638"
      ]
    }
  ],
  "name": "College of Science",
  "fields": [],
  "updatedBy": {
    "id": null,
    "impersonatedBy": null
  },
  "startDate": "2015-08-21T22:11:06.819Z",
  "id": "NJEY2BvZg",
  "newId": "5723833601089f965098b78a",
  "versionId": "5723833601089f965098b78b"
}
Response  404
HideShow
Headers
Content-Type: text/plain
Body
"Group not found"

Update Group
PUT/api/v1/groups/{id}/

Requires valid API key with role of user or admin.

Modify a group by sending a PUT request with the modified JSON representation of the group as the body. The response will return the modified version of the group, or a 404 if no group with that id is found.

Example URI

PUT /api/v1/groups/NJEY2BvZg/
URI Parameters
HideShow
id
string (required) Example: NJEY2BvZg
Request
HideShow
Body
{
  "name": "College of Computer Science"
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "createdAt": "2015-08-21T22:11:06.819Z",
  "updatedAt": "2015-08-21T22:11:06.819Z",
  "parentId": "EyuEAXdn",
  "categoryId": "f6da4d4a-b490-4172-9e54-07b56ab1fc4d",
  "roleSchemas": null,
  "fieldSchemas": null,
  "relationships": [],
  "roles": [
    {
      "id": "EysWRQdh",
      "value": [
        "1275390383522169638"
      ]
    },
    {
      "id": "NyaBoBep",
      "value": [
        "1275390383522169638"
      ]
    },
    {
      "id": "V1TydEZC",
      "value": [
        "1275390383522169638"
      ]
    }
  ],
  "name": "College of Computer Science",
  "fields": [],
  "updatedBy": {
    "id": null,
    "impersonatedBy": null
  },
  "id": "NJEY2BvZg",
  "newId": "5723833601089f965098b78a"
}
Response  404
HideShow
Headers
Content-Type: text/plain
Body
"Group not found"

Delete Group
DELETE/api/v1/groups/{id}/

Requires valid API key with role of user or admin.

Calling this endpoint will delete a group.

Example URI

DELETE /api/v1/groups/NJEY2BvZg/
URI Parameters
HideShow
id
string (required) Example: NJEY2BvZg
Response  204
HideShow
Headers
Content-Type: application/json
Response  404
HideShow
Headers
Content-Type: text/plain
Body
"Group not found"

GET Group Versions
GET/api/v1/groups/{id}/versions

Example URI

GET /api/v1/groups/id/versions
URI Parameters
HideShow
id
string (required) 
Response  200
HideShow
Headers
Content-Type: application/json
Body
[
  {
    "parentId": "EyuEAXdn",
    "categoryId": "f6da4d4a-b490-4172-9e54-07b56ab1fc4d",
    "roleSchemas": null,
    "fieldSchemas": null,
    "relationships": [],
    "roles": [
      {
        "id": "EysWRQdh",
        "value": [
          "1275390383522169638"
        ]
      },
      {
        "id": "NyaBoBep",
        "value": [
          "1275390383522169638"
        ]
      },
      {
        "id": "V1TydEZC",
        "value": [
          "1275390383522169638"
        ]
      }
    ],
    "name": "College of Computer Science",
    "fields": [],
    "startDate": "2015-08-21T22:11:06.819Z",
    "versionId": "5723833601089f965098b78b"
  }
]

Get Specific Group Version
GET/api/v1/groups/{id}/versions/{versionId}

Example URI

GET /api/v1/groups/id/versions/versionId
URI Parameters
HideShow
id
string (required) 
versionId
string (required) 
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "parentId": "EyuEAXdn",
  "categoryId": "f6da4d4a-b490-4172-9e54-07b56ab1fc4d",
  "roleSchemas": null,
  "fieldSchemas": null,
  "relationships": [],
  "roles": [
    {
      "id": "EysWRQdh",
      "value": [
        "1275390383522169638"
      ]
    },
    {
      "id": "NyaBoBep",
      "value": [
        "1275390383522169638"
      ]
    },
    {
      "id": "V1TydEZC",
      "value": [
        "1275390383522169638"
      ]
    }
  ],
  "name": "College of Computer Science",
  "startDate": "2015-08-21T22:11:06.819Z",
  "versionId": "5723833601089f965098b78b"
}

Categories

Create Categories
POST/api/v1/categories/

Requires valid API key with role of user or admin.

Calling this endpoint will create a group.

Example URI

POST /api/v1/categories/
Request
HideShow
Body
{
  "name": "",
  "parentId": null,
  "roleSchemas": [],
  "fieldSchemas": [],
  "startDate": "2016-05-11T19:07:02.000Z"
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "updatedAt": "2016-05-11T19:07:02.000Z",
  "createdAt": "2016-05-11T19:07:02.000Z",
  "parentId": null,
  "updatedBy": {
    "id": "1366722463207349147",
    "impersonatedBy": null
  },
  "relationshipSchemas": [],
  "roleSchemas": [],
  "name": "",
  "fieldSchemas": [],
  "startDate": "2016-05-11T19:07:02.000Z",
  "id": "573382d652077a067d72762d",
  "newId": "573382d652077a067d72762d",
  "versionId": "573382d652077a067d72762e"
}

GET Category
GET/api/v1/categories/{id}/

Example URI

GET /api/v1/categories/f6da4d4a-b490-4172-9e54-07b56ab1fc4d/
URI Parameters
HideShow
id
string (required) Example: f6da4d4a-b490-4172-9e54-07b56ab1fc4d
fields
string (optional) 
date
string (optional) Example: 2015-08-21T22:11:06.819Z
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "createdAt": "2015-08-21T22:11:06.819Z",
  "updatedAt": "2015-08-21T22:11:06.819Z",
  "parentId": "f3b9d0dc-2a39-48aa-b5d4-2ddbd458a25f",
  "relationshipSchemas": [],
  "roleSchemas": [
    {
      "id": "EysWRQdh",
      "name": "College Reviewer ",
      "description": ""
    },
    {
      "id": "NyaBoBep",
      "name": "Dean",
      "description": ""
    },
    {
      "id": "V1TydEZC",
      "name": "Administrator",
      "description": ""
    }
  ],
  "name": "College",
  "fieldSchemas": [
    {
      "id": "4JBIsHea",
      "type": "text",
      "name": "Phone"
    }
  ],
  "updatedBy": {
    "id": null,
    "impersonatedBy": null
  },
  "startDate": "2015-08-21T22:11:06.819Z",
  "id": "f6da4d4a-b490-4172-9e54-07b56ab1fc4d",
  "newId": "5723833601089f965098b71c",
  "versionId": "5723833601089f965098b71d"
}
Response  404
HideShow
Headers
Content-Type: text/plain
Body
"Category not found"

Update Category
PUT/api/v1/categories/{id}/

Requires valid API key with role of user or admin.

Modify a category by sending a PUT request with the modified JSON representation of the category as the body. The response will return the modified version of the group, or a 404 if no group with that id is found.

Example URI

PUT /api/v1/categories/f6da4d4a-b490-4172-9e54-07b56ab1fc4d/
URI Parameters
HideShow
id
string (required) Example: f6da4d4a-b490-4172-9e54-07b56ab1fc4d
Request
HideShow
Body
{
  "name": "College of Math"
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "createdAt": "2015-08-21T22:11:06.819Z",
  "updatedAt": "2015-08-21T22:11:06.819Z",
  "parentId": "f3b9d0dc-2a39-48aa-b5d4-2ddbd458a25f",
  "relationshipSchemas": [],
  "roleSchemas": [
    {
      "id": "EysWRQdh",
      "name": "College Reviewer ",
      "description": ""
    },
    {
      "id": "NyaBoBep",
      "name": "Dean",
      "description": ""
    },
    {
      "id": "V1TydEZC",
      "name": "Administrator",
      "description": ""
    }
  ],
  "name": "College of Math",
  "fieldSchemas": [
    {
      "id": "4JBIsHea",
      "type": "text",
      "name": "Phone"
    }
  ],
  "updatedBy": {
    "id": null,
    "impersonatedBy": null
  },
  "startDate": "2015-08-21T22:11:06.819Z",
  "id": "f6da4d4a-b490-4172-9e54-07b56ab1fc4d",
  "newId": "5723833601089f965098b71c",
  "versionId": "5723833601089f965098b71d"
}
Response  404
HideShow
Headers
Content-Type: text/plain
Body
"Category not found"

Delete Category
DELETE/api/v1/categories/{id}/

Requires valid API key with role of user or admin.

Calling this endpoint will delete a category. Note that you can’t delete a Category unless you’ve first deleted all Groups associated with that Category.

Example URI

DELETE /api/v1/categories/f6da4d4a-b490-4172-9e54-07b56ab1fc4d/
URI Parameters
HideShow
id
string (required) Example: f6da4d4a-b490-4172-9e54-07b56ab1fc4d
Response  204
HideShow
Headers
Content-Type: application/json
Response  404
HideShow
Headers
Content-Type: text/plain
Body
"Category not found"

GET Category Versions
GET/api/v1/categories/{id}/versions

Example URI

GET /api/v1/categories/id/versions
URI Parameters
HideShow
id
string (required) 
Response  200
HideShow
Headers
Content-Type: application/json
Body
[
  {
    "parentId": "f3b9d0dc-2a39-48aa-b5d4-2ddbd458a25f",
    "relationshipSchemas": [],
    "roleSchemas": [
      {
        "id": "EysWRQdh",
        "name": "College Reviewer ",
        "description": ""
      },
      {
        "id": "NyaBoBep",
        "name": "Dean",
        "description": ""
      },
      {
        "id": "V1TydEZC",
        "name": "Administrator",
        "description": ""
      }
    ],
    "name": "Department",
    "fieldSchemas": [
      {
        "id": "4JBIsHea",
        "type": "text",
        "name": "Phone"
      }
    ],
    "updatedBy": {
      "id": null,
      "impersonatedBy": null
    },
    "startDate": "2015-08-21T22:11:06.819Z",
    "versionId": "5723833601089f965098b71d"
  }
]

Get Specific Category Version
GET/api/v1/categories/{id}/versions/{versionId}

Example URI

GET /api/v1/categories/id/versions/versionId
URI Parameters
HideShow
id
string (required) 
versionId
string (required) 
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "parentId": "f3b9d0dc-2a39-48aa-b5d4-2ddbd458a25f",
  "relationshipSchemas": [],
  "roleSchemas": [
    {
      "id": "EysWRQdh",
      "name": "College Reviewer ",
      "description": ""
    },
    {
      "id": "NyaBoBep",
      "name": "Dean",
      "description": ""
    },
    {
      "id": "V1TydEZC",
      "name": "Administrator",
      "description": ""
    }
  ],
  "name": "Department",
  "fieldSchemas": [
    {
      "id": "4JBIsHea",
      "type": "text",
      "name": "Phone"
    }
  ],
  "updatedBy": {
    "id": null,
    "impersonatedBy": null
  },
  "startDate": "2015-08-21T22:11:06.819Z",
  "versionId": "5723833601089f965098b71d"
}

Jobs

In order to interact with the jobs api, you need to be compliant with our service to service authentication protocol. You’ll need to have the shared secret and generate a JWT with that secret.

Once you have the secret in your config, when you make a request, you need to add the following header to your requests to the jobs api:

Authorization: Bearer {json web token}

If you are using node, we have created a library to make this super easy.

npm install --save service2service

I won’t include all of the documentation here, but here is how you would make a request using that library:

const ServiceAgent = require('service2service')

const SUPER_SECRET = 'foobar' // You should get the real service secret

const agent = new ServiceAgent({
  secret: SUPER_SECRET // This can be an array of secrets, but it will always use the first one
})

agent
  .request({
    method: 'POST',
    uri: 'https://institution.kuali.co/api/v1/jobs',
    body: {
      name: 'Weekly reports',
      appId: '575ad5ef5129fdf20e2b20f8',
      method: 'post',
      url: 'https://institution.kuali.co/coi/api/emails',
      payload: {
        recipients: [ 'test@kuali.co' ]
      },
      startTimestamp: 1457477372173,
      recurrenceType: 'week',
      frequency: 1
    },
    json: true
  })
  .then((job) => {
    console.log('Your job has been created', job)
  })

The next thing you’ll need to do is set up the endpoint that jobs will call when time comes for the job to run. You should set up the same JWT authentication. Jobs will use the same shared secret that you would use to send requests. Again, if you’re using node, there is some helper middleware to help with this authentication:

const serviceAuth = require('service2service/express') // koa version available at service2service/koa

const SUPER_SECRET = 'foobar' // You should get the real service secret

app.post('/coi/api/emails',
  serviceAuth({ secret: SUPER_SECRET }),
  (req, res, next) => {
    const recipients = req.body.recipients // sent from the jobs payload
    // TODO send emails with recipients
    res.send('success') // Whatever you send back will be stored in the job result
  })
})

Job

Retrieve a Job
GET/api/v1/jobs/{id}

Example URI

GET /api/v1/jobs/id
URI Parameters
HideShow
id
string (required) 

ID of the Job in the form of a mongo id

Request
HideShow
Headers
Content-Type: application/json
Authorization: Bearer {service-token}
Response  200
HideShow
Headers
Content-Type: application/json
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Always returned as a string"
    },
    "name": {
      "type": "string"
    },
    "appId": {
      "type": "string",
      "description": "The application id using the api. Using the apps api (/api/v1/apps)"
    },
    "typeId": {
      "type": "string",
      "description": "A unique identifier used by your application for application specific jobs. Use if you don't want to accidentally create a duplicate of a job"
    },
    "createdBy": {
      "type": "string",
      "description": "A user's id, if you'd like to tie this job to a user"
    },
    "active": {
      "type": "boolean"
    },
    "createdAt": {
      "type": "number"
    },
    "method": {
      "type": "string",
      "description": "The http method to use when running the job"
    },
    "url": {
      "type": "string",
      "description": "The absolute url to call when running the job"
    },
    "payload": {
      "type": "object",
      "properties": {},
      "description": "The JSON payload to send to the url"
    },
    "nextTimestamp": {
      "type": "number",
      "description": "The next time the job will run. This cannot be edited directly"
    },
    "startTimestamp": {
      "type": "number",
      "description": "The start date of the job"
    },
    "endTimestamp": {
      "type": "number",
      "description": "The end date of the job"
    },
    "recurrenceType": {
      "type": "string",
      "description": "Can be 'once', 'day', 'week', 'month', 'year'"
    },
    "frequency": {
      "type": "number",
      "description": "To be used with recurrenceTypes other than 'once'. e.g. if set to 2, means every 2 days/weeks/months/year"
    }
  },
  "required": [
    "name",
    "appId",
    "method",
    "url",
    "startTimestamp",
    "recurrenceType"
  ]
}

Update a Job
PUT/api/v1/jobs/{id}

Example URI

PUT /api/v1/jobs/id
URI Parameters
HideShow
id
string (required) 

ID of the Job in the form of a mongo id

Request
HideShow
Headers
Content-Type: application/json
Authorization: Bearer {service-token}
Body
{
  "name": "Email Someone",
  "active": true,
  "method": "post",
  "url": "http://example.com",
  "payload": {
    "recipients": []
  },
  "startTimestamp": 1457477372173,
  "endTimestamp": 1457477372173,
  "recurrenceType": "once",
  "frequency": 1
}
Response  200
HideShow
Headers
Content-Type: application/json
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Always returned as a string"
    },
    "name": {
      "type": "string"
    },
    "appId": {
      "type": "string",
      "description": "The application id using the api. Using the apps api (/api/v1/apps)"
    },
    "typeId": {
      "type": "string",
      "description": "A unique identifier used by your application for application specific jobs. Use if you don't want to accidentally create a duplicate of a job"
    },
    "createdBy": {
      "type": "string",
      "description": "A user's id, if you'd like to tie this job to a user"
    },
    "active": {
      "type": "boolean"
    },
    "createdAt": {
      "type": "number"
    },
    "method": {
      "type": "string",
      "description": "The http method to use when running the job"
    },
    "url": {
      "type": "string",
      "description": "The absolute url to call when running the job"
    },
    "payload": {
      "type": "object",
      "properties": {},
      "description": "The JSON payload to send to the url"
    },
    "nextTimestamp": {
      "type": "number",
      "description": "The next time the job will run. This cannot be edited directly"
    },
    "startTimestamp": {
      "type": "number",
      "description": "The start date of the job"
    },
    "endTimestamp": {
      "type": "number",
      "description": "The end date of the job"
    },
    "recurrenceType": {
      "type": "string",
      "description": "Can be 'once', 'day', 'week', 'month', 'year'"
    },
    "frequency": {
      "type": "number",
      "description": "To be used with recurrenceTypes other than 'once'. e.g. if set to 2, means every 2 days/weeks/months/year"
    }
  },
  "required": [
    "name",
    "appId",
    "method",
    "url",
    "startTimestamp",
    "recurrenceType"
  ]
}

Delete a Job
DELETE/api/v1/jobs/{id}

Example URI

DELETE /api/v1/jobs/id
URI Parameters
HideShow
id
string (required) 

ID of the Job in the form of a mongo id

Request
HideShow
Headers
Content-Type: application/json
Authorization: Bearer {service-token}
Response  204

Jobs

List Jobs
GET/api/v1/jobs

Example URI

GET /api/v1/jobs
Request
HideShow
Headers
Content-Type: application/json
Authorization: Bearer {service-token}
Response  200
HideShow
Headers
Item-Count: 10
Body
[
    + Attributes (Job)
]

Create Job
POST/api/v1/jobs

recurrenceType can have the following values: once, day, week, month, year.

frequency means how often the job will be run in relation to the recurrenceType. For example: a frequency of 1 and a recurrencyType of day means that the job will run once every 1 day. a frequency of 2 and a recurrencyType of week means that the job will run once every 2 weeks.

Example URI

POST /api/v1/jobs
Request
HideShow
Headers
Content-Type: application/json
Authorization: Bearer {service-token}
Body
{
  "name": "Email Someone",
  "appId": "575ad5ef5129fdf20e2b20f8",
  "method": "post",
  "url": "http://example.com",
  "payload": {
    "recipients": []
  },
  "startTimestamp": 1457477372173,
  "endTimestamp": 1457477372173,
  "recurrenceType": "once",
  "frequency": 1
}
Response  201
HideShow
Headers
Content-Type: application/json
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Always returned as a string"
    },
    "name": {
      "type": "string"
    },
    "appId": {
      "type": "string",
      "description": "The application id using the api. Using the apps api (/api/v1/apps)"
    },
    "typeId": {
      "type": "string",
      "description": "A unique identifier used by your application for application specific jobs. Use if you don't want to accidentally create a duplicate of a job"
    },
    "createdBy": {
      "type": "string",
      "description": "A user's id, if you'd like to tie this job to a user"
    },
    "active": {
      "type": "boolean"
    },
    "createdAt": {
      "type": "number"
    },
    "method": {
      "type": "string",
      "description": "The http method to use when running the job"
    },
    "url": {
      "type": "string",
      "description": "The absolute url to call when running the job"
    },
    "payload": {
      "type": "object",
      "properties": {},
      "description": "The JSON payload to send to the url"
    },
    "nextTimestamp": {
      "type": "number",
      "description": "The next time the job will run. This cannot be edited directly"
    },
    "startTimestamp": {
      "type": "number",
      "description": "The start date of the job"
    },
    "endTimestamp": {
      "type": "number",
      "description": "The end date of the job"
    },
    "recurrenceType": {
      "type": "string",
      "description": "Can be 'once', 'day', 'week', 'month', 'year'"
    },
    "frequency": {
      "type": "number",
      "description": "To be used with recurrenceTypes other than 'once'. e.g. if set to 2, means every 2 days/weeks/months/year"
    }
  },
  "required": [
    "name",
    "appId",
    "method",
    "url",
    "startTimestamp",
    "recurrenceType"
  ]
}

Job Result

Retrieve job results by job id
GET/api/v1/jobs/results

Example URI

GET /api/v1/jobs/results
Request
HideShow
Headers
Content-Type: application/json
Authorization: Bearer {service-token}
Response  200
HideShow
Headers
Content-Type: application/json
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Always returned as a string"
    },
    "job": {
      "type": "string",
      "description": "The job id this result is tied to"
    },
    "test": {
      "type": "boolean",
      "description": "Whether or not the result was a test run"
    },
    "success": {
      "type": "boolean"
    },
    "response": {
      "type": "object",
      "properties": {}
    },
    "createdAt": {
      "type": "number",
      "description": "When the request started"
    },
    "responseTimestamp": {
      "type": "number",
      "description": "When the request ended"
    }
  },
  "required": [
    "job"
  ]
}

Run a job manually
POST/api/v1/jobs/results

When you specify ?test=true in the url, it will run the job as a test. When a test run is called, it will call the job’s specified endpoint with the Dry-Run header set to 1. The endpoint that you have set up in the associated job should handle that so that you don’t actually execute on that. Here is an example express middleware function you can use to prevent accidental execution:

app.get('/some/endpoint/the-job-api-hits',
  (req, res, next) => {
    if (req.get('Dry-Run') === '1') return res.send('success')
    next()
  },
  (req, res, next) => {
    // Do the actual job handling here
  }
)

Example URI

POST /api/v1/jobs/results
Request
HideShow
Headers
Content-Type: application/json
Authorization: Bearer {service-token}

Forms V2

Forms are made up of 3 parts: the Form, the Document, and the Form Container.

  • The Form Container is a labeled Data Type which has one or more Forms attached.

  • The Form defines a form template, similar to an object-oriented class definition.

  • Documents are instances of a given Form.

Version 2 is the recommended version for interacting with the Forms service.

Forms V2 Upgrade Guide

Version 2 of the Forms API provides the ability to create multiple versions of a Form within a given FormContainer so that you can evolve your Forms over time without breaking Documents which were created on a previous version of the Form. The API is currently very strict, disallowing Form updates or deletes if there are any Documents attached to that Form version. See the Forms documentation below for more information.

General Changes

  • Change all endpoint requests to hit /v2/ instead of /v1/.

  • Change all PUT endpoints for updates to send PATCH requests instead.

  • Field-level changes:

    • The _id property has been renamed to id for all resource types.
    • FormContainer:
      • The lbl property has been renamed to label.
    • Form:
      • The metaId property has been renamed to formContainerId.
      • The tmpl property has been renamed to template.
      • The trashed property has been removed, as with form versioning it is no longer necessary.
    • Document:
      • Added the formId which references the Form that the document was created under.
      • When creating a new Document via POST, you must provide the data key at the top-level of the request body, for consistency with the update request. Previously the whole request body was used as the data object.

Endpoints to support V2 Form Versioning

In order to support versioning of Form records, the following endpoints have been added or modified from their v1 counterparts.

  • Changed all /cor/forms/api/v2/forms/... endpoints that accepted an ID in the URL now expect that ID to be the formId, NOT the formContainerId. Note this only applies to the /forms/ resource, not the /documents/ or /form-containers/ resources.

  • Changed PATCH /cor/forms/api/v2/forms/:id to reject the request if the form has one or more documents associated to it.

  • Changed DELETE /cor/forms/api/v2/forms/:id to reject the request if the form has one or more documents associated to it.

  • Added GET /cor/forms/api/v2/form-containers/:id/forms/current for fetching the most recently created form for a FormContainer (e.g. the “current” version).

  • Added GET /cor/forms/api/v2/form-containers/:id/forms/current/documents for fetching all documents attached to the “current” Form of the referenced FormContainer.

  • Added POST /cor/forms/api/v2/form-containers/:id/forms/current/documents for creating a new document attached to the “current” Form of the referenced FormContainer.

  • Added GET /cor/forms/api/v2/forms/:id/documents for fetching all documents attached to the referenced Form.

  • Added POST /cor/forms/api/v2/forms/:id/documents for creating a new document attached to the referenced Form.

FormContainers

A FormContainer resource represents an umbrella structure which owns one or more versions of a Form schema, along with all Documents associated through the child Forms. The FormContainer has a String label property which is used for storing the human-readable name of the underlying Forms.

In addition to the standard REST endpoints for working with the FormContainer by listing or ID, endpoints are also provided for working with downstream Forms and Documents as well. See their respective documentation for those endpoints.

Get All FormContainers
GET/cor/forms/api/v2/form-containers

Returns a list of all form-containers you have permission to read based on the given API Key. Note that you may receive an empty array if you do not have any FormContainers created or readable by you.

Example URI

GET /cor/forms/api/v2/form-containers
Response  200
HideShow
  • Returns a JSON array of zero or more FormContainer objects.
Headers
Content-Type: application/json
Body
[
  {
    "id": "5923e510b630f13200885baf",
    "label": "games",
    "icon": "film",
    "searchHeaders": [
      {
        "id": "5923e510b630f13200885bb3",
        "formKey": "data.title",
        "displayName": "Title"
      }
    ],
    "tags": [],
    "deleted": false,
    "hidden": false,
    "multipage": false,
    "createdAt": "2017-05-23T07:30:24.262Z",
    "updatedAt": "2017-05-23T08:30:15.899Z"
  }
]

Get My FormContainers
GET/cor/forms/api/v2/form-containers/my

Returns a list of all form-containers you have permission to update based on the given API Key. Note that you may receive an empty array if you do not have any FormContainers created or writable by you.

Example URI

GET /cor/forms/api/v2/form-containers/my
Response  200
HideShow
  • Returns a JSON array of zero or more FormContainer objects.
Headers
Content-Type: application/json
Body
[
  {
    "id": "5923e510b630f13200885baf",
    "updatedAt": "2017-05-23T08:30:15.899Z",
    "createdAt": "2017-05-23T07:30:24.262Z",
    "deleted": false,
    "hidden": false,
    "multipage": false,
    "searchHeaders": [
      {
        "id": "5923e510b630f13200885bb3",
        "formKey": "data.title",
        "displayName": "Title"
      }
    ],
    "tags": [],
    "icon": "film",
    "label": "games"
  }
]

Get FormContainer
GET/cor/forms/api/v2/form-containers/:id

Get the FormContainer record for the given ID, or a 404.

Example URI

GET /cor/forms/api/v2/form-containers/:id
URI Parameters
HideShow
`id`
String (required) Example: 5923e510b630f13200885baf
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "id": "5923e510b630f13200885baf",
  "label": "games",
  "icon": "film",
  "searchHeaders": [
    {
      "id": "5923e510b630f13200885bb3",
      "formKey": "data.title",
      "displayName": "Title"
    }
  ],
  "tags": [],
  "deleted": false,
  "hidden": false,
  "multipage": false,
  "updatedAt": "2017-05-23T08:30:15.899Z",
  "createdAt": "2017-05-23T07:30:24.262Z"
}
Response  404
HideShow
Headers
Content-Type: text/plain
Body
Not Found

Create a new FormContainer
POST/cor/forms/api/v2/form-containers

Create a new FormContainer with a given label. It’s important to note that a default Form will also be created. See the Form documentation for more information on working with Form resources.

Acceptable keys are:

  • label - String

Example URI

POST /cor/forms/api/v2/form-containers
Request
HideShow
Headers
Content-Type: application/json
Body
{
  "label": "film"
}
Response  200
HideShow
Headers
Content-Type: appliation/json
Body
{
  "id": "5956c1ccbaa3c41b085e02d6",
  "label": "film",
  "icon": "",
  "searchHeaders": [
    {
      "id": "5956c1ccbaa3c41b085e02da",
      "formKey": "data.title",
      "displayName": "Title"
    },
    {
      "id": "5956c1ccbaa3c41b085e02d9",
      "formKey": "data.description",
      "displayName": "Description"
    },
    {
      "id": "5956c1ccbaa3c41b085e02d8",
      "formKey": "createdAt",
      "displayName": "Created"
    },
    {
      "id": "5956c1ccbaa3c41b085e02d7",
      "formKey": "updatedAt",
      "displayName": "Updated"
    }
  ],
  "tags": [],
  "deleted": false,
  "hidden": false,
  "multipage": false,
  "createdAt": "2017-06-30T21:25:32.929Z",
  "updatedAt": "2017-06-30T21:25:32.929Z"
}

Update a FormContainer
PATCH/cor/forms/api/v2/form-containers/:id

Performs a merge update to an existing FormContainer by ID. Acceptable keys are:

  • label - String

  • icon - String

  • tags - [String]

  • searchHeaders - [{displayName: String, formKey: String }]

  • multipage - Boolean

  • hidden - Boolean

  • deleted - Boolean

Example URI

PATCH /cor/forms/api/v2/form-containers/:id
URI Parameters
HideShow
`id`
String (required) Example: 5923e510b630f13200885baf
Request
HideShow
Headers
Content-Type: application/json
Body
{
  "label": "Hidden Games",
  "hidden": true
}
Response  200
HideShow
  • The updated FormContainer object.
Headers
Content-Type: application/json
Body
{
  "id": "5923e510b630f13200885baf",
  "updatedAt": "2017-05-23T08:30:15.899Z",
  "createdAt": "2017-05-23T07:30:24.262Z",
  "deleted": false,
  "hidden": true,
  "multipage": false,
  "searchHeaders": [
    {
      "id": "5923e510b630f13200885bb3",
      "formKey": "data.title",
      "displayName": "Title"
    }
  ],
  "tags": [],
  "icon": "film",
  "label": "Hidden Games"
}
Response  400
HideShow
  • Returned when using an invalid ID.
Body
Invalid ID
Response  404
HideShow
  • Returned when the object does not exist or you do not have permission to update it.
Body
Not Found

Delete a FormContainer
DELETE/cor/forms/api/v2/form-containers/:id

Deletes a FormContainer by ID.

Example URI

DELETE /cor/forms/api/v2/form-containers/:id
URI Parameters
HideShow
`id`
String (required) Example: 5923e510b630f13200885baf
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
"id": "5923e510b630f13200885baf",
"label": "games"
"searchHeaders": [
{
  "id": "5923e510b630f13200885bb3",
  "formKey": "data.title",
  "displayName": "Title"
}
],
"tags": [],
"icon": "film",
"deleted": true,
"hidden": true,
"multipage": false,
"createdAt": "2017-05-23T07:30:24.262Z",
"updatedAt": "2017-06-30T21:21:21.002Z"
}
Response  400
HideShow
  • Returned when using an invalid ID.
Body
Invalid ID
Response  404
HideShow
  • Returned when an object does not exist or you do not have permission to view it.
Headers
Content-Type: text/plain
Body
Not Found

Forms

A Form resource is a highly configurable data structure which stores the configuration of any Form to be used with the Kuali Formbot library. The libary in conjunction with this service provides the user with the ability to create forms of varied complexity to store user or system entered data, while supporting a vast array of data types in the individual form fields, known as Gadgets.

All of the Form data is stored in the template key. The Form is associated to other versions of the same form type through it’s shared parent resource known as the FormContainer. The child is associated to the parent through the formContainerId field on the Form. Whenever a new FormContainer is created, a default Form version is also created and can be updated with whatever template the developer sees fit to provide.

The documentation for how to build and manage Forms with the Formbot library is outside the scope of this document.

Get all FormContainer Forms
GET/cor/forms/api/v2/form-containers/:id/forms

Get all Forms for the FormContainer with the given ID. This endpoint will always return an array containing at least one Form, since a Form is always created at the same time that the FormContainer is created.

Example URI

GET /cor/forms/api/v2/form-containers/:id/forms
URI Parameters
HideShow
`id`
string (required) Example: 5923e510b630f13200885baf
Response  200
HideShow
Headers
Content-Type: application/json
Body
[
  {
    "id": "5923e510b630f13200885bb4",
    "formContainerId": "5923e510b630f13200885baf",
    "template": {
      "type": "Column",
      "children": [
        {
          "children": [
            {
              "children": [
                {
                  "type": "Row",
                  "children": [
                    {
                      "children": [
                        {
                          "type": "Column",
                          "children": [
                            {
                              "type": "Text",
                              "formKey": "title",
                              "label": "Title"
                            }
                          ]
                        }
                      ],
                      "type": "Row"
                    }
                  ]
                },
                {
                  "type": "RichText",
                  "formKey": "description",
                  "label": "Description"
                },
                {
                  "type": "GroupTypeahead",
                  "formKey": "courses",
                  "label": "Courses",
                  "details": {
                    "categoryId": "bd0f2d0b-2c21-4bdd-be1f-6810475c10d8"
                  },
                  "required": false
                }
              ],
              "type": "Column"
            }
          ],
          "type": "Section"
        }
      ]
    },
    "createdAt": "2017-05-23T07:30:24.272Z",
    "updatedAt": "2017-05-25T17:03:32.633Z"
  }
]

Get a Form
GET/cor/forms/api/v2/forms/:id

Get a Form by ID.

Example URI

GET /cor/forms/api/v2/forms/:id
URI Parameters
HideShow
`id`
string (required) Example: 5923e510b630f13200885bb4
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "id": "5923e510b630f13200885bb4",
  "formContainerId": "5923e510b630f13200885baf",
  "template": {
    "type": "Column",
    "children": [
      {
        "children": [
          {
            "children": [
              {
                "type": "Row",
                "children": [
                  {
                    "children": [
                      {
                        "type": "Column",
                        "children": [
                          {
                            "type": "Text",
                            "formKey": "title",
                            "label": "Title"
                          }
                        ]
                      }
                    ],
                    "type": "Row"
                  }
                ]
              },
              {
                "type": "RichText",
                "formKey": "description",
                "label": "Description"
              },
              {
                "type": "GroupTypeahead",
                "formKey": "courses",
                "label": "Courses",
                "details": {
                  "categoryId": "bd0f2d0b-2c21-4bdd-be1f-6810475c10d8"
                },
                "required": false
              }
            ],
            "type": "Column"
          }
        ],
        "type": "Section"
      }
    ]
  },
  "createdAt": "2017-05-23T07:30:24.272Z",
  "updatedAt": "2017-05-25T17:03:32.633Z"
}
Response  404

Get Form Schema
GET/cor/forms/api/v2/forms/:id/schema

Fetches the schema of a Form based on its template. This is equivalent to extracting all data gadgets and removing layout gadgets (e.g. Column, Row, Panel, etc).

Example URI

GET /cor/forms/api/v2/forms/:id/schema
URI Parameters
HideShow
`id`
string (required) Example: 5923e510b630f13200885bb4
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "id": "5923e510b630f13200885bb4",
  "formContainerId": "5923e510b630f13200885baf",
  "schema": {
    "title": {
      "type": "Text",
      "formKey": "title",
      "label": "Title"
    },
    "description": {
      "type": "RichText",
      "formKey": "description",
      "label": "Description"
    },
    "courses": {
      "type": "GroupTypeahead",
      "formKey": "courses",
      "label": "Courses",
      "details": {
        "categoryId": "bd0f2d0b-2c21-4bdd-be1f-6810475c10d8"
      },
      "required": false
    }
  }
}

Get the Current Form
GET/cor/forms/api/v2/form-containers/:id/forms/current

Get the current Form by its FormContainer ID. “Current” simply means the most recently created Form.

Example URI

GET /cor/forms/api/v2/form-containers/:id/forms/current
URI Parameters
HideShow
`id`
string (required) Example: 5923e510b630f13200885baf
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "id": "5923e510b630f13200885bb4",
  "formContainerId": "5923e510b630f13200885baf",
  "template": {
    "type": "Column",
    "children": [
      {
        "children": [
          {
            "children": [
              {
                "type": "Row",
                "children": [
                  {
                    "children": [
                      {
                        "type": "Column",
                        "children": [
                          {
                            "type": "Text",
                            "formKey": "title",
                            "label": "Title"
                          }
                        ]
                      }
                    ],
                    "type": "Row"
                  }
                ]
              },
              {
                "type": "RichText",
                "formKey": "description",
                "label": "Description"
              },
              {
                "type": "GroupTypeahead",
                "formKey": "courses",
                "label": "Courses",
                "details": {
                  "categoryId": "bd0f2d0b-2c21-4bdd-be1f-6810475c10d8"
                },
                "required": false
              }
            ],
            "type": "Column"
          }
        ],
        "type": "Section"
      }
    ]
  },
  "createdAt": "2017-05-23T07:30:24.272Z",
  "updatedAt": "2017-05-25T17:03:32.633Z"
}
Response  404

Create a new Form
POST/cor/forms/api/v2/form-containers/:id/forms

Create a Form for associated to the given FormContainer. Acceptable keys are:

  • template contains the template structure for a given form.

Example URI

POST /cor/forms/api/v2/form-containers/:id/forms
URI Parameters
HideShow
`id`
string (required) Example: 5923e510b630f13200885baf
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "id": "5923e510b630f13200885bb4",
  "formContainerId": "5923e510b630f13200885baf",
  "template": {
    "type": "Column",
    "children": [
      {
        "children": [
          {
            "children": [
              {
                "type": "Row",
                "children": [
                  {
                    "children": [
                      {
                        "type": "Column",
                        "children": [
                          {
                            "type": "Text",
                            "formKey": "title",
                            "label": "Title"
                          }
                        ]
                      }
                    ],
                    "type": "Row"
                  }
                ]
              },
              {
                "type": "RichText",
                "formKey": "description",
                "label": "Description"
              },
              {
                "type": "GroupTypeahead",
                "formKey": "courses",
                "label": "Courses",
                "details": {
                  "categoryId": "bd0f2d0b-2c21-4bdd-be1f-6810475c10d8"
                },
                "required": false
              }
            ],
            "type": "Column"
          }
        ],
        "type": "Section"
      }
    ]
  },
  "createdAt": "2017-05-23T07:30:24.272Z",
  "updatedAt": "2017-05-25T17:03:32.633Z"
}
Response  403

Update a Form
PATCH/cor/forms/api/v2/forms/:id

Update the Form, referenced by its ID. The request is rejected with a 409 status if the Form has associated Documents.

Example URI

PATCH /cor/forms/api/v2/forms/:id
URI Parameters
HideShow
`id`
string (required) Example: 5923e510b630f13200885bb4
Request
HideShow
Headers
Content-Type: application/json
Body
{
  "template": {
    "type": "Column",
    "children": [
      {
        "children": [
          {
            "children": [
              {
                "type": "Row",
                "children": [
                  {
                    "children": [
                      {
                        "type": "Column",
                        "children": [
                          {
                            "type": "Text",
                            "formKey": "title",
                            "label": "Title"
                          }
                        ]
                      }
                    ],
                    "type": "Row"
                  }
                ]
              },
              {
                "type": "RichText",
                "formKey": "description",
                "label": "Description"
              },
              {
                "type": "GroupTypeahead",
                "formKey": "courses",
                "label": "Courses",
                "details": {
                  "categoryId": "bd0f2d0b-2c21-4bdd-be1f-6810475c10d8"
                },
                "required": false
              }
            ],
            "type": "Column"
          }
        ],
        "type": "Section"
      }
    ]
  }
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
"id": "5923e510b630f13200885bb4",
"updatedAt": "2017-05-25T17:03:32.633Z",
"createdAt": "2017-05-23T07:30:24.272Z",
"formContainerId": "5923e510b630f13200885baf",
"template": {
"type": "Column",
"children": [
  {
    "children": [
      {
        "children": [
          {
            "type": "Row",
            "children": [
              {
                "children": [
                  {
                    "type": "Column",
                    "children": [
                      {
                        "type": "Text",
                        "formKey": "title",
                        "label": "Title"
                      }
                    ]
                  }
                ],
                "type": "Row"
              }
            ]
          },
          {
            "type": "RichText",
            "formKey": "description",
            "label": "Description"
          },
          {
            "type": "GroupTypeahead",
            "formKey": "courses",
            "label": "Courses",
            "details": {
              "categoryId": "bd0f2d0b-2c21-4bdd-be1f-6810475c10d8"
            },
            "required": false
          }
        ],
        "type": "Column"
      }
    ],
    "type": "Section"
  }
]
},
}
Response  403

Rename a formKey
PATCH/cor/forms/api/v2/forms/:id/renameKey

Renames a formKey for the given Form, this is a dangerous API and may break external dependencies. We do our best to account for the change internally by renaming any associated documents, but use this at your own risk.

Example URI

PATCH /cor/forms/api/v2/forms/:id/renameKey
URI Parameters
HideShow
`id`
string (required) Example: 5923e510b630f13200885bb4
Request
HideShow
Headers
Content-Type: application/json
Body
{
  "oldKey": "courses",
  "newKey": "programs"
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "id": "5923e510b630f13200885bb4",
  "formContainerId": "5923e510b630f13200885baf",
  "template": {
    "type": "Column",
    "children": [
      {
        "children": [
          {
            "children": [
              {
                "type": "Row",
                "children": [
                  {
                    "children": [
                      {
                        "type": "Column",
                        "children": [
                          {
                            "type": "Text",
                            "formKey": "title",
                            "label": "Title"
                          }
                        ]
                      }
                    ],
                    "type": "Row"
                  }
                ]
              },
              {
                "type": "RichText",
                "formKey": "description",
                "label": "Description"
              },
              {
                "type": "GroupTypeahead",
                "formKey": "programs",
                "label": "Courses",
                "details": {
                  "categoryId": "bd0f2d0b-2c21-4bdd-be1f-6810475c10d8"
                },
                "required": false
              }
            ],
            "type": "Column"
          }
        ],
        "type": "Section"
      }
    ]
  },
  "createdAt": "2017-05-23T07:30:24.272Z",
  "updatedAt": "2017-05-25T17:03:32.633Z"
}
Response  403

Delete a Form
DELETE/cor/forms/api/v2/forms/:id

Delete a Form by ID.

Example URI

DELETE /cor/forms/api/v2/forms/:id
URI Parameters
HideShow
`id`
String (required) Example: 5923e510b630f13200885baf
Response  204
HideShow
Headers
Content-Type: application/json
Response  404
HideShow
Headers
Content-Type: application/json

Documents

A Document resource is where the user or system entered data on a form resides. Each Document record contains the individual “table rows” for the data type identified by its grandparent resource, the FormContainer.

A Documents direct parent resource is the Form, and is associated on the Document through the formId property. Endpoints are provided to work directly with a Document using its ID, or vicariously listing or creating Documents through a Form or FormContainer context.

Clients wishing to render a Document should use the associated Form since it will have all of the correct field names and types that the Document was originally created with.

Get all FormContainer Documents
GET/cor/forms/api/v2/form-containers/:id/forms/current/documents

Fetches a list of all Documents, if any, associated to the “current” form of the given FormContainer. For the semantics of the term “current form”, see the Forms documentation. May return an empty array.

Example URI

GET /cor/forms/api/v2/form-containers/:id/forms/current/documents
URI Parameters
HideShow
`id`
string (required) Example: 5923e510b630f13200885baf
Response  200
HideShow
Headers
Content-Type: application/json
Body
[
  {
    "id": "5923e5e6b630f13200885bb5",
    "formContainerId": "5923e510b630f13200885baf",
    "formId": "5923e510b630f13200885bb4",
    "data": {
      "title": "Tetris",
      "description": "",
      "courses": {
        "id": "5909a5f874821f0e1dd079fe",
        "versionId": "5909a5f874821f0e1dd079ff"
      }
    },
    "deleted": false,
    "updatedAt": "2017-06-06T20:58:42.286Z",
    "createdAt": "2017-05-23T07:33:58.065Z"
  },
  {
    "id": "59482e44ed2c5b950073af2a",
    "formContainerId": "5923e510b630f13200885baf",
    "formId": "5923e510b630f13200885bb4",
    "data": {
      "title": "Pong",
      "courses": {
        "id": "5909a5f774821f0e1dd079d4",
        "versionId": "5909a5f774821f0e1dd079d5"
      }
    },
    "deleted": false,
    "updatedAt": "2017-06-19T20:04:38.340Z",
    "createdAt": "2017-06-19T20:04:20.389Z"
  }
]

Get all Form Documents
GET/cor/forms/api/v2/forms/:id/documents

Fetches a list of all Documents, if any, associated to Form with the given ID. This endpoint may return an empty array.

Example URI

GET /cor/forms/api/v2/forms/:id/documents
URI Parameters
HideShow
`id`
string (required) Example: 5923e510b630f13200885bb4
Response  200
HideShow
Headers
Content-Type: application/json
Body
[
  {
    "id": "5923e5e6b630f13200885bb5",
    "formContainerId": "5923e510b630f13200885baf",
    "formId": "5923e510b630f13200885bb4",
    "data": {
      "title": "Tetris",
      "description": "",
      "courses": {
        "id": "5909a5f874821f0e1dd079fe",
        "versionId": "5909a5f874821f0e1dd079ff"
      }
    },
    "deleted": false,
    "updatedAt": "2017-06-06T20:58:42.286Z",
    "createdAt": "2017-05-23T07:33:58.065Z"
  },
  {
    "id": "59482e44ed2c5b950073af2a",
    "formContainerId": "5923e510b630f13200885baf",
    "formId": "5923e510b630f13200885bb4",
    "data": {
      "title": "Pong",
      "courses": {
        "id": "5909a5f774821f0e1dd079d4",
        "versionId": "5909a5f774821f0e1dd079d5"
      }
    },
    "deleted": false,
    "updatedAt": "2017-06-19T20:04:38.340Z",
    "createdAt": "2017-06-19T20:04:20.389Z"
  }
]

Get a Document
GET/cor/forms/api/v2/documents/:id

Get a Document by ID.

Example URI

GET /cor/forms/api/v2/documents/:id
URI Parameters
HideShow
`id`
string (required) Example: 5923e5e6b630f13200885bb5
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "id": "5923e5e6b630f13200885bb5",
  "formContainerId": "5923e510b630f13200885baf",
  "data": {
    "title": "Tetris",
    "description": "",
    "courses": {
      "id": "5909a5f874821f0e1dd079fe",
      "versionId": "5909a5f874821f0e1dd079ff"
    }
  },
  "deleted": false,
  "createdAt": "2017-05-23T07:33:58.065Z",
  "updatedAt": "2017-06-06T20:58:42.286Z"
}
Response  404

Create a FormContainer Document
POST/cor/forms/api/v2/form-containers/:id/forms/current/documents

Creates a new Document associated to the given FormContainer and its “current” Form. For the semantics of the term “current form”, see the Forms documentation.

Example URI

POST /cor/forms/api/v2/form-containers/:id/forms/current/documents
URI Parameters
HideShow
`id`
string (required) Example: 5923e510b630f13200885baf
Request
HideShow
Headers
Content-Type: application/json
Body
{
  "data": {
    "title": "Tetris",
    "description": "The best shape game ever made!",
    "courses": {
      "id": "5909a5f874821f0e1dd079fe",
      "versionId": "5909a5f874821f0e1dd079ff"
    }
  }
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "id": "5923e5e6b630f13200885bb5",
  "formContainerId": "5923e510b630f13200885baf",
  "formId": "5923e510b630f13200885bb4",
  "data": {
    "title": "Tetris",
    "description": "The best shape game ever made!",
    "courses": {
      "id": "5909a5f874821f0e1dd079fe",
      "versionId": "5909a5f874821f0e1dd079ff"
    }
  },
  "deleted": false,
  "createdAt": "2017-05-23T07:33:58.065Z",
  "updatedAt": "2017-06-06T20:58:42.286Z"
}
Response  403

Create a Form Document
POST/cor/forms/api/v2/forms/:id/documents

Creates a new Document associated to the given Form and its parent FormContainer.

Example URI

POST /cor/forms/api/v2/forms/:id/documents
URI Parameters
HideShow
`id`
string (required) Example: 5923e510b630f13200885bb4
Request
HideShow
Headers
Content-Type: application/json
Body
{
  "data": {
    "title": "Tetris",
    "description": "The best shape game ever made!",
    "courses": {
      "id": "5909a5f874821f0e1dd079fe",
      "versionId": "5909a5f874821f0e1dd079ff"
    }
  }
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "id": "5923e5e6b630f13200885bb5",
  "formContainerId": "5923e510b630f13200885baf",
  "formId": "5923e510b630f13200885bb4",
  "data": {
    "title": "Tetris",
    "description": "The best shape game ever made!",
    "courses": {
      "id": "5909a5f874821f0e1dd079fe",
      "versionId": "5909a5f874821f0e1dd079ff"
    }
  },
  "deleted": false,
  "createdAt": "2017-05-23T07:33:58.065Z",
  "updatedAt": "2017-06-06T20:58:42.286Z"
}
Response  403

Update a Document
PATCH/cor/forms/api/v2/documents/:id

Update a Document by ID. The given data object is merged with the existing data object.

Example URI

PATCH /cor/forms/api/v2/documents/:id
URI Parameters
HideShow
`id`
string (required) Example: 5923e5e6b630f13200885bb5
Request
HideShow
Headers
Content-Type: application/json
Body
{
  "data": {
    "description": "The best shape game ever made!"
  }
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "id": "5923e5e6b630f13200885bb5",
  "formContainerId": "5923e510b630f13200885baf",
  "data": {
    "title": "Tetris",
    "description": "The best shape game ever made!",
    "courses": {
      "id": "5909a5f874821f0e1dd079fe",
      "versionId": "5909a5f874821f0e1dd079ff"
    }
  },
  "deleted": false,
  "createdAt": "2017-05-23T07:33:58.065Z",
  "updatedAt": "2017-06-06T20:58:42.286Z"
}
Response  403

Delete a Document
DELETE/cor/forms/api/v2/documents/:id

Delete an existing Document by ID.

Example URI

DELETE /cor/forms/api/v2/documents/:id
URI Parameters
HideShow
`id`
string (required) Example: 5923e5e6b630f13200885bb5
Response  204
Response  404

REMOVED - Forms V1

Version 1 has been removed in favor of all clients using Version 2. Please read the V2 Upgrade Guide for help migrating to v2.

CM - Courses, Programs, Experiences, and Specializations

This section addresses API routes that deal with courses, programs, experiences, and specializations. The docs use the example of courses, but anything done to courses can be done to programs, experiences, and specializations by changing the URL to /programs/, /experiences/, or /specializations/ instead of /courses/.

The schema for a course is almost completely dynamic. There are a few required attributes that we use to make the app work, but most of the fields on a form will be configured at run-time through a web interface on a per-university basis.

See Course Schema for more information

Course Schema

This endpoint returns an object with keys representing all of the attributes that are currently settable or gettable on a course.

Each key on the schema object contains information surrounding a course attribute.

Here’s an example of what a schema might look like:

{
  regOptions: {
    label: "Student Registration Options",
    options: [
      {
        key: "audit",
        text: "Audit"
      },
      {
        key: "passFail",
        text: "Transcript Pass/Fail"
      }
    ],
    type: "Checkboxes"
  },
  ...
}

regOptions corresponds to the API labels given when the gadget was created. regOptions is a checkboxes gadget with two options: Audit and Transcript Pass/Fail.

Get Schema
GET/api/cm/courses/schema

Example URI

GET /api/cm/courses/schema
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "number": {
    "label": "Number",
    "limit": "5"
  },
  ...
}

Course Schema Attribute

Get Schema Attribute
GET/api/cm/courses/schema/{key}

Assuming we didn’t want to fetch the entire schema for the course, but one specific attribute, we can add the key for that attribute onto the end of the path.

In this example we’re sending a GET request to /courses/schema/number

Example URI

GET /api/cm/courses/schema/number
URI Parameters
HideShow
key
string (required) Example: number

Schema attribute key

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "label": "Number",
  "limit": "5"
}

Dependencies

Get Dependencies
GET/api/cm/courses/dependencies/{id}

Returns an array containing partial program objects upon which the requested course is dependent. (i.e. completion requirements, entrance requirements, satisfactory progress)

Example URI

GET /api/cm/courses/dependencies/8e738178-c009-45df-81a2-093d2f030e77
URI Parameters
HideShow
id
string (required) Example: 8e738178-c009-45df-81a2-093d2f030e77

Item Id

Response  200
HideShow
Headers
Content-Type: application/json
Body
[{
  {
    id: "7a7bdd8a-9f59-4608-8ce5-742dc539827c"
    code: "TSAMTMBS"
    title: "Aeronautical Management Technology (Air Transportation Management)"
    rules: {
      rules:
        {
          alphaCharacter: "A"
          courses:
            0: "8e080369-15c2-4338-9f21-fcd4ab00fa20"
            1: "077ffb34-44f1-478f-9d9c-790f5c85b671"
            2: "41364606-ed3b-4502-8deb-443ba86c5bfd"
            3: "dbefeabb-b243-4412-896d-76381c235015"
            4: "c994ed42-d188-4834-9611-d67cc872ec2d"
            id: "Vy6zDA2"
            isRuleSet: false
            minCredits: "2"
            subType: "coursesNumber"
            type: "numberCourses"
        }
    }
    lbl: "Entrance Requirements"
    type: "programs"
  }
  {
    ...
  }
  ...
}]

Versions

Get Versions
GET/api/cm/courses/{pid}/versions

Return an array containing all versions of a course with the newest version at index 0.

Example URI

GET /api/cm/courses/8e738178-c009-45df-81a2-093d2f030e77/versions
URI Parameters
HideShow
pid
string (required) Example: 8e738178-c009-45df-81a2-093d2f030e77

Item Id

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  [
    {
      "approvalDate": 192380175910,
      "created": 1923850150198,
      "createdBy": "012981dd-0192-df9e-90fe-098209840aff",
      "updatedBy": "123456",
      "description": "This course has multiple versions! v2.0"
      ...
    }
    {
      "approvalDate": 1923800000,
      "created": 1923850150198,
      "createdBy": "012981dd-0192-df9e-90fe-098209840aff",
      "updatedBy": "123456",
      "description": "This course has multiple versions! v1.0"
    }
    ...
  ]
}
Response  404
HideShow
Headers
Content-Type: text/plain
Body
Course not found

Latest Active Version

Get Lastest Active Version
GET/api/cm/courses/{pid}/latestActive

Return the course object of the active version of the requested pid.

Example URI

GET /api/cm/courses/8e738178/latestActive
URI Parameters
HideShow
pid
string (required) Example: 8e738178

Parent Id (pid) of the item

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  approvalDate: 1439246948928,
  created: 1439246774300,
  createdBy: "1366763d-35d2-462b-b7d9-b3ffef07b78f",
  updatedBy: "123456",
  description: "Now it has a description because the 2016 budget allowed it.",
  ...
}
Response  404
HideShow
Headers
Content-Type: text/plain
Body
Course not found

Proposal in Review

Get Proposal in Review
GET/api/cm/courses/{pid}/review

Returns the course object of the proposed draft that is currently being reviewed in workflow but has not been approved yet.

Example URI

GET /api/cm/courses/8e738178/review
URI Parameters
HideShow
pid
string (required) Example: 8e738178

Parent Id (pid) of the item

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  approvalDate: 1439310941443,
  created: 1439311325358,
  createdBy: "711a841f-8e90-4f1d-8274-97575221bd8f",
  updatedBy: "123456",
  description: "Now it has a description because the 2016 budget allowed it.",
  ...
  status: "review"
}

Shared Proposals

Get Shared Proposals
GET/api/cm/courses/{pid}/sharedWithMe

Returns an array of the course proposals for the pid that have been shared with the user by whom the API key was created.

Example URI

GET /api/cm/courses/8e738178/sharedWithMe
URI Parameters
HideShow
pid
string (required) Example: 8e738178

Parent Id (pid) of the item

Response  200
HideShow
Headers
Content-Type: application/json
Body
[
  {
    creator: "John Smith",
    itemId: "be073f44-2e9c-4b51-87c8-8e6c3fe325fa"
  }
  ...
]

Course Clones

Create Course Clone
POST/api/cm/courses/{id}

Creates a proposal from the course with the given id, and returns the newly cloned proposal object.

Example URI

POST /api/cm/courses/8e738178-c009-45df-81a2-093d2f030e77
URI Parameters
HideShow
id
string (required) Example: 8e738178-c009-45df-81a2-093d2f030e77

Id of the item

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  approvalDate: 1439311761735,
  created: 1439315226880,
  createdBy: "711a841f-8e90-4f1d-8274-97575221bd8f",
  updatedBy: "123456",
  id: "25c2d6c5-d297-463d-aaa2-db9b69a160e8",
  originalProposalId: "4b1be7ca-4f47-488d-b393-9aa5986abd1c",
  pid: "VkB2qxGs",
  proposedFromId: "8e738178-c009-45df-81a2-093d2f030e77"
}

Start Dates

Verify Uniqueness : DEPRECATED
POST/api/cm/courses/startdates/{pid}

Deprecated

Verifies the uniqueness of a start date between versions of a pid. Returns a boolean ‘unique’ with value true if the date specified in the body of the request is not equal to the start date of any version of the course.

Example URI

POST /api/cm/courses/startdates/8e738178
URI Parameters
HideShow
pid
string (required) Example: 8e738178

Parent Id (pid) of the item

Request
HideShow
Headers
Content-Type: application/json
Body
{
  startTerm: {
    type: "year",
    year: "2018"
  },
  id: "8e738178-c009-45df-81a2-093d2f030e77"
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  unique: false
}

Course Retirement

Retire a Course
PUT/api/cm/courses/{id}/retire

Retires the course with given id, assuming the API key is associated with a user that has admin permissions. Returns the retired course object.

Example URI

PUT /api/cm/courses/8e738178-c009-45df-81a2-093d2f030e77/retire
URI Parameters
HideShow
id
string (required) Example: 8e738178-c009-45df-81a2-093d2f030e77

Id of the item

Request
HideShow
Body
endDate: {
  type: 'year',
  year: '2015'
},
rationale: 'Retire rationale here'
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
    approvalDate: 1439311761735,
    created: 1439311868900,
    createdBy: "711a841f-8e90-4f1d-8274-97575221bd8f",
    updatedBy: "123456",
    endDate: {
      type: "year"
      year: "2015"
    },
    id: "212c19be-1088-40c9-aacc-ebe15e1a83c8",
    originalProposalId: "4b1be7ca-4f47-488d-b393-9aa5986abd1c",
    pid: "VkB2qxGs",
    proposedFromId: "8e738178-c009-45df-81a2-093d2f030e77",
    rationale: "Retire rationale here",
    **status: "retired"**,
    ...
  }

Proposal Sharing

Share a Proposal
PUT/api/cm/courses/{id}/sharing

Shares the proposal with the users in the request body.

Example URI

PUT /api/cm/courses/8e738178-c009-45df-81a2-093d2f030e77/sharing
URI Parameters
HideShow
id
string (required) Example: 8e738178-c009-45df-81a2-093d2f030e77

Id of the item

Request
HideShow
Body
[
  {
    id: "1366763d-35d2-462b-b7d9-b3ffef07b78f",
    name: "admin"
  }
  ...
]
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  created: 1439321912784,
  createdBy: "1366763d-35d2-462b-b7d9-b3ffef07b78f",
  updatedBy: "123456",
  department: "Vy8d5Of9",
  ...
  sharedWith:[
    {
      id: "1366763d-35d2-462b-b7d9-b3ffef07b78f",
      name: "admin"
    }
  ]
  ...
}

Proposal Approval

Submit for Approval
POST/api/cm/courses/{id}/submitForApproval

Submits the given proposal id for approval via workflow.

Example URI

POST /api/cm/courses/8e738178-c009-45df-81a2-093d2f030e77/submitForApproval
URI Parameters
HideShow
id
string (required) Example: 8e738178-c009-45df-81a2-093d2f030e77

Id of the item

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  created: 1439321912784,
  createdBy: "1366763d-35d2-462b-b7d9-b3ffef07b78f",
  updatedBy: "123456",
  ...
  description: "API TESTING COURSE!",
  id: "fc061d1c-fdc5-4d98-b5c1-3981d139f37a",
  ...
  pid: "41YL04Qs",
  proposalRationale: "Making a new thing",
  ...
  status: "review",
  ...
  workflowId: "ce7fd5f8-1960-436b-aef7-899f0b9e64bd",
  possibleUserActions: [
    "edit",
    "withdraw"
  ]
}

Workflow Approval

Approve a Proposal
POST/api/cm/courses/{id}/approve

Approve the item in workflow, assuming it is pending the decision of the user associated with the API key.

Example URI

POST /api/cm/courses/8e738178-c009-45df-81a2-093d2f030e77/approve
URI Parameters
HideShow
id
string (required) Example: 8e738178-c009-45df-81a2-093d2f030e77

Id of the item

Request
HideShow
Body
comment: 'Looks great!'
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  created: 1439321912784,
  createdBy: "1366763d-35d2-462b-b7d9-b3ffef07b78f",
  updatedBy: "123456",
  ...
  description: "API TESTING COURSE!",
  id: "fc061d1c-fdc5-4d98-b5c1-3981d139f37a",
  ...
  pid: "41YL04Qs",
  proposalRationale: "Making a new thing",
  ...
  status: "active",
  ...
  workflowId: "ce7fd5f8-1960-436b-aef7-899f0b9e64bd",
  possibleUserActions: [
    "edit"
  ]
}

Workflow Rejection

Reject a Proposal
POST/api/cm/courses/{id}/reject

Reject the item in workflow, assuming it is pending the decision of the user associated with the API key.

Example URI

POST /api/cm/courses/8e738178-c009-45df-81a2-093d2f030e77/reject
URI Parameters
HideShow
id
string (required) Example: 8e738178-c009-45df-81a2-093d2f030e77

Id of the item

Request
HideShow
Body
{comment: 'Change the description to be more accurate'}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  created: 1439321912784,
  createdBy: "1366763d-35d2-462b-b7d9-b3ffef07b78f",
  updatedBy: "123456",
  ...
  description: "API TESTING COURSE!",
  id: "fc061d1c-fdc5-4d98-b5c1-3981d139f37a",
  ...
  pid: "41YL04Qs",
  proposalRationale: "Making a new thing",
  ...
  status: "review",
  ...
  workflowId: "ce7fd5f8-1960-436b-aef7-899f0b9e64bd",
  possibleUserActions: [
    "edit"
  ]
}

Course Config

Get Course Config
GET/api/cm/courses/template/body

Get the course config page that defines what information gadgets are shown on the course view and edit pages. The schema is as follows: template contains children of type panel, which contain children of type row, which contain children of type column, which contain the individual gadgets.

Example URI

GET /api/cm/courses/template/body
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  id: "course-template",
  template: [
    {
      children: [
        {
          children: [
            {
              children: [
                {
                  descriptiveText: "Workflow Viewer",
                  gKey: "workflowviewer",
                  label: "workflowViewer",
                  type: "WorkflowViewer"
                }
                ...
              ],
              type: "Column"
            }
            ...
          ],
          type: "Row"
        }
        ...
      ]
      label: "General Information",
      type: "panel"
    }
  ]
}

Modify
PUT/api/cm/courses/template/body

odify a course config page by sending a PUT request with the modified JSON representation of the course config as the body. The response will return the modified version of the course config, or a 404 if no course with that id is found.

Note: This endpoint is only supported for the Kuali Admin user.

Example URI

PUT /api/cm/courses/template/body

Course

Get Course
GET/api/cm/courses/{id}{?includeSchema}

Example URI

GET /api/cm/courses/fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4?includeSchema=true
URI Parameters
HideShow
id
string (required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4

auto-generated course ID

includeSchema
boolean (optional) Example: true
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "id": "fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4",
  "title": "Disappearing & Hiding",
  "subjectCode": "SCAR",
  "number": "201A",
  "updatedBy": "12345",
  ...
}
Response  404
HideShow
Headers
Content-Type: text/plain
Body
Course not found

Update Course
PUT/api/cm/courses/{id}{?includeSchema}

Modify a course by sending a PUT request with the modified JSON representation of the course as the body. The response will return the modified version of the course, or a 404 if no course with that id is found.

Note: Invalid courses will not be saved. When this happens, errors will come back under validations.

Note: Please refer to CM - Gadgets for details regarding updating a courses gadgets.

Example URI

PUT /api/cm/courses/fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4?includeSchema=true
URI Parameters
HideShow
id
string (required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4

auto-generated course ID

includeSchema
boolean (optional) Example: true
Request
HideShow
Body
{
  "title": "Disappearing & Hiding, Modified",
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "id": "fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4",
  "title": "Disappearing & Hiding, Modified",
  "subjectCode": "SCAR",
  "number": "201A",
  ...
  "validations": "{error object}"
}
Response  404
HideShow
Headers
Content-Type: text/plain
Body
Course not found

Delete Course
DELETE/api/cm/courses/{id}{?includeSchema}

Delete a course by sending a DELETE request. The response will return a 204 with no content, or a 404 if no course with that id is found.

Note: Requires a University Preference allowing active courses to be deleted.

Example URI

DELETE /api/cm/courses/fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4?includeSchema=true
URI Parameters
HideShow
id
string (required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4

auto-generated course ID

includeSchema
boolean (optional) Example: true
Response  204
Response  404
HideShow
Headers
Content-Type: text/plain
Body
No item found

Courses

Create Course
POST/api/cm/courses

Add a course.

Note: Please refer to CM - Gadgets for details regarding creating a course with existing gadgets.

CAVEAT: As of right now, courses must include the ‘startTerm’ and ‘status’ attributes or they will not show up in the course search page.

Set ‘status’ to ‘draft’ to make it a proposal

Example URI

POST /api/cm/courses
Request
HideShow
Body
{
  "title": "Tactics for Scary Napping",
  "subjectCode": "NAPS",
  "number": "400",
  "startTerm": {
    "type": "year",
    "year": 2015
  },
  "status": "active"
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "id": "92062dcf-d975-4e57-8073-03f202082786",
  "title": "Tactics for Scary Napping",
  "subjectCode": "NAPS",
  "number": "400"
}

Query

Item
GET/api/cm/:item/queryAll{?q,sort,limit,skip,attribute,fields}

Return a list of all items, based on the query specified.

NOTE: This endpoint returns a maximum of 100 records. To get more, use the skip parameters.

Example URI

GET /api/cm/:item/queryAll?q=&sort=&limit=&skip=&attribute=&fields=
URI Parameters
HideShow
q
string (optional) 

Full text search

Examples

?q=john

?q=jane.smith@university.com

sort
string (optional) 

Sorts results ascending or descending by one or more attributes

Add a dash to sort descending. Separate multiple attributes with a comma. Nested attributes are referenced with dot notation.

Examples

?sort=username

?sort=-updatedAt

?sort=username,email

?sort=updatedBy.impersonatedBy

limit
number (optional) 

Limits results. Defaults to 100.

Examples

?limit=20

?limit=80

skip
number (optional) 

Skips a number of results. Useful for paging through results.

Examples

?limit=20&skip=0

?limit=20&skip=20

?limit=20&skip=40

attribute
string (optional) 

Search on one or more attributes.

Examples

?username=janesmith

?firstName=jim&email=jim@university.com

fields
string (optional) 

Return only specific attributes. To return the id field, include a reference to _id.

Examples

?fields=username,email

?fields=firstName,lastName,email

?fields=username,updatedBy.impersonatedBy

gt
string (optional) 

Return documents where the specified field is greater than a value. Add e to include equals

Examples

?created=gt(1490645684620)

?updated=gte(1490645684620)

lt
string (optional) 

Return documents where the specified field is less than a value. Add e to include equals

Examples

?created=lt(1490645684620)

?updated=lte(1490645684620)

Response  200
HideShow
Headers
Content-Type: application/json
Body
[
  {
    "id": "fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4",
    "title": "How to look scary while eating lunch",
    "subjectCode": "LUNCH",
    "number": "109"
  },
  {
    "id": "197b85ee-3c1a-4933-87fa-a4567da82dc1",
    "title": "Pre-scare self-uglification",
    "subjectCode": "SCAR",
    "number": "242"
  },
  {
    "id": "92062dcf-d975-4e57-8073-03f202082786",
    "title": "Tactics for Scary Napping",
    "subjectCode": "NAPS",
    "number": "400"
  }
]

CM - Proposals

This section addresses API routes that deal with proposals for courses or programs. The docs use the example of courses, but anything done to courses can be done to programs by changing the URL to /proposals/programs/ instead of /proposals/courses/

Proposals

Get Current Proposals
GET/api/cm/proposals/courses/

Return an array containing the proposals created by the user with which the API key is associated.

Example URI

GET /api/cm/proposals/courses/
Response  200
HideShow
Body
[
  {
    approvedVersionId: "fc061d1c-fdc5-4d98-b5c1-3981d139f37a"
    created: 1439326621386
    createdBy: "1366763d-35d2-462b-b7d9-b3ffef07b78f"
    department: "Vy8d5Of9"
    description: "API TESTING COURSE!"
    id: "556331c7-4c54-4e85-885b-fbce687d80ba"
    meta: {
      proposalType: "create"
    }
    number: "999"
    pid: "41YL04Qs"
    proposalRationale: "Making a new thing"
    sharedWith: [
      {
        id: "1366763d-35d2-462b-b7d9-b3ffef07b78f"
        name: "admin"
      }
    ]
    startTerm: {
      month: "January"
      type: "month"
      year: "2015"
    }
    status: "approved"
    subjectCode: "API"
    title: "API Testing"
    updated: 1439324556337
    workflowId: "ce7fd5f8-1960-436b-aef7-899f0b9e64bd"
  },
  ...
]
Response  404
HideShow
Headers
Content-Type: text/plain
Body
Proposal not found

Create Proposal
POST/api/cm/proposals/courses/

Create a new proposal with the details sent in the body of the request.

Example URI

POST /api/cm/proposals/courses/
Response  200
HideShow
Body
{
  approvedVersionId: "fc061d1c-fdc5-4d98-b5c1-3981d139f37a"
  created: 1439326621386
  createdBy: "1366763d-35d2-462b-b7d9-b3ffef07b78f"
  department: "Vy8d5Of9"
  description: "API TESTING COURSE!"
  id: "556331c7-4c54-4e85-885b-fbce687d80ba"
  meta: {
    proposalType: "create"
  }
  number: "999"
  pid: "41YL04Qs"
  proposalRationale: "Making a new thing"
  sharedWith: [
    {
      id: "1366763d-35d2-462b-b7d9-b3ffef07b78f"
      name: "admin"
    }
  ]
  startTerm: {
    month: "January"
    type: "month"
    year: "2015"
  }
  status: "approved"
  subjectCode: "API"
  title: "API Testing"
  updated: 1439324556337
  workflowId: "ce7fd5f8-1960-436b-aef7-899f0b9e64bd"
}
Response  404
HideShow
Headers
Content-Type: text/plain
Body
Proposal not found

Proposal

Get Proposal
GET/api/cm/proposals/courses/

Return proposal with given ID.

Example URI

GET /api/cm/proposals/courses/
Response  200
HideShow
Body
{
  approvedVersionId: "fc061d1c-fdc5-4d98-b5c1-3981d139f37a"
  created: 1439326621386
  createdBy: "1366763d-35d2-462b-b7d9-b3ffef07b78f"
  department: "Vy8d5Of9"
  description: "API TESTING COURSE!"
  id: "556331c7-4c54-4e85-885b-fbce687d80ba"
  meta: {
    proposalType: "create"
  }
  number: "999"
  pid: "41YL04Qs"
  proposalRationale: "Making a new thing"
  sharedWith: [
    {
      id: "1366763d-35d2-462b-b7d9-b3ffef07b78f"
      name: "admin"
    }
  ]
  startTerm: {
    month: "January"
    type: "month"
    year: "2015"
  }
  status: "approved"
  subjectCode: "API"
  title: "API Testing"
  updated: 1439324556337
  workflowId: "ce7fd5f8-1960-436b-aef7-899f0b9e64bd"
}
Response  404
HideShow
Headers
Content-Type: text/plain
Body
Proposal not found

Update Proposal
PUT/api/cm/proposals/courses/

Change proposal with a given ID.

Example URI

PUT /api/cm/proposals/courses/
Request
HideShow
Body
{
  description: "API TESTING COURSE! Modified"
}
Response  200
HideShow
Body
{
  approvedVersionId: "fc061d1c-fdc5-4d98-b5c1-3981d139f37a"
  created: 1439326621386
  createdBy: "1366763d-35d2-462b-b7d9-b3ffef07b78f"
  department: "Vy8d5Of9"
  description: "API TESTING COURSE! Modified"
  id: "556331c7-4c54-4e85-885b-fbce687d80ba"
  meta: {
    proposalType: "create"
  }
  number: "999"
  pid: "41YL04Qs"
  proposalRationale: "Making a new thing"
  sharedWith: [
    {
      id: "1366763d-35d2-462b-b7d9-b3ffef07b78f"
      name: "admin"
    }
  ]
  startTerm: {
    month: "January"
    type: "month"
    year: "2015"
  }
  status: "approved"
  subjectCode: "API"
  title: "API Testing"
  updated: 1439324556337
  workflowId: "ce7fd5f8-1960-436b-aef7-899f0b9e64bd"
}
Response  404
HideShow
Headers
Content-Type: text/plain
Body
Proposal not found

Clone Proposal
POST/api/cm/proposals/courses/

Make a new proposal based off of the proposal with given ID.

Example URI

POST /api/cm/proposals/courses/
Response  200
HideShow
Body
{
  approvedVersionId: "fc061d1c-fdc5-4d98-b5c1-3981d139f37a"
  created: 1439326621386
  createdBy: "1366763d-35d2-462b-b7d9-b3ffef07b78f"
  department: "Vy8d5Of9"
  description: "API TESTING COURSE!"
  id: "556331c7-4c54-4e85-885b-fbce687d80ba"
  meta: {
    proposalType: "modify"
  }
  number: "999"
  pid: "41YL04Qs"
  proposalRationale: "Making a new thing"
  proposedFromId: "dc0b1626-e587-4426-8b12-d1b6091e58bf"
  sharedWith: [
    {
      id: "1366763d-35d2-462b-b7d9-b3ffef07b78f"
      name: "admin"
    }
  ]
  startTerm: {
    month: "January"
    type: "month"
    year: "2015"
  }
  status: "draft"
  subjectCode: "API"
  title: "API Testing"
  updated: 1439324556337
  workflowId: "ce7fd5f8-1960-436b-aef7-899f0b9e64bd"
}
Response  404
HideShow
Headers
Content-Type: text/plain
Body
Proposal not found

Delete Proposal
DELETE/api/cm/proposals/courses/

Deletes the proposal with the specified ID.

Example URI

DELETE /api/cm/proposals/courses/
Response  200
HideShow
Body
OK
Response  404
HideShow
Headers
Content-Type: text/plain
Body
Proposal not found

Proposal Status

Update Proposal Status
PUT/api/cm/proposals/courses/{status}/{id}

This will override the workflow process. We strongly recommended that you don’t ever use this.

Modify the status of a proposal with id {id}. Status will be set as {status}.

Example URI

PUT /api/cm/proposals/courses/approved/fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4
URI Parameters
HideShow
id
string (required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4

auto-generated course ID

status
string (required) Example: approved
Response  200
HideShow
Body
{
  approvedVersionId: "fc061d1c-fdc5-4d98-b5c1-3981d139f37a"
  created: 1439326621386
  createdBy: "1366763d-35d2-462b-b7d9-b3ffef07b78f"
  department: "Vy8d5Of9"
  description: "API TESTING COURSE!"
  id: "556331c7-4c54-4e85-885b-fbce687d80ba"
  meta: {
    proposalType: "modify"
  }
  number: "999"
  pid: "41YL04Qs"
  proposalRationale: "Making a new thing"
  proposedFromId: "dc0b1626-e587-4426-8b12-d1b6091e58bf"
  sharedWith: [
    {
      id: "1366763d-35d2-462b-b7d9-b3ffef07b78f"
      name: "admin"
    }
  ]
  startTerm: {
    month: "January"
    type: "month"
    year: "2015"
  }
  status: "active"
  subjectCode: "API"
  title: "API Testing"
  updated: 1439324556337
}
Response  404
HideShow
Headers
Content-Type: text/plain
Body
Proposal not found

CM - Options

Options are used to configure valid values for course and program controls. These are generally used with a Typeahead, Dropdown, or Checkbox/Radio group.

Here’s what the option schema currently looks like. It’s under heavy development, so expect it to change regularly until CM’s initial release.

This type notation follows Facebook’s Flow format.

type SettingsOption = {
  id: string;
  type: string; // the type groups options together, for ex. 'Subject Codes'
  name: string; // this the name that appears to users (in controls)
  locale: string; // the same option can be specified in multiple locales
  active: boolean;
}

Option

Get Option
GET/api/cm/options/{id}

Example URI

GET /api/cm/options/fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4
URI Parameters
HideShow
id
string (required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4

auto-generated option ID

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "active": true,
  "id": "0a9ccc24-06f9-401c-8fa2-f191db77dbb1",
  "locale": "en-US",
  "name": "Marketing",
  "type": "curricularUnit"
}
Response  404
HideShow
Headers
Content-Type: text/plain
Body
Option not found

Update Option
PUT/api/cm/options/{id}

Modify an option by sending a PUT request with the modified JSON representation of the option as the body. The response will return the modified version of the option, or a 404 if no option with that id is found.

Example URI

PUT /api/cm/options/fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4
URI Parameters
HideShow
id
string (required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4

auto-generated option ID

Request
HideShow
Body
{
  "name": "Online Marketing"
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "active": true,
  "id": "0a9ccc24-06f9-401c-8fa2-f191db77dbb1",
  "locale": "en-US",
  "name": "Online Marketing",
  "type": "curricularUnit"
}
Response  404
HideShow
Headers
Content-Type: text/plain
Body
Option not found

Inactivate Option
DELETE/api/cm/options/{id}

Options do not support deletion. However, an option can be inactivated by calling this endpoint.

Example URI

DELETE /api/cm/options/fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4
URI Parameters
HideShow
id
string (required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4

auto-generated option ID

Response  200
HideShow
Headers
Content-Type: application/json
Response  404
HideShow
Headers
Content-Type: text/plain
Body
Option not found

Options

Create Option
POST/api/cm/options

Calling this endpoint will create a new option. Note, the type associated with the option may be new as well. Furthermore, the active and locale fields may be left out. They will default to ‘true’ and ‘en-US’ respectively.

Example URI

POST /api/cm/options
Request
HideShow
Body
{
  "locale": "en-US",
  "name": "Music",
  "type": "jacs"
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "id": "253e1e5c-1c12-44f1-b9ec-92e5e9964217",
  "active": true,
  "locale": "en-US",
  "name": "Music",
  "type": "jacs"
}

Option Types

Get Option Types
GET/api/cm/options/types

Example URI

GET /api/cm/options/types
Response  200
HideShow
Headers
Content-Type: application/json
Body
[
  "costcenters",
  "curricularUnit",
  "jacs",
  "org",
  "settings",
  "subject-code",
  "subjectcodes",
  "terms"
]

Option Type

Get Option Type
GET/api/cm/options/types/{type}

Example URI

GET /api/cm/options/types/jacs
URI Parameters
HideShow
type
string (required) Example: jacs
Response  200
HideShow
Headers
Content-Type: application/json
Body
[
  {
    "active": true,
    "id": "01f63496-8246-4ee5-8343-680776b4fd58",
    "locale": "en-US",
    "longDescription": "Math is for you!",
    "name": "Math",
    "shortDescription": "Math",
    "type": "jacs"
  },
  {
    "active": false,
    "id": "1ef88af4-9038-4e78-8cfa-01c8a0d6a336",
    "locale": "en-US",
    "type": "jacs"
  },
  {
    "active": true,
    "id": "812c2b14-296a-484d-8cda-3086f2c1ec7e",
    "locale": "en-US",
    "longDescription": "The study of the application of computer-based technologies.",
    "name": "I520",
    "shortDescription": "Bioinformatics",
    "type": "jacs"
  }
]

CM - Calendar

Academic Calendar settings allow you to add and manage Academic Years and Terms with dates. The dates are used to organize versions of curriculum by start and end terms. They are also useful in integration with other systems. Approximate dates can be used if actual term dates are unavailable.

Calendar Settings Schema

Get Calendar Settings Schema
GET/api/cm/calendar/settings/schema

Example URI

GET /api/cm/calendar/settings/schema
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "allowExternalTermId": {
    "type": "boolean"
  },
  "allowExternalYearId": {
    "type": "boolean"
  },
  "reverseDisplayOrder": {
    "type": "boolean"
  }
}

Calendar Settings

Get Calendar Settings
GET/api/cm/calendar/settings

Example URI

GET /api/cm/calendar/settings
Response  200
HideShow
Headers
Content-Type: application/json
Body
{}

Update Calendar Settings
PUT/api/cm/calendar/settings

Modify calendar settings by sending a PUT request.

Example URI

PUT /api/cm/calendar/settings
Request
HideShow
Body
{
  "reverseDisplayOrder": true
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "reverseDisplayOrder": true
}

Calendar Upload

Upload caledar data
POST/api/cm/calendar/upload

All uploads must be of type csv. Each CSV must contain the required columns, and each cell must have valid data. Use the following table to structure your CSV correctly:

Column Description
term_label (Required) Label of the term.
term_start (Required) Start date of the term. Any valid date format is accepted. Any invalid date formats will abort the upload process.
term_end (Required) End date of the term. Any valid date format is accepted. Any invalid date formats will abort the upload process.
term_external_id id to be used for external systems integrations. This column is not required.
year_label (Required) Label of the year.
year_start (Required) Start date of the year. Any valid date format is accepted. Any invalid date formats will abort the upload process.
year_end (Required) End date of the year. Any valid date format is accepted. Any invalid date formats will abort the upload process.
year_external_id id to be used for external systems integrations. This column is not required.

Example URI

POST /api/cm/calendar/upload
Request
HideShow
Body
POST /api/cm/calendar/upload HTTP/1.1
Host: [institution].kuali.co
Authorization: [authorization token]
Content-Disposition: form-data; name="file"; filename=""
Content-Type: "text/csv"

CSV Data
Response  200
HideShow
Headers
Content-Type: application/json
Body
[
  {
    "active": true,
    "end": 1270015200000,
    "id": "7d09c754-441b-4ccd-bfb9-b782dfe77eb2",
    "label": "Q1 2010",
    "start": 1262329200000,
    "yearId": "a996cb67-a392-4fec-adcd-55efa94aa661"
  },
  ...
]

Years Schema

Get Years Schema
GET/api/cm/calendar/years/schema

Example URI

GET /api/cm/calendar/years/schema
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "id": {
    "type": "string"
  },
  "externalId": {
    "type": "string"
  },
  "label": {
    "type": "string"
  },
  "start": {
    "type": "integer"
  },
  "end": {
    "type": "integer"
  },
  "active": {
    "type": "boolean"
  }
}

Years

Create Year
POST/api/cm/calendar/years/

Calling this endpoint will create a year. Note, that start and end date are required. Dates on years cannot overlap one another, and may not have their start and end dates out of order. An id and active status will be created automatically.

Example URI

POST /api/cm/calendar/years/
Request
HideShow
Body
{
  "externalId": "123",
  "label": "2020-2021",
  "start": 1462904494515,
  "end": 1494440662973
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "active": true,
  "end": 1494440662973,
  "externalId": "123",
  "id": "eda362dd-195a-4739-b116-6cfb910a5f1e",
  "label": "2020-2021",
  "start": 1462904494515
}

Get Multiple Years
GET/api/cm/calendar/years/{?active}

Example URI

GET /api/cm/calendar/years/?active=true
URI Parameters
HideShow
active
boolean (optional) Example: true
Response  200
HideShow
Headers
Content-Type: application/json
Body
[
  {
    "active": true,
    "end": 1494440662973,
    "externalId": "123",
    "id": "eda362dd-195a-4739-b116-6cfb910a5f1e",
    "label": "2020-2021",
    "start": 1462904494515
  }
]

Get a Single Year
GET/api/cm/calendar/years/{id}

Example URI

GET /api/cm/calendar/years/fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4
URI Parameters
HideShow
id
string (required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4

auto-generated option ID

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "active": true,
  "end": 1494440662973,
  "externalId": "123",
  "id": "eda362dd-195a-4739-b116-6cfb910a5f1e",
  "label": "2020-2021",
  "start": 1462904494515
}

Update Year
PUT/api/cm/calendar/years/{id}

Modify a year by sending a PUT request with the modified JSON representation of the year as the body. The response will return the modified version of the year, or a 404 if no year with that id is found.

Dates on years cannot overlap one another, and may not have their start and end dates out of order. Id SHOULD NOT be updated.

Example URI

PUT /api/cm/calendar/years/fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4
URI Parameters
HideShow
id
string (required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4

auto-generated option ID

Request
HideShow
Body
{
  "active": false
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
[
  {
    "active": false,
    "end": 1494440662973,
    "externalId": "123",
    "id": "eda362dd-195a-4739-b116-6cfb910a5f1e",
    "label": "2020-2021",
    "start": 1462904494515
  }
]
Response  404
HideShow
Headers
Content-Type: text/plain
Body
"No year found with that ID"

Delete Year
DELETE/api/cm/calendar/years/{id}

Calling this endpoint will either delete, or inactivate a year depending upon whether it’s being used. When a year is deleted without anything using it, it is removed from the database. When a year is deleted and things are using it, it will be inactivated.

Example URI

DELETE /api/cm/calendar/years/fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4
URI Parameters
HideShow
id
string (required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4

auto-generated option ID

Response  200
HideShow
Headers
Content-Type: application/json
Response  204
HideShow
Headers
Content-Type: application/json
Response  404
HideShow
Headers
Content-Type: text/plain
Body
"No year found with that ID"

Terms Schema

GET Terms Schema
GET/api/cm/calendar/terms/schema

Example URI

GET /api/cm/calendar/terms/schema
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "id": {
    "type": "string"
  },
  "externalId": {
    "type": "string"
  },
  "label": {
    "type": "string"
  },
  "start": {
    "type": "integer"
  },
  "end": {
    "type": "integer"
  },
  "yearId": {
    "type": "string"
  },
  "active": {
    "type": "boolean"
  }
}

Terms

Create Term
POST/api/cm/calendar/terms/

Calling this endpoint will create a term. Note, that label, yearId, start and end date are required. Dates on terms cannot overlap one another, they must be contained within their associated years, they must have a valid associated year, and may not have their start and end dates out of order. An id and active status will be created automatically.

Example URI

POST /api/cm/calendar/terms/
Request
HideShow
Body
{
  "externalId": "123",
  "label": "2020-2021",
  "start": 1462904494515,
  "end": 1494440662973,
  "yearId": "788b8e90-e850-49c4-8467-c484c3de84b7"
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "active": true,
  "end": 1494440662973,
  "externalId": "123",
  "id": "8cc5a895-965f-4907-96fa-b62e259b004e",
  "label": "2020-2021",
  "start": 1462904494515,
  "yearId": "788b8e90-e850-49c4-8467-c484c3de84b7"
}

Get Multiple Terms
GET/api/cm/calendar/terms/{?active}

Example URI

GET /api/cm/calendar/terms/?active=true
URI Parameters
HideShow
active
boolean (optional) Example: true
Response  200
HideShow
Headers
Content-Type: application/json
Body
[
  {
    "active": true,
    "end": 1494440662973,
    "externalId": "123",
    "id": "8cc5a895-965f-4907-96fa-b62e259b004e",
    "label": "2020-2021",
    "start": 1462904494515,
    "yearId": "788b8e90-e850-49c4-8467-c484c3de84b7"
  }
]

Get a Single Term
GET/api/cm/calendar/terms/{id}

Example URI

GET /api/cm/calendar/terms/fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4
URI Parameters
HideShow
id
string (required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4

auto-generated option ID

Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "active": true,
  "end": 1494440662973,
  "externalId": "123",
  "id": "8cc5a895-965f-4907-96fa-b62e259b004e",
  "label": "2020-2021",
  "start": 1462904494515,
  "yearId": "788b8e90-e850-49c4-8467-c484c3de84b7"
}

Update Term
PUT/api/cm/calendar/terms/{id}

Modify a term by sending a PUT request with the modified JSON representation of the term as the body. The response will return the modified version of the term, or a 404 if no term with that id is found.

Dates on terms cannot overlap one another, they must be contained within their associated years, they must have a valid associated year, and may not have their start and end dates out of order. Id SHOULD NOT be updated.

Example URI

PUT /api/cm/calendar/terms/fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4
URI Parameters
HideShow
id
string (required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4

auto-generated option ID

Request
HideShow
Body
{
  "active": false
}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
  "active": true,
  "end": 1494440662973,
  "externalId": "123",
  "id": "8cc5a895-965f-4907-96fa-b62e259b004e",
  "label": "2020-2021",
  "start": 1462904494515,
  "yearId": "788b8e90-e850-49c4-8467-c484c3de84b7"
}
Response  404
HideShow
Headers
Content-Type: text/plain
Body
"No term found with that ID"

Delete Term
DELETE/api/cm/calendar/terms/{id}

Calling this endpoint will either delete, or inactivate a term depending upon its used state. When a term is deleted without anything using it, it is removed from the database. When a term is deleted and things are using it, it will be inactivated.

Example URI

DELETE /api/cm/calendar/terms/fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4
URI Parameters
HideShow
id
string (required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4

auto-generated option ID

Response  204
HideShow
Headers
Content-Type: application/json
Response  404
HideShow
Headers
Content-Type: text/plain
Body
"No term found with that ID"

CM - Gadgets

This section will provide a reference to using existing gadget's to create an item using our API.

Please reference your own schema (how to get course schema ) to identify the created API labels associated to your configured gadget's.

When viewing your schema it will look something like this:

{
  "courseTitle": {
    "type" :  "Text",
    "label" : "Course Title",
    ...
  },
  "courseLevel": {
    "type": "Checkboxes",
    "label": "Course Level",
    "options": [
        {
            "key": "beginner",
            "text": "Beginner"
        },
        {
            "key": "Advanced",
            "text": "Advanced"
        }
    ]
    ...
  },
  ...
}

Key things to note from the above example:

  • “courseTitle” and “courseLevel” are what is referred to as APILabels. These are how you specify which specific gadget you want to populate.

  • type : This is the gadget type. The most popular gadget types are documented below.

The following is a list of the most popular gadget's and the data types/formats they require.

All gadget documentation is coming soon.


Activities

Documentation coming soon.


Addenda

Format: ApiLabel:Object

Note: This gadget references addendum added through the CM workflow and therefore probably should not be populated via the api.


Alias

Format: ApiLabel : Array

Array is an array of Objects of the form {“code” : optionID, “number” : String} where optionID comes from your options data as described in Referencing a Specific Option.

Example:

{
    "alias": [
        {
            "code": "d78580be-c169-4b5f-9140-6e6d79dc4b44",
            "number": "1010"
        }
    ],
}

Benchmarks - DEPRECATED

This Gadget is no longer supported.


CESM

Documentation coming soon.


Changes

Documentation coming soon.


Checkbox

Format: APILabel : Boolean

Example:

{
  "isRequired": true,
}

Checkboxes

Format: APILabel : Object

Object consists of key/value pairs of the form checkboxesOptionAPILabel:true for each value you want selected. You can obtain the checkboxesOptionAPILabels from your course schema. (See Course Schema )

Example:

{
  "semestersOffered": {
    "fall":   true,
    "spring": true,
    "summer": true,
  },
}

CourseMultiselect - DEPRECATED

Note: CourseMultiselect has been replaced with the more generic ItemMultiselect which uses the exact same format but allows more items (Programs, Experiences, etc.).


CourseTypeahead

Format: APILabel : courseID

courseID is the id property of a course item (see Get Courses ).

Example:

{
  "followedBy": "3efac7f0-ee22-45d1-8e9e-00e90c75de98"
}

Credits

Documentation coming soon.


Crosslistings - DEPRECATED

No longer supported. This Gadget can be replaced by the Alias Gadget.


DateDropdown

A dateObject will consist of the following key : value pairs.

  • Required - type: String - ‘year’ | ‘month’ | ‘term’.

  • Required - year: String

  • Optional - month: String - Only required when type is set to ‘month’.

  • Optional - termOptionId: String - Only required when type is set to ‘term’.

Note: Obtain your termOptionId from your options data as described in Referencing a Specific Option.

Format: APILabel : dateObject

Example:

{
  "startTerm": {
    "month": "",
    "termOptionId": "4ee3f161-b506-439a-b983-bc93a2f6b1ac",
    "type":  "year",
    "year":  "2016"
  },
}

Dependencies

Documentation coming soon.


DoubleText

Format: { “val1”: String, “val2”: String }

Example:

{
  "additionalRequiredCoursework": {
    "val1": "Attend a baseball game",
    "val2": "play a game of baseball."
  }
}

Dropdown

Format: APILabel : String

Example:

{
  "guestInstructor": "bobGibson"
}

FileUpload

Format: APILabel : filesArray

A filesArray will consist of one or more fileObject's

A fileObject will consist of the following key : value pairs.

  • Required - id : String - Unique Id for existing file.

  • Required - size : Integer

  • Required - uploaded : String - Date: See example below for format.

  • Required - filename : String

  • Required - contentType : String

Note: With the API, you can only reference a file that has already been uploaded through the UI.

Example:

{
  "computerScienceSyllabus": [
    {
      "id":          "e7948763-be32-4ec8-8c1a-02a9b81bd2ab",
      "size":        1552074,
      "uploaded":    "2016-09-29T01:23:45.6789Z",
      "filename":    "cs_syllabus_2016.pdf",
      "contentType": "application/pdf",
    },
  ],
}

ForeignCourses

Documentation coming soon.


GroupsMultiselect

Documentation coming soon.


GroupsTypeahead

Format: APILabel : groupID

Note: Refer to your groups data to obtain your groupID

Example:

{
  "department": "79a9be2d-e897-445d-9ee7-43f60a15b25e",
}

Inherit - DEPRECATED

This Gadget is no longer supported.


InheritFromTypeahead

Documentation coming soon.


Inheritance

Documentation coming soon.


ItemMultiselect

Format: APILabel : Array

Array is an array of Strings where each String is the id property of an item such as a course, program, experience, or specialization. (see Get Courses ).

Example:

{
  "similarCourses": [
    "3efac7f0-ee22-45d1-8e9e-00e90c75de98",
    "be327f7c-c853-4030-a7b8-7b41a4ecf39d"
  ],
}

JACS - DEPRECATED

No longer supported. This Gadget can be replaced by the PercentageList Gadget.


LearningObjective - DEPRECATED

No longer supported. This Gadget will be replaced by the OmegaRules Gadget.


LinkedInstitutionSubjectCodes

Documentation coming soon.


MimicText

Documentation coming soon.


NewProgramRules - DEPRECATED

No longer supported. This Gadget will be replaced by the OmegaRules Gadget.


NewSpecialization

Documentation coming soon.


NumberBuilder

Documentation coming soon.


OmegaRules

Format: APILabel : omegaRulesObject

An omegaRulesObject will consist of the following key : value pairs.

  • Required - mode : String - flat | groupings

  • Optional - rules : Array - Used if mode === flat, contains one or more rulesObject's

  • Optional - groupings : Array - Used if mode === groupings, contains one or more groupingsObject's

A groupingsObject will consist of the following key : value pairs.

  • Required - id : String

  • Required - key : String

  • Required - label : Boolean

  • Required - rules : rulesObject

  • Required - inactive : Boolean

A rulesObject will consist of the following key : value pairs.

  • Required - logic : String - All characters listed, must have a ruleObject in the rules array that has an alpha value that matches.

  • Required - rules : Array

A ruleObject will consist of the following key : value pairs.

  • Required - key : String - Must match a character in the logic string.

  • Required - data : Object - The data rule requires.

  • Required - alpha : String - Single character string that must be represented in the rulesObject : ‘logic’ string.

Example:

{
  "engineeringOmegaRules": {
    "mode": "groupings",
    "groupings": [
      {
        "id":       "0123456789098",
        "key":      "abcdefghijklm",
        "label":    "Required Courses",
        "inactive": false,
        "rules": {
          "logic": "A",
          "rules": [
            {
              "key":   "nopqrstuvwxyz",
              "data":  { // some data },
              "alpha": "A",
            },
          ],
        },
      },
    ],
  },
}

OptionsDropdown

Format : APILabel : optionID

Note: ‘optionID’ comes from your options data as described in Referencing a Specific Option.

Example:

{
  "department": "d78580be-c169-4b5f-9140-6e6d79dc4b44"
}

OptionsCheckboxes

Format : APILabel : Object

Object consists of key/value pairs of the form optionID:true for each option you want selected. Note: ‘optionID’ comes from your options data as described in Referencing a Specific Option.

Example:

{
  "relatedTopics": {
    "01378710-8617-4664-b969-cdec0bc0b112": true,
    "66e120be-c448-4bac-813d-c63491b90e85": true
  },
}

OptionsMultiselect

Format : [optionID1, optionID2]

Note: 'optionID’s come from your options data as described in Referencing a Specific Option.

Example:

{
  "campuses": [
    "5dab0b15-ae9d-4afe-9b16-637605ee1424",
    "6d0a548d-6d90-46a6-8d2b-7c8fbed849c1"
  ],
}

OptionsRadios

Format : APILabel : optionID

Note: ‘optionID’ comes from your options data as described in Referencing a Specific Option.

Example:

{
  "speed": "78f6abae-3dd1-456a-b324-62f1c7dec2ed",
}

OptionsTypeahead

Format : APILabel : optionID

Note: ‘optionID’ comes from your options data as described in Referencing a Specific Option.

Example:

{
  "physicalEffortRequired": "f9f64344-347b-4eaf-8b92-bcbeec852a30"
}

OutcomeDependencies - DEPRECATED

This Gadget is no longer supported.


Outcomes

Documentation coming soon.


PercentageList

Format: APILabel: Array

Array is an array of Objects of the form {“category” : optionID, “percentage” : String} where optionID comes from your options data as described in Referencing a Specific Option.

Example:

{
  "relatedTopicSplits": [
    {
      "category": "01378710-8617-4664-b969-cdec0bc0b112",
      "percentage": "90"
    },
    {
      "category": "66e120be-c448-4bac-813d-c63491b90e85",
      "percentage": "10"
    }
  ],
}

PgroupItems

Documentation coming soon.


ProgramRules - DEPRECATED

No longer supported. This Gadget will be replaced by the OmegaRules Gadget.

Format: APILabel: programRulesObject

A programRulesObject will consist of the following key : value pairs.

  • Required - rules : Array - Contains one or more ruleObject's

A ruleObject will consist of the following key : value pairs.

  • Required - id : String - Obtained from your rule's schema.

  • Optional - type : String - Obtained from your rule's schema.

  • Optional - rules : Object - Any rule's that this rule depends on.

  • Optional - subtype : String - Obtained from your rule's schema.

  • Required - isRuleSet : Boolean - Obtained from your rule's schema.

  • Required - alphaCharacter : String - Obtained from your rule's schema.

Note: Some rule objects have built-in properties that you may need. Please refer to your rule schema.

Example:

{
  "computerScienceRules": {
    "rules": [
      {
        "id":             "abcdefghijklm",
        "type":           "",
        "subtype":        "",
        "isRuleSet":      false,
        "alphaCharacter": "A",
        "rules": {
          "rules": [
            {
              "id":             "nopqrstuvwxyz",
              "type":           "numberCourses",
              "subtype":        "typesOfCoursesNumber",
              "isRuleSet":      false,
              "minCredits":     2,
              "freeFormText":   "Must have completed at least 2 General Studies credit(s).",
              "alphaCharacter": "A",
            },
          ],
        },
      },
    ],
  },
}

ProgramTypeahead

Documentation coming soon.


Radios

Format: APILabel : radioOptionAPILabel

Note: radioOptionAPILabel is the key of the radio option that you want selected - obtain this from your course schema. (See Course Schema )

Example:

{
  "level": "beginner",
}

RepeatableForCredits - DEPRECATED

No longer supported. This Gadget’s functionality should be replaced by using progressive disclosure.


RichText

Format: APILabel : String

Example:

{
  "description": "<p>As America's pastime for over <strong>one hundred years,</strong> an understanding of baseball is essential to a <em>well-rounded</em> education for any student.  This course provides an overview and basic understanding of the origins and rules of <a href="https://en.wikipedia.org/wiki/Baseball">baseball</a>.  Included are:</p> <ul> <li>Origins</li> <li>Rules</li> <li>Evolution</li> <li>Baseball in Today's World</li> </ul>",
}

Rules - DEPRECATED

No longer supported. This Gadget will be replaced by the OmegaRules Gadget.


Specializations - DEPRECATED

This Gadget is no longer supported.


StageCreditLimit

Documentation coming soon.


SubjectCodeBuilder - DEPRECATED

This Gadget is no longer supported.


Table

Documentation coming soon.


Tags

Documentation coming soon.


TermsMultiselect

Documentation coming soon.


TermsPicker

Documentation coming soon.


TermsTypeahead

Documentation coming soon.


Text

Format: APILabel : String

Example:

{
  "subjectCode": "BASE",
}

Textarea

Format: APILabel : String

Example:

{
  "title": "Introduction to Baseball",
}

UKAssessment

Documentation coming soon.


UKCredits - DEPRECATED

This Gadget is no longer supported.


UserMultiselect

Documentation coming soon.


UserTypeahead

Documentation coming soon.


WorkflowViewer

Documentation coming soon.


YearlyPlan - DEPRECATED

This Gadget is no longer supported.


APPENDIX

Referencing a specific option

A number of the gadgets require a reference to a specific optionID. These optionIDs come from the defined options (see CM - Options ). To determine the optionID for a specific option you must first know which optionType it belongs to (see Option Types ). The optionType for a given gadget will generally be specified in your [Course Schema]((#cm-courses,-programs,-experiences,-and-specializations-course-schema-get).

For example, if in your Course Schema you’ve got a gadget defined as follows:

{
    "speed": {
        "descriptiveText": "Course Speed",
        "helpText": "<p>The speed at which the course is taught.</p>",
        "label": "Speed",
        "optionsType": "Speed",
        "placeholder": "Speed",
        "type": "OptionsRadios",
        "proposal": false
    },
}

and you wanted to create a course with a “speed” value of “Slow” you would reference the “Speed” optionsType by going to /api/cm/options/types/Speed where you would get something like:

[
    {
        "active": true,
        "id": "85fd69a3-b6ea-48a3-aaf7-bf7e1376da1d",
        "locale": "en-US",
        "name": "Medium",
        "type": "Speed"
    },
    {
        "active": true,
        "id": "78f6abae-3dd1-456a-b324-62f1c7dec2ed",
        "locale": "en-US",
        "name": "Slow",
        "type": "Speed"
    },
    {
        "active": true,
        "id": "d0b150a3-dcb2-4757-b793-776d48313da4",
        "locale": "en-US",
        "name": "Fast",
        "type": "Speed"
    }
]

giving you "speed": "78f6abae-3dd1-456a-b324-62f1c7dec2ed" as the entry needed to populate that field with a “speed” value of “Slow”.

Catalog

Hosting

This section will provide descriptions and examples of how to embed Catalog on your site.

  1. Link the Kuali Catalog stylesheet in the <head> tag on the page where the catalog is to be displayed. Add a meta tag to ensure proper mobile operation.

Example:

<head>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="https://[your-domain].kuali.co/catalog/build/catalog.css">
</head>
  1. Add a <div id="kuali-catalog"> tag on the page where you want the catalog to be displayed.

Example:

<!-- Your website header here -->
  <div id="kuali-catalog"></div>
<!-- Your website footer here -->
  1. Set the subdomain from which to pull items (if you have more than one school, this will be the default subdomain). This can be in an inline <script> as shown below, or an externally loaded script.

If you have multi-catalog enabled on your environment, you will also need to specify a window.catalogId here. Talk to a Kuali representative to learn more about multi-catalog functionality.

Example:

<script>
  window.subdomain = 'https://[your-domain].kuali.co';
  // If you have multi-catalog enabled:
  window.catalogId = '[catalogId]';
</script>
  1. Run the catalog.js script by adding a <script> tag as the very last item in your <body> section:

Example:

<body>
  <!-- Your website content here -->
  <script src="https://[your-domain].kuali.co/catalog/build/catalog.js"></script>
</body>

A complete example:

<html>
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://monsters.kuali.co/catalog/build/catalog.css">
  </head>
  <body>
    <!-- Your website header here -->
    <div> Check out this sweet catalog </div>
    <div id="kuali-catalog"></div>
    <!-- Your website footer here -->
    <script>
      window.subdomain = 'https://monsters.kuali.co';
      // If you have multi-catalog enabled:
      window.catalogId = '507f1f77bcf86cd799439011';
    </script>
    <script src="https://monsters.kuali.co/catalog/build/catalog.js"></script>
  </body>
</html>

Filtering Items

This section will provide explanations and examples of how Catalog determines which items to display if multi-catalog is not enabled for your institution.


Catalog Start Date

When a new Catalog is created in the UI, the user is required to insert a “Start Date” for the new Catalog.

This Date is key in determining which items will be displayed.

This Date is independent from the startTerm in CM.

Because we allow users to view any previous Catalog created, we use this Date to determine which set of courses/programs/specializations to display.

The current Catalog is the Catalog whose start date is the most recent but is less than or equal to today’s date.

Examples:

- Example 1 -
todayDate === '12/31/2016'

catalog1.startDate === '1/1/2016' <-- current
catalog2.startDate === '1/1/2017'
catalog3.startDate === '1/1/2018'

- Example 2 -
todayDate === '1/1/2017'

catalog1.startDate === '1/1/2016'
catalog2.startDate === '1/1/2017' <-- current
catalog3.startDate === '1/1/2018'

Include In Catalog

The Include In Catalog flag is a ‘Checkbox’ gadget on EACH item.

It MUST have the apiLabel of includeInCatalog.

By default we include any items that DO NOT have an includeInCatalog flag set.

This feature is fairly straight forward in that if the includeInCatalog value is true we will display the item. If it is false it will not be shown.


Catalog Activation Date

The Catalog Activation Date is a DatePicker gadget on EACH item.

It MUST have the apiLabel of catalogActivationDate.

This Date combined with the startDate of the Catalog being viewed will help filter which items will be displayed.

When viewing the current catalog:

Any active item (course, program, specialization) that has a catalogActivationDate prior to the current day is shown.

When viewing a past catalog:

An active item will be shown if it’s catalogActivationDate is before the next chronologically ordered catalog’s startDate.

Examples:

- Example with a CURRENT catalog -
todayDate = '1/2/2016'

item1.catalogActivationDate: '1/1/2015' <--- shown
item2.catalogActivationDate: '1/1/2016' <--- shown
item3.catalogActivationDate: '1/1/2017' <--- not shown

- Example with a PAST catalog -
catalog1.startDate === '1/1/2015' <-- viewing this one
catalog2.startDate === '1/1/2016' <-- inferred end date
catalog3.startDate === '1/1/2017'

item1.catalogActivationDate: '1/1/2015' <--- shown
item2.catalogActivationDate: '1/1/2016' <--- not shown
item3.catalogActivationDate: '1/1/2017' <--- not shown

DRAFT - Research - COI Disclosures

DRAFT: This section addresses API routes that deal with disclosures.

Disclosures

Get Disclosure
GET/api/coi/disclosures/:id

Requires valid API key with role of admin or user. Admins can access any disclosure. Users can only view disclosures that they have created

Example URI

GET /api/coi/disclosures/:id
URI Parameters
HideShow
id
number (required) Example: 1

The Id of the disclosure being retrieved.

Request
HideShow
Headers
Authorization: Bearer {authToken}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
{
  "id": 502,
  "typeCd": 2,
  "title": null,
  "dispositionTypeCd": null,
  "statusCd": 2,
  "submittedBy": "Tester, Joe",
  "submittedDate": "2015-10-27T19:17:59.000Z",
  "revisedDate": null,
  "startDate": "2015-10-27T19:16:04.000Z",
  "expiredDate": null,
  "lastReviewDate": null,
  "configId": 1,
  "entities": [
    {
      "id": 1501,
      "disclosureId": 502,
      "active": 1,
      "name": "Interstate Battery",
      "description": null,
      "answers": [
        {
          "questionId": 6,
          "answer": {
            "value": [
              "Small Business"
            ]
          },
          "finEntityId": 1501
        },
        {
          "questionId": 7,
          "answer": {
            "value": "No"
          },
          "finEntityId": 1501
        },
        {
          "questionId": 9,
          "answer": {
            "value": "They Make Batteries"
          },
          "finEntityId": 1501
        },
        {
          "questionId": 8,
          "answer": {
            "value": "Yes"
          },
          "finEntityId": 1501
        }
      ],
      "files": [
        {
          "id": 1,
          "file_type": "financialEntity",
          "ref_id": 1501,
          "type": "\"application/pdf\"",
          "key": "26754681772fb166828db7a5df881c2b",
          "name": "test.pdf",
          "user_id": "10000000002",
          "uploaded_by": "Tester, Joe",
          "upload_date": "2015-10-27T19:17:46.000Z"
        }
      ],
      "relationships": [
        {
          "id": 1501,
          "finEntityId": 1501,
          "relationshipCd": 4,
          "personCd": 2,
          "typeCd": 8,
          "amountCd": 16,
          "comments": "I made some batteries for them",
          "travel": {}
        },
        {
          "id": 1502,
          "finEntityId": 1501,
          "relationshipCd": 2,
          "personCd": 1,
          "typeCd": 3,
          "amountCd": 3,
          "comments": "My Wife Works There",
          "travel": {}
        }
      ]
    }
  ],
  "answers": [
    {
      "id": 1,
      "questionId": 2,
      "answer": {
        "value": "Yes"
      }
    },
    {
      "id": 2,
      "questionId": 1,
      "answer": {
        "value": "No"
      }
    },
    {
      "id": 3,
      "questionId": 3,
      "answer": {
        "value": "No"
      }
    },
    {
      "id": 4,
      "questionId": 4,
      "answer": {
        "value": "No"
      }
    },
    {
      "id": 5,
      "questionId": 5,
      "answer": {
        "value": "Hawaii"
      }
    }
  ],
  "declarations": [
    {
      "id": 3001,
      "projectId": 1005,
      "finEntityId": 1501,
      "typeCd": 3,
      "comments": null,
      "projectTitle": "Longevity of car batteries",
      "entityName": "Interstate Battery",
      "projectTypeCd": 1,
      "sponsorName": "Air Force",
      "roleCd": "PI",
      "finEntityActive": 1
    }
  ],
  "comments": [
    {
      "id": 1,
      "disclosureId": 502,
      "topicSection": "Questionnaire",
      "topicId": 2,
      "text": "Is This True?",
      "author": "COI Admin",
      "userId": "10000000121",
      "date": "2015-10-27T19:21:05.000Z",
      "piVisible": 1,
      "reviewerVisible": 0,
      "isCurrentUser": true
    }
  ],
  "files": [
    {
      "id": 2,
      "name": "test.pdf",
      "key": "0d1623fc72faad2e5be26642485ab523"
    }
  ],
  "managementPlan": [
    {
      "id": 3,
      "name": "test.pdf",
      "key": "8db71460d8169c9e169481a4603f0811"
    }
  ]
}

Annual Disclosures

Get Annual Disclosure
GET/api/coi/disclosures/annual

Requires valid API key with role of admin or user. Admins and users can only view their own annual disclosure

Example URI

GET /api/coi/disclosures/annual
Request
HideShow
Headers
Authorization: Bearer {authToken}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
{
  "id": 502,
  "typeCd": 2,
  "title": null,
  "dispositionTypeCd": null,
  "statusCd": 2,
  "submittedBy": "Tester, Joe",
  "submittedDate": "2015-10-27T19:17:59.000Z",
  "revisedDate": null,
  "startDate": "2015-10-27T19:16:04.000Z",
  "expiredDate": null,
  "lastReviewDate": null,
  "configId": 1,
  "entities": [
    {
      "id": 1501,
      "disclosureId": 502,
      "active": 1,
      "name": "Interstate Battery",
      "description": null,
      "answers": [
        {
          "questionId": 6,
          "answer": {
            "value": [
              "Small Business"
            ]
          },
          "finEntityId": 1501
        },
        {
          "questionId": 7,
          "answer": {
            "value": "No"
          },
          "finEntityId": 1501
        },
        {
          "questionId": 9,
          "answer": {
            "value": "They Make Batteries"
          },
          "finEntityId": 1501
        },
        {
          "questionId": 8,
          "answer": {
            "value": "Yes"
          },
          "finEntityId": 1501
        }
      ],
      "files": [
        {
          "id": 1,
          "file_type": "financialEntity",
          "ref_id": 1501,
          "type": "\"application/pdf\"",
          "key": "26754681772fb166828db7a5df881c2b",
          "name": "test.pdf",
          "user_id": "10000000002",
          "uploaded_by": "Tester, Joe",
          "upload_date": "2015-10-27T19:17:46.000Z"
        }
      ],
      "relationships": [
        {
          "id": 1501,
          "finEntityId": 1501,
          "relationshipCd": 4,
          "personCd": 2,
          "typeCd": 8,
          "amountCd": 16,
          "comments": "I made some batteries for them",
          "travel": {}
        },
        {
          "id": 1502,
          "finEntityId": 1501,
          "relationshipCd": 2,
          "personCd": 1,
          "typeCd": 3,
          "amountCd": 3,
          "comments": "My Wife Works There",
          "travel": {}
        }
      ]
    }
  ],
  "answers": [
    {
      "id": 1,
      "questionId": 2,
      "answer": {
        "value": "Yes"
      }
    },
    {
      "id": 2,
      "questionId": 1,
      "answer": {
        "value": "No"
      }
    },
    {
      "id": 3,
      "questionId": 3,
      "answer": {
        "value": "No"
      }
    },
    {
      "id": 4,
      "questionId": 4,
      "answer": {
        "value": "No"
      }
    },
    {
      "id": 5,
      "questionId": 5,
      "answer": {
        "value": "Hawaii"
      }
    }
  ],
  "declarations": [
    {
      "id": 3001,
      "projectId": 1005,
      "finEntityId": 1501,
      "typeCd": 3,
      "comments": null,
      "projectTitle": "Longevity of car batteries",
      "entityName": "Interstate Battery",
      "projectTypeCd": 1,
      "sponsorName": "Air Force",
      "roleCd": "PI",
      "finEntityActive": 1
    }
  ],
  "comments": [
    {
      "id": 1,
      "disclosureId": 502,
      "topicSection": "Questionnaire",
      "topicId": 2,
      "text": "Is This True?",
      "author": "COI Admin",
      "userId": "10000000121",
      "date": "2015-10-27T19:21:05.000Z",
      "piVisible": 1,
      "reviewerVisible": 0,
      "isCurrentUser": true
    }
  ],
  "files": [
    {
      "id": 2,
      "name": "test.pdf",
      "key": "0d1623fc72faad2e5be26642485ab523"
    }
  ],
  "managementPlan": [
    {
      "id": 3,
      "name": "test.pdf",
      "key": "8db71460d8169c9e169481a4603f0811"
    }
  ]
}

Annual Disclosures For User

Get Annual Disclosure by User Id
GET/api/coi/users/:id/disclosures/annual

Requires valid API key with role of admin or reviewer. Enables an admin or reviewer to get a user’s annual disclosure

Example URI

GET /api/coi/users/:id/disclosures/annual
Request
HideShow
Headers
Authorization: Bearer {authToken}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
{
  "id": 502,
  "typeCd": 2,
  "title": null,
  "dispositionTypeCd": null,
  "statusCd": 2,
  "submittedBy": "Tester, Joe",
  "submittedDate": "2015-10-27T19:17:59.000Z",
  "revisedDate": null,
  "startDate": "2015-10-27T19:16:04.000Z",
  "expiredDate": null,
  "lastReviewDate": null,
  "configId": 1,
  "entities": [
    {
      "id": 1501,
      "disclosureId": 502,
      "active": 1,
      "name": "Interstate Battery",
      "description": null,
      "answers": [
        {
          "questionId": 6,
          "answer": {
            "value": [
              "Small Business"
            ]
          },
          "finEntityId": 1501
        },
        {
          "questionId": 7,
          "answer": {
            "value": "No"
          },
          "finEntityId": 1501
        },
        {
          "questionId": 9,
          "answer": {
            "value": "They Make Batteries"
          },
          "finEntityId": 1501
        },
        {
          "questionId": 8,
          "answer": {
            "value": "Yes"
          },
          "finEntityId": 1501
        }
      ],
      "files": [
        {
          "id": 1,
          "file_type": "financialEntity",
          "ref_id": 1501,
          "type": "\"application/pdf\"",
          "key": "26754681772fb166828db7a5df881c2b",
          "name": "test.pdf",
          "user_id": "10000000002",
          "uploaded_by": "Tester, Joe",
          "upload_date": "2015-10-27T19:17:46.000Z"
        }
      ],
      "relationships": [
        {
          "id": 1501,
          "finEntityId": 1501,
          "relationshipCd": 4,
          "personCd": 2,
          "typeCd": 8,
          "amountCd": 16,
          "comments": "I made some batteries for them",
          "travel": {}
        },
        {
          "id": 1502,
          "finEntityId": 1501,
          "relationshipCd": 2,
          "personCd": 1,
          "typeCd": 3,
          "amountCd": 3,
          "comments": "My Wife Works There",
          "travel": {}
        }
      ]
    }
  ],
  "answers": [
    {
      "id": 1,
      "questionId": 2,
      "answer": {
        "value": "Yes"
      }
    },
    {
      "id": 2,
      "questionId": 1,
      "answer": {
        "value": "No"
      }
    },
    {
      "id": 3,
      "questionId": 3,
      "answer": {
        "value": "No"
      }
    },
    {
      "id": 4,
      "questionId": 4,
      "answer": {
        "value": "No"
      }
    },
    {
      "id": 5,
      "questionId": 5,
      "answer": {
        "value": "Hawaii"
      }
    }
  ],
  "declarations": [
    {
      "id": 3001,
      "projectId": 1005,
      "finEntityId": 1501,
      "typeCd": 3,
      "comments": null,
      "projectTitle": "Longevity of car batteries",
      "entityName": "Interstate Battery",
      "projectTypeCd": 1,
      "sponsorName": "Air Force",
      "roleCd": "PI",
      "finEntityActive": 1
    }
  ],
  "comments": [
    {
      "id": 1,
      "disclosureId": 502,
      "topicSection": "Questionnaire",
      "topicId": 2,
      "text": "Is This True?",
      "author": "COI Admin",
      "userId": "10000000121",
      "date": "2015-10-27T19:21:05.000Z",
      "piVisible": 1,
      "reviewerVisible": 0,
      "isCurrentUser": true
    }
  ],
  "files": [
    {
      "id": 2,
      "name": "test.pdf",
      "key": "0d1623fc72faad2e5be26642485ab523"
    }
  ],
  "managementPlan": [
    {
      "id": 3,
      "name": "test.pdf",
      "key": "8db71460d8169c9e169481a4603f0811"
    }
  ]
}

Financial Entity

Create Financial Entity
POST/api/coi/disclosures/:id/financial-entities

Requires valid API key with role of admin or user. Admins and users can only create financial entities for their own disclosures

Example URI

POST /api/coi/disclosures/:id/financial-entities
URI Parameters
HideShow
id
number (required) Example: 1

The id of the parent disclosure.

Request
HideShow
Headers
Authorization: Bearer {authToken}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
{
              "active":1,
              "answers":[
                {
                  "questionId":6,
                  "answer":{
                    "value":[
                      "Small Business"
                    ]
                  },
                  "id":15
                },
                {
                  "questionId":7,
                  "answer":{
                    "value":"Yes"
                  },
                  "id":16
                },
                {
                  "questionId":8,
                  "answer":{
                    "value":"Yes"
                  },
                  "id":17
                },
                {
                  "questionId":9,
                  "answer":{
                    "value":"Makes Batteries"
                  },
                  "id":18
                }
              ],
              "name":"Interstate Battery",
              "files":[
                {
                  "file_type":"financialEntity",
                  "ref_id":1502,
                  "type":"\"application/pdf\"",
                  "key":"38fca76ec3c31f6a6d0b1a6037e9876b",
                  "name":"test.pdf",
                  "user_id":"10000000007",
                  "uploaded_by":"Blood, Opal",
                  "upload_date":"2015-10-27T19:45:58.389Z",
                  "id":4
                }
              ],
              "relationships":[
                {
                  "personCd":2,
                  "relationshipCd":4,
                  "typeCd":8,
                  "amountCd":18,
                  "comments":"I created some
             batteries for them",
                  "travel":{

                  },
                  "id":1503,
                  "amount":"Over $10,000",
                  "type":"Royalty Income",
                  "relationship":"Intellectual Property",
                  "person":"Self",
                  "finEntityId":1502
                }
              ],
              "id":1502
            }

Financial Entity

Update Financial Entity
PUT/api/coi/disclosures/:id/financial-entities/:entityId

Requires valid API key with role of admin or user. Admins and users can only update their own diclosure’s financial entities.

Example URI

PUT /api/coi/disclosures/:id/financial-entities/:entityId
URI Parameters
HideShow
id
number (required) Example: 1

The id of the parent diclosure.

entityId
number (required) Example: 54

The id of the financial entity being updated.

Request
HideShow
Headers
Authorization: Bearer {authToken}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
{
  "count": 1,
  "totalFound": 1,
  "organizations": [
    {
      "organizationName": "University",
      "address": "1375 N Scottsdale Rd, Suite 480, Scottsdale, AZ 85257-3454",
      "organizationId": "000001",
      "contact": {
        "middleName": null,
        "county": "Maricopa",
        "emailAddress": "sean.warren@rsmart.com",
        "active": true,
        "city": "Scottsdale",
        "suffix": null,
        "postalCode": "85257-3454",
        "lastName": "Warren",
        "addressLine3": null,
        "addressLine2": "Suite 480",
        "state": "AZ",
        "firstName": "Sean",
        "sponsor": null,
        "prefix": null,
        "rolodexId": 100013,
        "phoneNumber": "480-414-0450",
        "countryCode": "USA",
        "addressLine1": "1375 N Scottsdale Rd, Scottsdale, AZ 85257-3454",
        "title": "OSP Approver",
        "faxNumber": "602-391-2172"
      }
    }
  ]
}

Declarations

Create Declaration
POST/api/coi/disclosures/:id/declarations

Requires valid API key with role of admin or user. Admins and users can only create declarations for their own disclosures

Example URI

POST /api/coi/disclosures/:id/declarations
URI Parameters
HideShow
id
number (required) Example: 1

The id of the parent disclosure

Request
HideShow
Headers
Authorization: Bearer {authToken}
Body
{
  "finEntityId": 1502,
  "typeCd": 1,
  "projectId": 1003
}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
{
  "finEntityId": 1502,
  "typeCd": 1,
  "projectId": 1003,
  "disclosure_id": "503",
  "id": 3002
}

Declarations

Update Declaration
PUT/api/coi/disclosures/:id/declarations/:declarationId

Requires valid API key with role of admin or user. Admins and users can only update their own diclosure’s declarations.

Example URI

PUT /api/coi/disclosures/:id/declarations/:declarationId
URI Parameters
HideShow
id
number (required) Example: 1

The id of the parent disclosure.

declarationId
number (required) Example: 23

The id of the declaration being updated.

Request
HideShow
Headers
Authorization: Bearer {authToken}
Body
{
  "finEntityId": 1502,
  "typeCd": 2,
  "projectId": 1003,
  "disclosure_id": "503",
  "id": 3002
}
Response  200

Question Answers

Create Question Answer
POST/api/coi/disclosures/:id/question-answers

Requires valid API key with role of admin or user. Admins and users can only create question answers for their own disclosures

Example URI

POST /api/coi/disclosures/:id/question-answers
URI Parameters
HideShow
id
number (required) Example: 1

The id of the parent disclosure.

Request
HideShow
Headers
Authorization: Bearer {authToken}
Body
{
  "questionId": 2,
  "answer": {
    "value": "No"
  }
}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
{
  "questionId": 2,
  "answer": {
    "value": "No"
  },
  "id": 10
}

Delete Question Answer
DELETE/api/coi/disclosures/:id/question-answers

Requires valid API key with role of admin or user. Admins and users can only delete their own diclosure’s question answers.

Example URI

DELETE /api/coi/disclosures/:id/question-answers
URI Parameters
HideShow
id
number (required) Example: 1

The id of the parent disclosure.

Request
HideShow
Headers
Authorization: Bearer {authToken}
Body
{
  toDelete: [ 5 ]
}
Response  204

Question Answers

Update Question Answer
PUT/api/coi/disclosures/:id/question-answers/:questionId

Requires valid API key with role of admin or user. Admins and users can only update their own diclosure’s question answers.

Example URI

PUT /api/coi/disclosures/:id/question-answers/:questionId
URI Parameters
HideShow
id
number (required) Example: 1

The id of the parent disclosure.

questionId
number (required) Example: 3

The id of the question being answered.

Request
HideShow
Headers
Authorization: Bearer {authToken}
Body
{
  "id": 11,
  "questionId": 1,
  "answer": {
    "value": "No"
  },
  "question": {
    "id": 1,
    "active": 1,
    "questionnaireId": 1,
    "parent": null,
    "question": {
      "order": 2,
      "text": "From any privately held organization, do you have stock, stock options, or other equity interest of any value?",
      "type": "Yes/No",
      "validations": [
        "required"
      ],
      "numberToShow": 2
    }
  }
}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
{
  "id": 11,
  "questionId": 1,
  "answer": {
    "value": "No"
  },
  "question": {
    "id": 1,
    "active": 1,
    "questionnaireId": 1,
    "parent": null,
    "question": {
      "order": 2,
      "text": "From any privately held organization, do you have stock, stock options, or other equity interest of any value?",
      "type": "Yes/No",
      "validations": [
        "required"
      ],
      "numberToShow": 2
    }
  }
}

PI Review Items

Get PI Review Items
GET/api/coi/disclosures/:id/pi-review-items

Requires valid API key with role of admin or user. Admins and users can only get pi review items for their own disclosures.

Example URI

GET /api/coi/disclosures/:id/pi-review-items
URI Parameters
HideShow
id
number (required) Example: 1

The id of the parent disclosure.

Request
HideShow
Headers
Authorization: Bearer {authToken}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
{
  "questions":[
    {
      "id":1,
      "question":{
        "order":2,
        "text":"From any privately held organization, do you have
 stock, stock options, or other equity interest of any value?",
        "type":"Yes/No",
        "validations":[
          "required"
        ],
        "numberToShow":2
      },
      "answer":"{\"value\":\"No\"}",
      "comments":[
        {
          "id":2,
          "topicId":1,
          "text":"Fix This",
          "author":"COI Admin",
          "date":"2015-10-27T20:08:20.000Z",
          "userId":"10000000121"
        }
      ],
      "reviewId":2,
      "reviewedOn":null,
      "revised":null,
      "respondedTo":null
    },
    {
      "id":2,
      "question":{
        "order":1,
        "text":"From any for-profit organization
, did you receive in the last 12 months, or do you expect to receive in the next 12 months, salary, director's
 fees, consulting payments, honoraria, royalties; or other payments for patents, copyrights or other
 intellectual property; or other direct payments exceeding $5,000?",
        "type":"Yes/No",
        "validations":[
          "required"
        ],
        "numberToShow":1
      },
      "answer":"{\"value\":\"Yes\"}",
      "subQuestions":[
        {
          "id":5,
          "question":{
            "order":1,
            "text":"If Yes, did the organization send you on vacation?",
            "type":"Text area",
            "displayCriteria":"Yes",
            "numberToShow":"1-A"
          },
          "parent":2,
          "answer":"{\"value\":\"Hawaii\"}"
        }
      ],
      "comments":[
        {
          "id":1,
          "topicId":2,
          "text":"Is This
 True?",
          "author":"COI Admin",
          "date":"2015-10-27T19:21:05.000Z",
          "userId":"10000000121"
        }
      ],
      "reviewId":1,
      "reviewedOn":null,
      "revised":null,
      "respondedTo":null
    }
  ],
  "entities":[
    {
      "id":1501,
      "name":"Interstate Battery",
      "disclosureId":502,
      "answers":[
        {
          "questionId":6,
          "answer":"{\"value\":[\"Small Business\"]}",
          "finEntityId":1501
        },
        {
          "questionId":7,
          "answer":"{\"value\":\"No\"}",
          "finEntityId":1501
        },
        {
          "questionId":9,
          "answer":"{
\"value\":\"They Make Batteries\"}",
          "finEntityId":1501
        },
        {
          "questionId":8,
          "answer":"{\"value\":\"Yes\"
}",
          "finEntityId":1501
        }
      ],
      "relationships":[
        {
          "id":1501,
          "comments":"I made some batteries for them",
          "relationshipCd":4,
          "personCd":2,
          "typeCd":8,
          "amountCd":16,
          "finEntityId":1501
        },
        {
          "id":1502,
          "comments":"My Wife Works There",
          "relationshipCd":2,
          "personCd":1,
          "typeCd":3,
          "amountCd":3,
          "finEntityId":1501
        }
      ],
      "comments":[
        {
          "id":3,
          "topicId":1501,
          "text":"fix this",
          "author":"COI Admin",
          "date":"2015-10-27T20:10:48.000Z",
          "userId":"10000000121"
        }
      ],
      "reviewId":3,
      "reviewedOn":null,
      "revised":null,
      "respondedTo":null,
      "files":[
        {
          "id":1,
          "name":"test.pdf",
          "key":"26754681772fb166828db7a5df881c2b",
          "refId":1501
        }
      ]
    }
  ],
  "declarations":[
    {
      "title":"Longevity of car
 batteries",
      "id":1005,
      "entities":[
        {
          "name":"Interstate Battery",
          "id":1501,
          "projectId":1005,
          "comments":null,
          "relationshipCd":3,
          "adminComments":[
            {
              "id":4,
              "topicId":3001,
              "text":"fix this too",
              "author":"COI
 Admin",
              "date":"2015-10-27T20:10:56.000Z",
              "userId":"10000000121"
            }
          ],
          "reviewId":4,
          "reviewedOn":null,
          "revised":null,
          "respondedTo":null
        }
      ]
    }
  ],
  "configId":1
}

Disclosure User Summaries

Get User Disclosure Summaries
GET/api/coi/disclosure-user-summaries/

Requires valid API key with role of admin or user. Admins and users can only retrieve their own disclosure user summaries

Example URI

GET /api/coi/disclosure-user-summaries/
Request
HideShow
Headers
Authorization: Bearer {authToken}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
[
  {
    "expired_date": null,
    "type": 2,
    "title": null,
    "status": 1,
    "last_review_date": null,
    "id": 503
  }
]

Disclosure Summaries

Get Disclosure Summaries
GET/api/coi/disclosure-summaries/

Requires valid API key with role of admin. Admins can view all disclosure summaries.

Example URI

GET /api/coi/disclosure-summaries/
Request
HideShow
Headers
Authorization: Bearer {authToken}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
[
  {
    "submitted_by": "Tester, Joe",
    "revised_date": null,
    "statusCd": 2,
    "type": "Annual Disclosure",
    "id": 502,
    "submitted_date": "2015-10-27T19:17:59.000Z"
  },
  {
    "submitted_by": "Cate, Allyson",
    "revised_date": null,
    "statusCd": 2,
    "type": "Annual Disclosure",
    "id": 504,
    "submitted_date": "2015-10-27T20:25:54.000Z"
  }
]

Archived Disclosures Latest

Get Archived Disclosure
GET/api/coi/archived-disclosures/:id/latest

Requires valid API key with role of admin or user. Admins can view any latest archived disclosure. Users can view their own latest archived disclosures.

Example URI

GET /api/coi/archived-disclosures/:id/latest
URI Parameters
HideShow
id
number (required) Example: 1

The id of the disclosure being retrieved.

Request
HideShow
Headers
Authorization: Bearer {authToken}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
{
  "id": 502,
  "typeCd": 2,
  "title": null,
  "dispositionTypeCd": null,
  "statusCd": 2,
  "submittedBy": "Tester, Joe",
  "submittedDate": "2015-10-27T19:17:59.000Z",
  "revisedDate": null,
  "startDate": "2015-10-27T19:16:04.000Z",
  "expiredDate": null,
  "lastReviewDate": null,
  "configId": 1,
  "entities": [
    {
      "id": 1501,
      "disclosureId": 502,
      "active": 1,
      "name": "Interstate Battery",
      "description": null,
      "answers": [
        {
          "questionId": 6,
          "answer": {
            "value": [
              "Small Business"
            ]
          },
          "finEntityId": 1501
        },
        {
          "questionId": 7,
          "answer": {
            "value": "No"
          },
          "finEntityId": 1501
        },
        {
          "questionId": 9,
          "answer": {
            "value": "They Make Batteries"
          },
          "finEntityId": 1501
        },
        {
          "questionId": 8,
          "answer": {
            "value": "Yes"
          },
          "finEntityId": 1501
        }
      ],
      "files": [
        {
          "id": 1,
          "file_type": "financialEntity",
          "ref_id": 1501,
          "type": "\"application/pdf\"",
          "key": "26754681772fb166828db7a5df881c2b",
          "name": "test.pdf",
          "user_id": "10000000002",
          "uploaded_by": "Tester, Joe",
          "upload_date": "2015-10-27T19:17:46.000Z"
        }
      ],
      "relationships": [
        {
          "id": 1501,
          "finEntityId": 1501,
          "relationshipCd": 4,
          "personCd": 2,
          "typeCd": 8,
          "amountCd": 16,
          "comments": "I made some batteries for them",
          "travel": {}
        },
        {
          "id": 1502,
          "finEntityId": 1501,
          "relationshipCd": 2,
          "personCd": 1,
          "typeCd": 3,
          "amountCd": 3,
          "comments": "My Wife Works There",
          "travel": {}
        }
      ]
    }
  ],
  "answers": [
    {
      "id": 1,
      "questionId": 2,
      "answer": {
        "value": "Yes"
      }
    },
    {
      "id": 2,
      "questionId": 1,
      "answer": {
        "value": "No"
      }
    },
    {
      "id": 3,
      "questionId": 3,
      "answer": {
        "value": "No"
      }
    },
    {
      "id": 4,
      "questionId": 4,
      "answer": {
        "value": "No"
      }
    },
    {
      "id": 5,
      "questionId": 5,
      "answer": {
        "value": "Hawaii"
      }
    }
  ],
  "declarations": [
    {
      "id": 3001,
      "projectId": 1005,
      "finEntityId": 1501,
      "typeCd": 3,
      "comments": null,
      "projectTitle": "Longevity of car batteries",
      "entityName": "Interstate Battery",
      "projectTypeCd": 1,
      "sponsorName": "Air Force",
      "roleCd": "PI",
      "finEntityActive": 1
    }
  ],
  "comments": [
    {
      "id": 1,
      "disclosureId": 502,
      "topicSection": "Questionnaire",
      "topicId": 2,
      "text": "Is This True?",
      "author": "COI Admin",
      "userId": "10000000121",
      "date": "2015-10-27T19:21:05.000Z",
      "piVisible": 1,
      "reviewerVisible": 0,
      "isCurrentUser": true
    }
  ],
  "files": [
    {
      "id": 2,
      "name": "test.pdf",
      "key": "0d1623fc72faad2e5be26642485ab523"
    }
  ],
  "managementPlan": [
    {
      "id": 3,
      "name": "test.pdf",
      "key": "8db71460d8169c9e169481a4603f0811"
    }
  ]
}

DRAFT - Research - COI Configurations

DRAFT: This section addresses API routes that deal with COI Configurations.

Configuration

Get Latest Configuration
GET/api/coi/config

Requires valid API key.

Example URI

GET /api/coi/config
Request
HideShow
Headers
Authorization: Bearer {authToken}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
{
  "colors":{
    "one":"#348FF7",
    "two":"#0E4BB6",
    "three":"#048EAF",
    "four":"#EDF2F2"
  },
  "matrixTypes":[
    {
      "typeCd":1,
      "description":"Ownership",
      "enabled":1,
      "typeEnabled":1,
      "amountEnabled":1,
      "destinationEnabled":0,
      "dateEnabled":0,
      "reasonEnabled":0,
      "typeOptions":[
        {
          "typeCd":5,
          "relationshipCd":1,
          "description":"Stock",
          "active":1
        },
        {
          "typeCd":6,
          "relationshipCd":1,
          "description":"Stock Options",
          "active":1
        },
        {
          "typeCd":7,
          "relationshipCd":1,
          "description":"Other Ownership",
          "active":1
        }
      ],
      "amountOptions":[
        {
          "typeCd":6,
          "relationshipCd":1,
          "description":"$1 - $5,000",
          "active":1
        },
        {
          "typeCd":7,
          "relationshipCd":1,
          "description":"$5,001 - $10,000",
          "active":1
        },
        {
          "typeCd":8,
          "relationshipCd":1,
          "description":"Over $10,000",
          "active":1
        },
        {
          "typeCd":9,
          "relationshipCd":1,
          "description":"Privately Held, no valuation",
          "active":1
        },
        {
          "typeCd":10,
          "relationshipCd":1,
          "description":"Does not apply",
          "active":1
        }
      ]
    },
    {
      "typeCd":2,
      "description":"Offices/Positions",
      "enabled":1,
      "typeEnabled":1,
      "amountEnabled":1,
      "destinationEnabled":0,
      "dateEnabled":0,
      "reasonEnabled":0,
      "typeOptions":[
        {
          "typeCd":1,
          "relationshipCd":2,
          "description":"Partner",
          "active":1
        },
        {
          "typeCd":2,
          "relationshipCd":2,
          "description":"Board Member",
          "active":1
        },
        {
          "typeCd":3,
          "relationshipCd":2,
          "description":"Other Managerial Positions",
          "active":1
        },
        {
          "typeCd":4,
          "relationshipCd":2,
          "description":"Founder",
          "active":1
        }
      ],
      "amountOptions":[
        {
          "typeCd":1,
          "relationshipCd":2,
          "description":"$1 - $5,000",
          "active":1
        },
        {
          "typeCd":2,
          "relationshipCd":2,
          "description":"$5,001 - $10,000",
          "active":1
        },
        {
          "typeCd":3,
          "relationshipCd":2,
          "description":"Over $10,000",
          "active":1
        },
        {
          "typeCd":4,
          "relationshipCd":2,
          "description":"Privately Held, no valuation",
          "active":1
        },
        {
          "typeCd":5,
          "relationshipCd":2,
          "description":"Does not apply",
          "active":1
        }
      ]
    },
    {
      "typeCd":3,
      "description":"Paid Activities",
      "enabled":1,
      "typeEnabled":0,
      "amountEnabled":1,
      "destinationEnabled":0,
      "dateEnabled":0,
      "reasonEnabled":0,
      "typeOptions":[

      ],
      "amountOptions":[
        {
          "typeCd":11,
          "relationshipCd":3,
          "description":"$1 - $5,000",
          "active":1
        },
        {
          "typeCd":12,
          "relationshipCd":3,
          "description":"$5,001 - $10,000",
          "active":1
        },
        {
          "typeCd":13,
          "relationshipCd":3,
          "description":"Over $10,000",
          "active":1
        },
        {
          "typeCd":14,
          "relationshipCd":3,
          "description":"Privately
 Held, no valuation",
          "active":1
        },
        {
          "typeCd":15,
          "relationshipCd":3,
          "description":"Does not apply",
          "active":1
        }
      ]
    },
    {
      "typeCd":4,
      "description":"Intellectual Property",
      "enabled":1,
      "typeEnabled":1,
      "amountEnabled":1,
      "destinationEnabled":0,
      "dateEnabled":0,
      "reasonEnabled":0,
      "typeOptions":[
        {
          "typeCd":8,
          "relationshipCd":4,
          "description":"Royalty Income",
          "active":1
        },
        {
          "typeCd":9,
          "relationshipCd":4,
          "description":"Intellectual
 Property Rights",
          "active":1
        }
      ],
      "amountOptions":[
        {
          "typeCd":16,
          "relationshipCd":4,
          "description":"$1 - $5
,000",
          "active":1
        },
        {
          "typeCd":17,
          "relationshipCd":4,
          "description":"$5,001 - $10,000",
          "active":1
        },
        {
          "typeCd":18,
          "relationshipCd":4,
          "description":"Over $10,000",
          "active":1
        },
        {
          "typeCd":19,
          "relationshipCd":4,
          "description":"Privately Held, no valuation",
          "active":1
        },
        {
          "typeCd":20,
          "relationshipCd":4,
          "description":"Does not apply",
          "active":1
        }
      ]
    },
    {
      "typeCd":5,
      "description":"Other",
      "enabled":1,
      "typeEnabled":1,
      "amountEnabled":1,
      "destinationEnabled":0,
      "dateEnabled":0,
      "reasonEnabled":0,
      "typeOptions":[
        {
          "typeCd":10,
          "relationshipCd":5,
          "description":"Contract",
          "active":1
        },
        {
          "typeCd":11,
          "relationshipCd":5,
          "description":"Other Transactions",
          "active":1
        }
      ],
      "amountOptions":[
        {
          "typeCd":21,
          "relationshipCd":5,
          "description":"$1 - $5,000",
          "active":1
        },
        {
          "typeCd":22,
          "relationshipCd":5,
          "description":"$5,001 - $10,000",
          "active":1
        },
        {
          "typeCd":23,
          "relationshipCd":5,
          "description":"Over $10
,000",
          "active":1
        },
        {
          "typeCd":24,
          "relationshipCd":5,
          "description":"Privately Held, no valuation",
          "active":1
        },
        {
          "typeCd":25,
          "relationshipCd":5,
          "description":"Does not apply",
          "active":1
        }
      ]
    },
    {
      "typeCd":6,
      "description":"Travel",
      "enabled":0,
      "typeEnabled":0,
      "amountEnabled":1,
      "destinationEnabled":1,
      "dateEnabled":1,
      "reasonEnabled":1,
      "typeOptions":[

      ],
      "amountOptions":[

      ]
    }
  ],
  "relationshipPersonTypes":[
    {
      "typeCd":1,
      "description":"Spouse",
      "active":1
    },
    {
      "typeCd":2,
      "description":"Self",
      "active":1
    },
    {
      "typeCd":3,
      "description":"Other",
      "active":1
    },
    {
      "typeCd":4,
      "description":"Entity",
      "active":1
    }
  ],
  "declarationTypes":[
    {
      "typeCd":1,
      "description":"No
 Conflict",
      "enabled":1,
      "custom":0,
      "active":1
    },
    {
      "typeCd":2,
      "description":"Managed Relationship",
      "enabled":1,
      "custom":0,
      "active":1
    },
    {
      "typeCd":3,
      "description":"Potential Relationship",
      "enabled":1,
      "custom":1,
      "active":1
    }
  ],
  "disclosureTypes":[
    {
      "typeCd":1,
      "description":"Manual Disclosure",
      "enabled":0
    },
    {
      "typeCd":2,
      "description":"Annual Disclosure",
      "enabled":1
    },
    {
      "typeCd":3,
      "description":"Project Disclosure",
      "enabled":0
    },
    {
      "typeCd":4,
      "description":"Travel Log",
      "enabled":0
    }
  ],
  "notifications":[

  ],
  "questions":{
    "screening":[
      {
        "id":1,
        "active":1,
        "questionnaireId":1,
        "parent":null,
        "question":{
          "order":2,
          "text":"From any privately held organization
, do you have stock, stock options, or other equity interest of any value?",
          "type":"Yes/No",
          "validations":[
            "required"
          ],
          "numberToShow":2
        }
      },
      {
        "id":2,
        "active":1,
        "questionnaireId":1,
        "parent":null,
        "question":{
          "order":1,
          "text":"From any for-profit organization, did you receive in the last 12 months, or do you expect
 to receive in the next 12 months, salary, director's fees, consulting payments, honoraria, royalties
; or other payments for patents, copyrights or other intellectual property; or other direct payments
 exceeding $5,000?",
          "type":"Yes/No",
          "validations":[
            "required"
          ],
          "numberToShow":1
        }
      },
      {
        "id":3,
        "active":1,
        "questionnaireId":1,
        "parent":null,
        "question":{
          "order":3,
          "text":"Some publicly traded stock must be disclosed
, but only in specific circumstances. Do you own stock, which in aggregate exceeds $5,000, in a company
 that provides funds to this institution in support of your Institutional Responsibilities (e.g. teaching
, research, committee, or other administrative responsibilities)? When aggregating, please consider stock
, stock options, warrants and other existing or contingent ownership interests in the publicly held company
. Do not consider investments where you do not directly influence investment decisions, such as mutual
 funds and retirement accounts.",
          "type":"Yes/No",
          "validations":[
            "required"
          ],
          "numberToShow":3
        }
      },
      {
        "id":4,
        "active":1,
        "questionnaireId":1,
        "parent":null,
        "question":{
          "order":4,
          "text":"From US educational institutions
, US teaching hospitals or US research institutions affiliated with US educational institutions: Did
 you receive in the last 12 months, or do you expect to receive in the next 12 months, payments for services
, which in aggregate exceed $5,000 (e.g. payments for consulting, board positions, patents, copyrights
 or other intellectual property)? Exclude payments for scholarly or academic works (i.e. peer-reviewed
 (vs. editorial reviewed) articles or books based on original research or experimentation, published
 by an academic association or a university/academic press).",
          "type":"Yes/No",
          "validations":[
            "required"
          ],
          "numberToShow":4
        }
      },
      {
        "id":5,
        "active":1,
        "questionnaireId":1,
        "parent":2,
        "question":{
          "order":1,
          "text":"If
 Yes, did the organization send you on vacation?",
          "type":"Text area",
          "displayCriteria":"Yes",
          "numberToShow":"1-A"
        }
      }
    ],
    "entities":[
      {
        "id":6,
        "active":1,
        "questionnaireId":2,
        "parent":null,
        "question":{
          "order":1,
          "text":"Type:",
          "type":"Multiselect",
          "validations":[
            "required"
          ],
          "numberToShow":1,
          "options":[
            "State Government",
            "County Government",
            "Small Business"
          ],
          "requiredNumSelections":1
        }
      },
      {
        "id":7,
        "active":1,
        "questionnaireId":2,
        "parent":null,
        "question":{
          "order":2,
          "text":"Is this entity public?",
          "type":"Yes/No",
          "validations":[
            "required"
          ],
          "numberToShow":2
        }
      },
      {
        "id":8,
        "active":1,
        "questionnaireId":2,
        "parent":null,
        "question":{
          "order":3,
          "text":"Does this entity sponsor any of your research?",
          "type":"Yes/No",
          "validations":[
            "required"
          ],
          "numberToShow":3
        }
      },
      {
        "id":9,
        "active":1,
        "questionnaireId":2,
        "parent":null,
        "question":{
          "order":4,
          "text":"Describe the entity's area of business and your relationship to it:",
          "type":"Text area",
          "validations":[
            "required"
          ],
          "numberToShow":4
        }
      }
    ]
  },
  "disclosureStatus":[
    {
      "statusCd":1,
      "description":"In Progress"
    },
    {
      "statusCd":2,
      "description":"Submitted for Approval"
    },
    {
      "statusCd":3,
      "description":"Up to Date"
    },
    {
      "statusCd":4,
      "description":"Updates Required"
    },
    {
      "statusCd":5,
      "description":"Expired"
    },
    {
      "statusCd":6,
      "description":"Resubmitted"
    }
  ],
  "projectTypes":[
    {
      "typeCd":1,
      "description":"Proposal"
    },
    {
      "typeCd":2,
      "description":"Institutional Proposal"
    },
    {
      "typeCd":3,
      "description":"IRB Protocol"
    },
    {
      "typeCd":4,
      "description":"IACUC Protocol"
    },
    {
      "typeCd":5,
      "description":"Award"
    }
  ],
  "general":{
    "peopleEnabled":true,
    "sponsorLookup":true,
    "dueDate":"2015-02-01T06:00:00.000Z",
    "isRollingDueDate":false,
    "instructions":{
      "Questionnaire":"Questionnaire Instructions",
      "Financial Entities":"Financial Entities Instructions",
      "Project Declaration":"Project Declaration Instructions",
      "Certification":"Certification Instructions"
    },
    "certificationOptions":{
      "text":"Certification Text",
      "required":true
    }
  }
}

Create New Config
POST/api/coi/config

Requires valid API key with role of admin. Creates new entry in config table and updates config values in other tables.

Example URI

POST /api/coi/config
Request
HideShow
Headers
Authorization: Bearer {authToken}
Body
{
      "colors":{
        "one":"#348FF7",
        "two":"#0E4BB6",
        "three":"#048EAF",
        "four":"#EDF2F2"
      },
      "matrixTypes":[
        {
          "typeCd":1,
          "description":"Ownership",
          "enabled":1,
          "typeEnabled":1,
          "amountEnabled":1,
          "destinationEnabled":0,
          "dateEnabled":0,
          "reasonEnabled":0,
          "typeOptions":[
            {
              "typeCd":5,
              "relationshipCd":1,
              "description":"Stock",
              "active":1
            },
            {
              "typeCd":6,
              "relationshipCd":1,
              "description":"Stock Options",
              "active":1
            },
            {
              "typeCd":7,
              "relationshipCd":1,
              "description":"Other Ownership",
              "active":1
            }
          ],
          "amountOptions":[
            {
              "typeCd":6,
              "relationshipCd":1,
              "description":"$1 - $5,000",
              "active":1
            },
            {
              "typeCd":7,
              "relationshipCd":1,
              "description":"$5,001 - $10,000",
              "active":1
            },
            {
              "typeCd":8,
              "relationshipCd":1,
              "description":"Over $10,000",
              "active":1
            },
            {
              "typeCd":9,
              "relationshipCd":1,
              "description":"Privately Held, no valuation",
              "active":1
            },
            {
              "typeCd":10,
              "relationshipCd":1,
              "description":"Does not apply",
              "active":1
            }
          ]
        },
        {
          "typeCd":2,
          "description":"Offices/Positions",
          "enabled":1,
          "typeEnabled":1,
          "amountEnabled":1,
          "destinationEnabled":0,
          "dateEnabled":0,
          "reasonEnabled":0,
          "typeOptions":[
            {
              "typeCd":1,
              "relationshipCd":2,
              "description":"Partner",
              "active":1
            },
            {
              "typeCd":2,
              "relationshipCd":2,
              "description":"Board Member",
              "active":1
            },
            {
              "typeCd":3,
              "relationshipCd":2,
              "description":"Other Managerial Positions",
              "active":1
            },
            {
              "typeCd":4,
              "relationshipCd":2,
              "description":"Founder",
              "active":1
            }
          ],
          "amountOptions":[
            {
              "typeCd":1,
              "relationshipCd":2,
              "description":"$1 - $5,000",
              "active":1
            },
            {
              "typeCd":2,
              "relationshipCd":2,
              "description":"$5,001 - $10,000",
              "active":1
            },
            {
              "typeCd":3,
              "relationshipCd":2,
              "description":"Over $10,000",
              "active":1
            },
            {
              "typeCd":4,
              "relationshipCd":2,
              "description":"Privately Held, no valuation",
              "active":1
            },
            {
              "typeCd":5,
              "relationshipCd":2,
              "description":"Does not apply",
              "active":1
            }
          ]
        },
        {
          "typeCd":3,
          "description":"Paid Activities",
          "enabled":1,
          "typeEnabled":0,
          "amountEnabled":1,
          "destinationEnabled":0,
          "dateEnabled":0,
          "reasonEnabled":0,
          "typeOptions":[

          ],
          "amountOptions":[
            {
              "typeCd":11,
              "relationshipCd":3,
              "description":"$1 - $5,000",
              "active":1
            },
            {
              "typeCd":12,
              "relationshipCd":3,
              "description":"$5,001 - $10,000",
              "active":1
            },
            {
              "typeCd":13,
              "relationshipCd":3,
              "description":"Over $10,000",
              "active":1
            },
            {
              "typeCd":14,
              "relationshipCd":3,
              "description":"Privately
     Held, no valuation",
              "active":1
            },
            {
              "typeCd":15,
              "relationshipCd":3,
              "description":"Does not apply",
              "active":1
            }
          ]
        },
        {
          "typeCd":4,
          "description":"Intellectual Property",
          "enabled":1,
          "typeEnabled":1,
          "amountEnabled":1,
          "destinationEnabled":0,
          "dateEnabled":0,
          "reasonEnabled":0,
          "typeOptions":[
            {
              "typeCd":8,
              "relationshipCd":4,
              "description":"Royalty Income",
              "active":1
            },
            {
              "typeCd":9,
              "relationshipCd":4,
              "description":"Intellectual
     Property Rights",
              "active":1
            }
          ],
          "amountOptions":[
            {
              "typeCd":16,
              "relationshipCd":4,
              "description":"$1 - $5
    ,000",
              "active":1
            },
            {
              "typeCd":17,
              "relationshipCd":4,
              "description":"$5,001 - $10,000",
              "active":1
            },
            {
              "typeCd":18,
              "relationshipCd":4,
              "description":"Over $10,000",
              "active":1
            },
            {
              "typeCd":19,
              "relationshipCd":4,
              "description":"Privately Held, no valuation",
              "active":1
            },
            {
              "typeCd":20,
              "relationshipCd":4,
              "description":"Does not apply",
              "active":1
            }
          ]
        },
        {
          "typeCd":5,
          "description":"Other",
          "enabled":1,
          "typeEnabled":1,
          "amountEnabled":1,
          "destinationEnabled":0,
          "dateEnabled":0,
          "reasonEnabled":0,
          "typeOptions":[
            {
              "typeCd":10,
              "relationshipCd":5,
              "description":"Contract",
              "active":1
            },
            {
              "typeCd":11,
              "relationshipCd":5,
              "description":"Other Transactions",
              "active":1
            }
          ],
          "amountOptions":[
            {
              "typeCd":21,
              "relationshipCd":5,
              "description":"$1 - $5,000",
              "active":1
            },
            {
              "typeCd":22,
              "relationshipCd":5,
              "description":"$5,001 - $10,000",
              "active":1
            },
            {
              "typeCd":23,
              "relationshipCd":5,
              "description":"Over $10
    ,000",
              "active":1
            },
            {
              "typeCd":24,
              "relationshipCd":5,
              "description":"Privately Held, no valuation",
              "active":1
            },
            {
              "typeCd":25,
              "relationshipCd":5,
              "description":"Does not apply",
              "active":1
            }
          ]
        },
        {
          "typeCd":6,
          "description":"Travel",
          "enabled":0,
          "typeEnabled":0,
          "amountEnabled":1,
          "destinationEnabled":1,
          "dateEnabled":1,
          "reasonEnabled":1,
          "typeOptions":[

          ],
          "amountOptions":[

          ]
        }
      ],
      "relationshipPersonTypes":[
        {
          "typeCd":1,
          "description":"Spouse",
          "active":1
        },
        {
          "typeCd":2,
          "description":"Self",
          "active":1
        },
        {
          "typeCd":3,
          "description":"Other",
          "active":1
        },
        {
          "typeCd":4,
          "description":"Entity",
          "active":1
        }
      ],
      "declarationTypes":[
        {
          "typeCd":1,
          "description":"No
     Conflict",
          "enabled":1,
          "custom":0,
          "active":1
        },
        {
          "typeCd":2,
          "description":"Managed Relationship",
          "enabled":1,
          "custom":0,
          "active":1
        },
        {
          "typeCd":3,
          "description":"Potential Relationship",
          "enabled":1,
          "custom":1,
          "active":1
        }
      ],
      "disclosureTypes":[
        {
          "typeCd":1,
          "description":"Manual Disclosure",
          "enabled":0
        },
        {
          "typeCd":2,
          "description":"Annual Disclosure",
          "enabled":1
        },
        {
          "typeCd":3,
          "description":"Project Disclosure",
          "enabled":0
        },
        {
          "typeCd":4,
          "description":"Travel Log",
          "enabled":0
        }
      ],
      "notifications":[

      ],
      "questions":{
        "screening":[
          {
            "id":1,
            "active":1,
            "questionnaireId":1,
            "parent":null,
            "question":{
              "order":2,
              "text":"From any privately held organization
    , do you have stock, stock options, or other equity interest of any value?",
              "type":"Yes/No",
              "validations":[
                "required"
              ],
              "numberToShow":2
            }
          },
          {
            "id":2,
            "active":1,
            "questionnaireId":1,
            "parent":null,
            "question":{
              "order":1,
              "text":"From any for-profit organization, did you receive in the last 12 months, or do you expect
     to receive in the next 12 months, salary, director's fees, consulting payments, honoraria, royalties
    ; or other payments for patents, copyrights or other intellectual property; or other direct payments
     exceeding $5,000?",
              "type":"Yes/No",
              "validations":[
                "required"
              ],
              "numberToShow":1
            }
          },
          {
            "id":3,
            "active":1,
            "questionnaireId":1,
            "parent":null,
            "question":{
              "order":3,
              "text":"Some publicly traded stock must be disclosed
    , but only in specific circumstances. Do you own stock, which in aggregate exceeds $5,000, in a company
     that provides funds to this institution in support of your Institutional Responsibilities (e.g. teaching
    , research, committee, or other administrative responsibilities)? When aggregating, please consider stock
    , stock options, warrants and other existing or contingent ownership interests in the publicly held company
    . Do not consider investments where you do not directly influence investment decisions, such as mutual
     funds and retirement accounts.",
              "type":"Yes/No",
              "validations":[
                "required"
              ],
              "numberToShow":3
            }
          },
          {
            "id":4,
            "active":1,
            "questionnaireId":1,
            "parent":null,
            "question":{
              "order":4,
              "text":"From US educational institutions
    , US teaching hospitals or US research institutions affiliated with US educational institutions: Did
     you receive in the last 12 months, or do you expect to receive in the next 12 months, payments for services
    , which in aggregate exceed $5,000 (e.g. payments for consulting, board positions, patents, copyrights
     or other intellectual property)? Exclude payments for scholarly or academic works (i.e. peer-reviewed
     (vs. editorial reviewed) articles or books based on original research or experimentation, published
     by an academic association or a university/academic press).",
              "type":"Yes/No",
              "validations":[
                "required"
              ],
              "numberToShow":4
            }
          },
          {
            "id":5,
            "active":1,
            "questionnaireId":1,
            "parent":2,
            "question":{
              "order":1,
              "text":"If
     Yes, did the organization send you on vacation?",
              "type":"Text area",
              "displayCriteria":"Yes",
              "numberToShow":"1-A"
            }
          }
        ],
        "entities":[
          {
            "id":6,
            "active":1,
            "questionnaireId":2,
            "parent":null,
            "question":{
              "order":1,
              "text":"Type:",
              "type":"Multiselect",
              "validations":[
                "required"
              ],
              "numberToShow":1,
              "options":[
                "State Government",
                "County Government",
                "Small Business"
              ],
              "requiredNumSelections":1
            }
          },
          {
            "id":7,
            "active":1,
            "questionnaireId":2,
            "parent":null,
            "question":{
              "order":2,
              "text":"Is this entity public?",
              "type":"Yes/No",
              "validations":[
                "required"
              ],
              "numberToShow":2
            }
          },
          {
            "id":8,
            "active":1,
            "questionnaireId":2,
            "parent":null,
            "question":{
              "order":3,
              "text":"Does this entity sponsor any of your research?",
              "type":"Yes/No",
              "validations":[
                "required"
              ],
              "numberToShow":3
            }
          },
          {
            "id":9,
            "active":1,
            "questionnaireId":2,
            "parent":null,
            "question":{
              "order":4,
              "text":"Describe the entity's area of business and your relationship to it:",
              "type":"Text area",
              "validations":[
                "required"
              ],
              "numberToShow":4
            }
          }
        ]
      },
      "disclosureStatus":[
        {
          "statusCd":1,
          "description":"In Progress"
        },
        {
          "statusCd":2,
          "description":"Submitted for Approval"
        },
        {
          "statusCd":3,
          "description":"Up to Date"
        },
        {
          "statusCd":4,
          "description":"Updates Required"
        },
        {
          "statusCd":5,
          "description":"Expired"
        },
        {
          "statusCd":6,
          "description":"Resubmitted"
        }
      ],
      "projectTypes":[
        {
          "typeCd":1,
          "description":"Proposal"
        },
        {
          "typeCd":2,
          "description":"Institutional Proposal"
        },
        {
          "typeCd":3,
          "description":"IRB Protocol"
        },
        {
          "typeCd":4,
          "description":"IACUC Protocol"
        },
        {
          "typeCd":5,
          "description":"Award"
        }
      ],
      "general":{
        "peopleEnabled":true,
        "sponsorLookup":true,
        "dueDate":"2015-02-01T06:00:00.000Z",
        "isRollingDueDate":false,
        "instructions":{
          "Questionnaire":"Questionnaire Instructions",
          "Financial Entities":"Financial Entities Instructions",
          "Project Declaration":"Project Declaration Instructions",
          "Certification":"Certification Instructions"
        },
        "certificationOptions":{
          "text":"Certification Text",
          "required":true
        }
      }
    }
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
{
  "colors":{
    "one":"#348FF7",
    "two":"#0E4BB6",
    "three":"#048EAF",
    "four":"#EDF2F2"
  },
  "matrixTypes":[
    {
      "typeCd":1,
      "description":"Ownership",
      "enabled":1,
      "typeEnabled":1,
      "amountEnabled":1,
      "destinationEnabled":0,
      "dateEnabled":0,
      "reasonEnabled":0,
      "typeOptions":[
        {
          "typeCd":5,
          "relationshipCd":1,
          "description":"Stock",
          "active":1
        },
        {
          "typeCd":6,
          "relationshipCd":1,
          "description":"Stock Options",
          "active":1
        },
        {
          "typeCd":7,
          "relationshipCd":1,
          "description":"Other Ownership",
          "active":1
        }
      ],
      "amountOptions":[
        {
          "typeCd":6,
          "relationshipCd":1,
          "description":"$1 - $5,000",
          "active":1
        },
        {
          "typeCd":7,
          "relationshipCd":1,
          "description":"$5,001 - $10,000",
          "active":1
        },
        {
          "typeCd":8,
          "relationshipCd":1,
          "description":"Over $10,000",
          "active":1
        },
        {
          "typeCd":9,
          "relationshipCd":1,
          "description":"Privately Held, no valuation",
          "active":1
        },
        {
          "typeCd":10,
          "relationshipCd":1,
          "description":"Does not apply",
          "active":1
        }
      ]
    },
    {
      "typeCd":2,
      "description":"Offices/Positions",
      "enabled":1,
      "typeEnabled":1,
      "amountEnabled":1,
      "destinationEnabled":0,
      "dateEnabled":0,
      "reasonEnabled":0,
      "typeOptions":[
        {
          "typeCd":1,
          "relationshipCd":2,
          "description":"Partner",
          "active":1
        },
        {
          "typeCd":2,
          "relationshipCd":2,
          "description":"Board Member",
          "active":1
        },
        {
          "typeCd":3,
          "relationshipCd":2,
          "description":"Other Managerial Positions",
          "active":1
        },
        {
          "typeCd":4,
          "relationshipCd":2,
          "description":"Founder",
          "active":1
        }
      ],
      "amountOptions":[
        {
          "typeCd":1,
          "relationshipCd":2,
          "description":"$1 - $5,000",
          "active":1
        },
        {
          "typeCd":2,
          "relationshipCd":2,
          "description":"$5,001 - $10,000",
          "active":1
        },
        {
          "typeCd":3,
          "relationshipCd":2,
          "description":"Over $10,000",
          "active":1
        },
        {
          "typeCd":4,
          "relationshipCd":2,
          "description":"Privately Held, no valuation",
          "active":1
        },
        {
          "typeCd":5,
          "relationshipCd":2,
          "description":"Does not apply",
          "active":1
        }
      ]
    },
    {
      "typeCd":3,
      "description":"Paid Activities",
      "enabled":1,
      "typeEnabled":0,
      "amountEnabled":1,
      "destinationEnabled":0,
      "dateEnabled":0,
      "reasonEnabled":0,
      "typeOptions":[

      ],
      "amountOptions":[
        {
          "typeCd":11,
          "relationshipCd":3,
          "description":"$1 - $5,000",
          "active":1
        },
        {
          "typeCd":12,
          "relationshipCd":3,
          "description":"$5,001 - $10,000",
          "active":1
        },
        {
          "typeCd":13,
          "relationshipCd":3,
          "description":"Over $10,000",
          "active":1
        },
        {
          "typeCd":14,
          "relationshipCd":3,
          "description":"Privately
 Held, no valuation",
          "active":1
        },
        {
          "typeCd":15,
          "relationshipCd":3,
          "description":"Does not apply",
          "active":1
        }
      ]
    },
    {
      "typeCd":4,
      "description":"Intellectual Property",
      "enabled":1,
      "typeEnabled":1,
      "amountEnabled":1,
      "destinationEnabled":0,
      "dateEnabled":0,
      "reasonEnabled":0,
      "typeOptions":[
        {
          "typeCd":8,
          "relationshipCd":4,
          "description":"Royalty Income",
          "active":1
        },
        {
          "typeCd":9,
          "relationshipCd":4,
          "description":"Intellectual
 Property Rights",
          "active":1
        }
      ],
      "amountOptions":[
        {
          "typeCd":16,
          "relationshipCd":4,
          "description":"$1 - $5
,000",
          "active":1
        },
        {
          "typeCd":17,
          "relationshipCd":4,
          "description":"$5,001 - $10,000",
          "active":1
        },
        {
          "typeCd":18,
          "relationshipCd":4,
          "description":"Over $10,000",
          "active":1
        },
        {
          "typeCd":19,
          "relationshipCd":4,
          "description":"Privately Held, no valuation",
          "active":1
        },
        {
          "typeCd":20,
          "relationshipCd":4,
          "description":"Does not apply",
          "active":1
        }
      ]
    },
    {
      "typeCd":5,
      "description":"Other",
      "enabled":1,
      "typeEnabled":1,
      "amountEnabled":1,
      "destinationEnabled":0,
      "dateEnabled":0,
      "reasonEnabled":0,
      "typeOptions":[
        {
          "typeCd":10,
          "relationshipCd":5,
          "description":"Contract",
          "active":1
        },
        {
          "typeCd":11,
          "relationshipCd":5,
          "description":"Other Transactions",
          "active":1
        }
      ],
      "amountOptions":[
        {
          "typeCd":21,
          "relationshipCd":5,
          "description":"$1 - $5,000",
          "active":1
        },
        {
          "typeCd":22,
          "relationshipCd":5,
          "description":"$5,001 - $10,000",
          "active":1
        },
        {
          "typeCd":23,
          "relationshipCd":5,
          "description":"Over $10
,000",
          "active":1
        },
        {
          "typeCd":24,
          "relationshipCd":5,
          "description":"Privately Held, no valuation",
          "active":1
        },
        {
          "typeCd":25,
          "relationshipCd":5,
          "description":"Does not apply",
          "active":1
        }
      ]
    },
    {
      "typeCd":6,
      "description":"Travel",
      "enabled":0,
      "typeEnabled":0,
      "amountEnabled":1,
      "destinationEnabled":1,
      "dateEnabled":1,
      "reasonEnabled":1,
      "typeOptions":[

      ],
      "amountOptions":[

      ]
    }
  ],
  "relationshipPersonTypes":[
    {
      "typeCd":1,
      "description":"Spouse",
      "active":1
    },
    {
      "typeCd":2,
      "description":"Self",
      "active":1
    },
    {
      "typeCd":3,
      "description":"Other",
      "active":1
    },
    {
      "typeCd":4,
      "description":"Entity",
      "active":1
    }
  ],
  "declarationTypes":[
    {
      "typeCd":1,
      "description":"No
 Conflict",
      "enabled":1,
      "custom":0,
      "active":1
    },
    {
      "typeCd":2,
      "description":"Managed Relationship",
      "enabled":1,
      "custom":0,
      "active":1
    },
    {
      "typeCd":3,
      "description":"Potential Relationship",
      "enabled":1,
      "custom":1,
      "active":1
    }
  ],
  "disclosureTypes":[
    {
      "typeCd":1,
      "description":"Manual Disclosure",
      "enabled":0
    },
    {
      "typeCd":2,
      "description":"Annual Disclosure",
      "enabled":1
    },
    {
      "typeCd":3,
      "description":"Project Disclosure",
      "enabled":0
    },
    {
      "typeCd":4,
      "description":"Travel Log",
      "enabled":0
    }
  ],
  "notifications":[

  ],
  "questions":{
    "screening":[
      {
        "id":1,
        "active":1,
        "questionnaireId":1,
        "parent":null,
        "question":{
          "order":2,
          "text":"From any privately held organization
, do you have stock, stock options, or other equity interest of any value?",
          "type":"Yes/No",
          "validations":[
            "required"
          ],
          "numberToShow":2
        }
      },
      {
        "id":2,
        "active":1,
        "questionnaireId":1,
        "parent":null,
        "question":{
          "order":1,
          "text":"From any for-profit organization, did you receive in the last 12 months, or do you expect
 to receive in the next 12 months, salary, director's fees, consulting payments, honoraria, royalties
; or other payments for patents, copyrights or other intellectual property; or other direct payments
 exceeding $5,000?",
          "type":"Yes/No",
          "validations":[
            "required"
          ],
          "numberToShow":1
        }
      },
      {
        "id":3,
        "active":1,
        "questionnaireId":1,
        "parent":null,
        "question":{
          "order":3,
          "text":"Some publicly traded stock must be disclosed
, but only in specific circumstances. Do you own stock, which in aggregate exceeds $5,000, in a company
 that provides funds to this institution in support of your Institutional Responsibilities (e.g. teaching
, research, committee, or other administrative responsibilities)? When aggregating, please consider stock
, stock options, warrants and other existing or contingent ownership interests in the publicly held company
. Do not consider investments where you do not directly influence investment decisions, such as mutual
 funds and retirement accounts.",
          "type":"Yes/No",
          "validations":[
            "required"
          ],
          "numberToShow":3
        }
      },
      {
        "id":4,
        "active":1,
        "questionnaireId":1,
        "parent":null,
        "question":{
          "order":4,
          "text":"From US educational institutions
, US teaching hospitals or US research institutions affiliated with US educational institutions: Did
 you receive in the last 12 months, or do you expect to receive in the next 12 months, payments for services
, which in aggregate exceed $5,000 (e.g. payments for consulting, board positions, patents, copyrights
 or other intellectual property)? Exclude payments for scholarly or academic works (i.e. peer-reviewed
 (vs. editorial reviewed) articles or books based on original research or experimentation, published
 by an academic association or a university/academic press).",
          "type":"Yes/No",
          "validations":[
            "required"
          ],
          "numberToShow":4
        }
      },
      {
        "id":5,
        "active":1,
        "questionnaireId":1,
        "parent":2,
        "question":{
          "order":1,
          "text":"If
 Yes, did the organization send you on vacation?",
          "type":"Text area",
          "displayCriteria":"Yes",
          "numberToShow":"1-A"
        }
      }
    ],
    "entities":[
      {
        "id":6,
        "active":1,
        "questionnaireId":2,
        "parent":null,
        "question":{
          "order":1,
          "text":"Type:",
          "type":"Multiselect",
          "validations":[
            "required"
          ],
          "numberToShow":1,
          "options":[
            "State Government",
            "County Government",
            "Small Business"
          ],
          "requiredNumSelections":1
        }
      },
      {
        "id":7,
        "active":1,
        "questionnaireId":2,
        "parent":null,
        "question":{
          "order":2,
          "text":"Is this entity public?",
          "type":"Yes/No",
          "validations":[
            "required"
          ],
          "numberToShow":2
        }
      },
      {
        "id":8,
        "active":1,
        "questionnaireId":2,
        "parent":null,
        "question":{
          "order":3,
          "text":"Does this entity sponsor any of your research?",
          "type":"Yes/No",
          "validations":[
            "required"
          ],
          "numberToShow":3
        }
      },
      {
        "id":9,
        "active":1,
        "questionnaireId":2,
        "parent":null,
        "question":{
          "order":4,
          "text":"Describe the entity's area of business and your relationship to it:",
          "type":"Text area",
          "validations":[
            "required"
          ],
          "numberToShow":4
        }
      }
    ]
  },
  "disclosureStatus":[
    {
      "statusCd":1,
      "description":"In Progress"
    },
    {
      "statusCd":2,
      "description":"Submitted for Approval"
    },
    {
      "statusCd":3,
      "description":"Up to Date"
    },
    {
      "statusCd":4,
      "description":"Updates Required"
    },
    {
      "statusCd":5,
      "description":"Expired"
    },
    {
      "statusCd":6,
      "description":"Resubmitted"
    }
  ],
  "projectTypes":[
    {
      "typeCd":1,
      "description":"Proposal"
    },
    {
      "typeCd":2,
      "description":"Institutional Proposal"
    },
    {
      "typeCd":3,
      "description":"IRB Protocol"
    },
    {
      "typeCd":4,
      "description":"IACUC Protocol"
    },
    {
      "typeCd":5,
      "description":"Award"
    }
  ],
  "general":{
    "peopleEnabled":true,
    "sponsorLookup":true,
    "dueDate":"2015-02-01T06:00:00.000Z",
    "isRollingDueDate":false,
    "instructions":{
      "Questionnaire":"Questionnaire Instructions",
      "Financial Entities":"Financial Entities Instructions",
      "Project Declaration":"Project Declaration Instructions",
      "Certification":"Certification Instructions"
    },
    "certificationOptions":{
      "text":"Certification Text",
      "required":true
    }
  }
}

Archived Configuration

Get Archived Configuration
GET/api/coi/config/:id

Requires valid API key.

Example URI

GET /api/coi/config/:id
URI Parameters
HideShow
id
number (required) Example: 1

The Id of the config being retrieved.

Request
HideShow
Headers
Authorization: Bearer {authToken}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
{
  "colors":{
    "one":"#348FF7",
    "two":"#0E4BB6",
    "three":"#048EAF",
    "four":"#EDF2F2"
  },
  "matrixTypes":[
    {
      "typeCd":1,
      "description":"Ownership",
      "enabled":1,
      "typeEnabled":1,
      "amountEnabled":1,
      "destinationEnabled":0,
      "dateEnabled":0,
      "reasonEnabled":0,
      "typeOptions":[
        {
          "typeCd":5,
          "relationshipCd":1,
          "description":"Stock",
          "active":1
        },
        {
          "typeCd":6,
          "relationshipCd":1,
          "description":"Stock Options",
          "active":1
        },
        {
          "typeCd":7,
          "relationshipCd":1,
          "description":"Other Ownership",
          "active":1
        }
      ],
      "amountOptions":[
        {
          "typeCd":6,
          "relationshipCd":1,
          "description":"$1 - $5,000",
          "active":1
        },
        {
          "typeCd":7,
          "relationshipCd":1,
          "description":"$5,001 - $10,000",
          "active":1
        },
        {
          "typeCd":8,
          "relationshipCd":1,
          "description":"Over $10,000",
          "active":1
        },
        {
          "typeCd":9,
          "relationshipCd":1,
          "description":"Privately Held, no valuation",
          "active":1
        },
        {
          "typeCd":10,
          "relationshipCd":1,
          "description":"Does not apply",
          "active":1
        }
      ]
    },
    {
      "typeCd":2,
      "description":"Offices/Positions",
      "enabled":1,
      "typeEnabled":1,
      "amountEnabled":1,
      "destinationEnabled":0,
      "dateEnabled":0,
      "reasonEnabled":0,
      "typeOptions":[
        {
          "typeCd":1,
          "relationshipCd":2,
          "description":"Partner",
          "active":1
        },
        {
          "typeCd":2,
          "relationshipCd":2,
          "description":"Board Member",
          "active":1
        },
        {
          "typeCd":3,
          "relationshipCd":2,
          "description":"Other Managerial Positions",
          "active":1
        },
        {
          "typeCd":4,
          "relationshipCd":2,
          "description":"Founder",
          "active":1
        }
      ],
      "amountOptions":[
        {
          "typeCd":1,
          "relationshipCd":2,
          "description":"$1 - $5,000",
          "active":1
        },
        {
          "typeCd":2,
          "relationshipCd":2,
          "description":"$5,001 - $10,000",
          "active":1
        },
        {
          "typeCd":3,
          "relationshipCd":2,
          "description":"Over $10,000",
          "active":1
        },
        {
          "typeCd":4,
          "relationshipCd":2,
          "description":"Privately Held, no valuation",
          "active":1
        },
        {
          "typeCd":5,
          "relationshipCd":2,
          "description":"Does not apply",
          "active":1
        }
      ]
    },
    {
      "typeCd":3,
      "description":"Paid Activities",
      "enabled":1,
      "typeEnabled":0,
      "amountEnabled":1,
      "destinationEnabled":0,
      "dateEnabled":0,
      "reasonEnabled":0,
      "typeOptions":[

      ],
      "amountOptions":[
        {
          "typeCd":11,
          "relationshipCd":3,
          "description":"$1 - $5,000",
          "active":1
        },
        {
          "typeCd":12,
          "relationshipCd":3,
          "description":"$5,001 - $10,000",
          "active":1
        },
        {
          "typeCd":13,
          "relationshipCd":3,
          "description":"Over $10,000",
          "active":1
        },
        {
          "typeCd":14,
          "relationshipCd":3,
          "description":"Privately
 Held, no valuation",
          "active":1
        },
        {
          "typeCd":15,
          "relationshipCd":3,
          "description":"Does not apply",
          "active":1
        }
      ]
    },
    {
      "typeCd":4,
      "description":"Intellectual Property",
      "enabled":1,
      "typeEnabled":1,
      "amountEnabled":1,
      "destinationEnabled":0,
      "dateEnabled":0,
      "reasonEnabled":0,
      "typeOptions":[
        {
          "typeCd":8,
          "relationshipCd":4,
          "description":"Royalty Income",
          "active":1
        },
        {
          "typeCd":9,
          "relationshipCd":4,
          "description":"Intellectual
 Property Rights",
          "active":1
        }
      ],
      "amountOptions":[
        {
          "typeCd":16,
          "relationshipCd":4,
          "description":"$1 - $5
,000",
          "active":1
        },
        {
          "typeCd":17,
          "relationshipCd":4,
          "description":"$5,001 - $10,000",
          "active":1
        },
        {
          "typeCd":18,
          "relationshipCd":4,
          "description":"Over $10,000",
          "active":1
        },
        {
          "typeCd":19,
          "relationshipCd":4,
          "description":"Privately Held, no valuation",
          "active":1
        },
        {
          "typeCd":20,
          "relationshipCd":4,
          "description":"Does not apply",
          "active":1
        }
      ]
    },
    {
      "typeCd":5,
      "description":"Other",
      "enabled":1,
      "typeEnabled":1,
      "amountEnabled":1,
      "destinationEnabled":0,
      "dateEnabled":0,
      "reasonEnabled":0,
      "typeOptions":[
        {
          "typeCd":10,
          "relationshipCd":5,
          "description":"Contract",
          "active":1
        },
        {
          "typeCd":11,
          "relationshipCd":5,
          "description":"Other Transactions",
          "active":1
        }
      ],
      "amountOptions":[
        {
          "typeCd":21,
          "relationshipCd":5,
          "description":"$1 - $5,000",
          "active":1
        },
        {
          "typeCd":22,
          "relationshipCd":5,
          "description":"$5,001 - $10,000",
          "active":1
        },
        {
          "typeCd":23,
          "relationshipCd":5,
          "description":"Over $10
,000",
          "active":1
        },
        {
          "typeCd":24,
          "relationshipCd":5,
          "description":"Privately Held, no valuation",
          "active":1
        },
        {
          "typeCd":25,
          "relationshipCd":5,
          "description":"Does not apply",
          "active":1
        }
      ]
    },
    {
      "typeCd":6,
      "description":"Travel",
      "enabled":0,
      "typeEnabled":0,
      "amountEnabled":1,
      "destinationEnabled":1,
      "dateEnabled":1,
      "reasonEnabled":1,
      "typeOptions":[

      ],
      "amountOptions":[

      ]
    }
  ],
  "relationshipPersonTypes":[
    {
      "typeCd":1,
      "description":"Spouse",
      "active":1
    },
    {
      "typeCd":2,
      "description":"Self",
      "active":1
    },
    {
      "typeCd":3,
      "description":"Other",
      "active":1
    },
    {
      "typeCd":4,
      "description":"Entity",
      "active":1
    }
  ],
  "declarationTypes":[
    {
      "typeCd":1,
      "description":"No
 Conflict",
      "enabled":1,
      "custom":0,
      "active":1
    },
    {
      "typeCd":2,
      "description":"Managed Relationship",
      "enabled":1,
      "custom":0,
      "active":1
    },
    {
      "typeCd":3,
      "description":"Potential Relationship",
      "enabled":1,
      "custom":1,
      "active":1
    }
  ],
  "disclosureTypes":[
    {
      "typeCd":1,
      "description":"Manual Disclosure",
      "enabled":0
    },
    {
      "typeCd":2,
      "description":"Annual Disclosure",
      "enabled":1
    },
    {
      "typeCd":3,
      "description":"Project Disclosure",
      "enabled":0
    },
    {
      "typeCd":4,
      "description":"Travel Log",
      "enabled":0
    }
  ],
  "notifications":[

  ],
  "questions":{
    "screening":[
      {
        "id":1,
        "active":1,
        "questionnaireId":1,
        "parent":null,
        "question":{
          "order":2,
          "text":"From any privately held organization
, do you have stock, stock options, or other equity interest of any value?",
          "type":"Yes/No",
          "validations":[
            "required"
          ],
          "numberToShow":2
        }
      },
      {
        "id":2,
        "active":1,
        "questionnaireId":1,
        "parent":null,
        "question":{
          "order":1,
          "text":"From any for-profit organization, did you receive in the last 12 months, or do you expect
 to receive in the next 12 months, salary, director's fees, consulting payments, honoraria, royalties
; or other payments for patents, copyrights or other intellectual property; or other direct payments
 exceeding $5,000?",
          "type":"Yes/No",
          "validations":[
            "required"
          ],
          "numberToShow":1
        }
      },
      {
        "id":3,
        "active":1,
        "questionnaireId":1,
        "parent":null,
        "question":{
          "order":3,
          "text":"Some publicly traded stock must be disclosed
, but only in specific circumstances. Do you own stock, which in aggregate exceeds $5,000, in a company
 that provides funds to this institution in support of your Institutional Responsibilities (e.g. teaching
, research, committee, or other administrative responsibilities)? When aggregating, please consider stock
, stock options, warrants and other existing or contingent ownership interests in the publicly held company
. Do not consider investments where you do not directly influence investment decisions, such as mutual
 funds and retirement accounts.",
          "type":"Yes/No",
          "validations":[
            "required"
          ],
          "numberToShow":3
        }
      },
      {
        "id":4,
        "active":1,
        "questionnaireId":1,
        "parent":null,
        "question":{
          "order":4,
          "text":"From US educational institutions
, US teaching hospitals or US research institutions affiliated with US educational institutions: Did
 you receive in the last 12 months, or do you expect to receive in the next 12 months, payments for services
, which in aggregate exceed $5,000 (e.g. payments for consulting, board positions, patents, copyrights
 or other intellectual property)? Exclude payments for scholarly or academic works (i.e. peer-reviewed
 (vs. editorial reviewed) articles or books based on original research or experimentation, published
 by an academic association or a university/academic press).",
          "type":"Yes/No",
          "validations":[
            "required"
          ],
          "numberToShow":4
        }
      },
      {
        "id":5,
        "active":1,
        "questionnaireId":1,
        "parent":2,
        "question":{
          "order":1,
          "text":"If
 Yes, did the organization send you on vacation?",
          "type":"Text area",
          "displayCriteria":"Yes",
          "numberToShow":"1-A"
        }
      }
    ],
    "entities":[
      {
        "id":6,
        "active":1,
        "questionnaireId":2,
        "parent":null,
        "question":{
          "order":1,
          "text":"Type:",
          "type":"Multiselect",
          "validations":[
            "required"
          ],
          "numberToShow":1,
          "options":[
            "State Government",
            "County Government",
            "Small Business"
          ],
          "requiredNumSelections":1
        }
      },
      {
        "id":7,
        "active":1,
        "questionnaireId":2,
        "parent":null,
        "question":{
          "order":2,
          "text":"Is this entity public?",
          "type":"Yes/No",
          "validations":[
            "required"
          ],
          "numberToShow":2
        }
      },
      {
        "id":8,
        "active":1,
        "questionnaireId":2,
        "parent":null,
        "question":{
          "order":3,
          "text":"Does this entity sponsor any of your research?",
          "type":"Yes/No",
          "validations":[
            "required"
          ],
          "numberToShow":3
        }
      },
      {
        "id":9,
        "active":1,
        "questionnaireId":2,
        "parent":null,
        "question":{
          "order":4,
          "text":"Describe the entity's area of business and your relationship to it:",
          "type":"Text area",
          "validations":[
            "required"
          ],
          "numberToShow":4
        }
      }
    ]
  },
  "disclosureStatus":[
    {
      "statusCd":1,
      "description":"In Progress"
    },
    {
      "statusCd":2,
      "description":"Submitted for Approval"
    },
    {
      "statusCd":3,
      "description":"Up to Date"
    },
    {
      "statusCd":4,
      "description":"Updates Required"
    },
    {
      "statusCd":5,
      "description":"Expired"
    },
    {
      "statusCd":6,
      "description":"Resubmitted"
    }
  ],
  "projectTypes":[
    {
      "typeCd":1,
      "description":"Proposal"
    },
    {
      "typeCd":2,
      "description":"Institutional Proposal"
    },
    {
      "typeCd":3,
      "description":"IRB Protocol"
    },
    {
      "typeCd":4,
      "description":"IACUC Protocol"
    },
    {
      "typeCd":5,
      "description":"Award"
    }
  ],
  "general":{
    "peopleEnabled":true,
    "sponsorLookup":true,
    "dueDate":"2015-02-01T06:00:00.000Z",
    "isRollingDueDate":false,
    "instructions":{
      "Questionnaire":"Questionnaire Instructions",
      "Financial Entities":"Financial Entities Instructions",
      "Project Declaration":"Project Declaration Instructions",
      "Certification":"Certification Instructions"
    },
    "certificationOptions":{
      "text":"Certification Text",
      "required":true
    }
  }
}

DRAFT - Research - COI Projects

DRAFT: This section addresses API routes that deal with COI Projects.

Project

Get Projects
GET/api/coi/projects

Requires valid API key with role of admin or user. For the logged in user, gets all projects which require disclosure.

Example URI

GET /api/coi/projects
Request
HideShow
Headers
Authorization: Bearer {authToken}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
[
  {
    "id": 1,
    "sourceIdentifier": "80",
    "name": "This is the project title",
    "typeCd": 3,
    "roleCd": "COI",
    "roleDescription": "Co-Investigator",
    "statusCd": "100",
    "new": 1,
    "projectType": "IRB Protocol",
    "sponsors": [
      {
        "projectId": 1,
        "sponsorCode": "000340",
        "sponsorName": "NIH"
      }
    ]
  }
]

Create/Update Project
POST/api/coi/projects

Requires valid API key with role of admin or user. Creates or updates a project from an external system.

Example URI

POST /api/coi/projects
Request
HideShow
Headers
Authorization: Bearer {authToken}
Content-Type: application/json
Body
{
  "title": "This is the project title",
  "typeCode": 3,
  "sourceSystem": "KC-IRB",
  "sourceIdentifier": "80",
  "sourceStatus": "100",
  "persons": [
    {
      "sourceSystem": "KC-IRB",
      "sourceIdentifier": "80",
      "personId": "10000000121",
      "sourcePersonType": "EMPLOYEE",
      "roleCode": "COI"
    }
  ],
  "sponsors": [
    {
      "sourceSystem": "KC-IRB",
      "sourceIdentifier": "80",
      "sponsorCode": "000340",
      "sponsorName": "NIH"
    }
  ],
  "startDate": "2016-08-31",
  "endDate": "2019-08-31"
}
Response  200
HideShow
Body
If a new project was posted, the project JSON will be returned.
If an update to an existing project was pushed, the string "OK" will be returned.

Project Persons

Get project persons
GET/api/coi/project-persons

Returns information about a project in relation to a specific person.

  • Paramaters
    • filter: {"operation":"And", "name":"Optional Filter Name", "rules":[{"field":"title", "operator":"contains", "type":"TEXT", "value":"Hello"}, {"field":"persons.name", "operator":"contains", "type":"TEXT", "value":"Sal"}], "columns": ["title", "active", "persons"]} (object, optional) = An object that filters the selected project persons returned. Additional options can be found in the Filter configuration tool in the Manage Projects page. This example requires “Hello” in the title and “Sal” in the person’s name.
    • sort: {"projectDisclosureStatus":-1} (object, optional) = A key and direction (as integer) for sorting
    • limit: 20 (integer, optional) = How many items to return per page
    • offset: 0 (integer, optional) = Starging page
    • tz: America/New_York (string, optional) = Time zone for time interpretations

Example URI

GET /api/coi/project-persons
Request
HideShow
Headers
Content-Type: application/json; charset=utf-8
Authorization: Bearer {authToken}
Response  200
HideShow
Headers
Content-Type: application/json; charset=utf-8
Body
{
    "meta": {
        "canLoadMore": false,
        "totalCount": 1
    },
    "results": [
        {
            "_id": "af2caf72d6d1a28ecc3a2ea5",
            "active": true,
            "awardTypeCode": null,
            "awardTypeDescription": "An Award Type",
            "createdOn": "2018-08-06T19:52:18.034Z",
            "deactivationReason": "",
            "disclosure": {
                "_id": "5a36baaf5e2bad7a71085a49",
                "additionalReviewers": [],
                "dispositionTypeCd": "2",
                "projectDisposition": {
                    "_id": "5a3ae7c2aa9534010a5d3099",
                    "dispositionId": "2", // "Project Disposition" in monolith (integer conversion)
                    "dispositionSetAt": "2018-08-17T20:25:38.034Z",
                    "dispositionSetBy": {
                        "active": true,
                        "approved": true,
                        "apps": {
                            "appBuilder": null,
                            "catalog": null,
                            "cm": false,
                            "coi": true,
                            "financials": null,
                            "groups": true,
                            "protocols": true,
                            "ready": null,
                            "research": true,
                            "users": true,
                            "workflow": true
                        },
                        "coiRole": "admin",
                        "createdAt": 1445068617000,
                        "displayName": "Lastname, Firstname",
                        "email": "flastname@example.com",
                        "firstName": "Firstname",
                        "groupId": "584ac4a57f1ab60001a73ca9",
                        "groupRoles": [],
                        "id": "1264264901174757473",
                        "lastName": "Lastname",
                        "mongoId": "56d8afa0a1456aaaf9ae46d9",
                        "name": "Lastname, Firstname",
                        "newId": "56a89fa0414567aaa94a46a9",
                        "phone": "321-555-1197",
                        "primaryDepartmentCode": "000001",
                        "products": [],
                        "role": "admin",
                        "schoolId": "10000000001",
                        "scopesCm": null,
                        "ssoId": null,
                        "ssoProps": null,
                        "systemNotifications": "all",
                        "updatedAt": 1592327365638,
                        "updatedBy": {
                            "id": "1264264901174757473",
                            "impersonatedBy": null
                        },
                        "username": "myusername"
                    },
                    "sourceIdentifier": "A7r31alJ9",
                    "sourceSystem": "5da66bcad49849914627a541"
                },
                "status": 3 // "Annual Disclosure Status" in monolith (integer conversion)
            },
            "endDate": "Thu Aug 06 2020 00:00:00 GMT-0400 (Eastern Daylight Time)",
            "linkedProjects": null,
            "manuallyCreated": true,
            "noticeOfOpportunity": {
                "code": null,
                "description": null
            },
            "persons": {
                "_id": "5a2a5f720550628a8b76a909",
                "active": true,
                "disclosure": {
                    "additionalReviewers": [],
                    "dispositionTypeCd": null,
                    "projectDisposition": {},
                    "status": 1
                },
                "isProjectRequired": true,
                "isUpdateRequired": true,
                "name": "Lastname, Firstname",
                "new": false,
                "notified": true,
                "personId": "10000000001",
                "roleCode": "PI",
                "sourcePersonType": "EMPLOYEE"
            },
            "pi": "Lastname, Firstname",
            "primeSponsor": {
                "hierarchies": null,
                "sponsorCode": null,
                "sponsorName": null,
                "sponsorTypeCode": null,
                "sponsorTypeDescription": null
            },
            "projectDisclosureStatus": "Update Needed", // "Project Status" in monolith
            "projectPersons": [
                {
                    "_id": "5a2c5f720550628a8b76b909",
                    "active": true,
                    "disclosure": {
                        "additionalReviewers": [],
                        "dispositionTypeCd": null,
                        "projectDisposition": {},
                        "status": 1
                    },
                    "isProjectRequired": true,
                    "isUpdateRequired": true,
                    "name": "Lastname, Firstname",
                    "new": false,
                    "notified": true,
                    "personId": "10000000001",
                    "roleCode": "PI",
                    "sourcePersonType": "EMPLOYEE"
                }
            ],
            "projectType": "9510 Override",
            "projectTypeDescription": "9510 Override",
            "reporterAdded": false,
            "shortUrl": null,
            "sourceIdentifier": "L7r31dlJ2",
            "sourceStatus": "5da66bdf66223a001eaa7059",
            "sourceStatusDescription": "Active",
            "sourceSystem": "5da66bcbda984991a627e5a9",
            "sponsorCode": "002005",
            "sponsorHierarchies": [
                "KCOI 700U",
                "KCOI 9510",
                "COI Disclosures",
                "Printing",
                "Routing",
                "Sponsor Groups",
                "Administering Activity",
                "COI Disclosures",
                "Printing",
                "NIH Multiple PI",
                "NIH Other Significant Contributor",
                "KCOI PHS",
                "Routing",
                "Sponsor Groups",
                "Administering Activity"
            ],
            "sponsorName": "A Sponsor Name",
            "sponsorProjectId": null,
            "sponsorTypeCode": null,
            "sponsorTypeDescription": null,
            "sponsors": [
                {
                    "_id": "5f2a5faca550628fab76aa19",
                    "hierarchies": [
                        "KCOI 700U"
                    ],
                    "sourceIdentifier": "A7r31alJ9",
                    "sourceSystem": "5da66bcad49849914627a549",
                    "sponsorCode": "002005",
                    "sponsorName": "A Sponsor Name"
                },
                {
                    "_id": "5f2c5fac0550628f8b76a916",
                    "hierarchies": [
                        "KCOI 9510",
                        "COI Disclosures",
                        "Printing",
                        "Routing",
                        "Sponsor Groups",
                        "Administering Activity"
                    ],
                    "sourceIdentifier": "A7r31alJ9",
                    "sourceSystem": "5da66bcad49849914627a549",
                    "sponsorCode": "000500",
                    "sponsorName": "Another Sponsor"
                },
                {
                    "_id": "5f2c5fac0550628f8b76a915",
                    "hierarchies": [
                        "COI Disclosures",
                        "Printing",
                        "NIH Multiple PI",
                        "NIH Other Significant Contributor",
                        "KCOI PHS",
                        "Routing",
                        "Sponsor Groups",
                        "Administering Activity"
                    ],
                    "sourceIdentifier": "A7r31alJ9",
                    "sourceSystem": "5da66bcad49849914627a549",
                    "sponsorCode": "000340",
                    "sponsorName": "Third Sponsor"
                }
            ],
            "startDate": "Thu Aug 06 2020 00:00:00 GMT-0400 (Eastern Daylight Time)",
            "status": "Active",
            "supersededBy": null,
            "title": "A Project Title",
            "typeCode": "5da66bcad49849914627a549"
        }
    ]
}

DRAFT - Research - COI Files

DRAFT: This section addresses API routes that deal with COI Files.

File

Get File
GET/api/coi/files/:id

Requires valid API key. Users can only view their own files, admins can view any file.

  • Paramaters
    • id: 1 (number, required) = The id of the file being deleted

Example URI

GET /api/coi/files/:id
Request
HideShow
Headers
Authorization: Bearer {authToken}
Response  200
HideShow
Body
Data

Delete File
DELETE/api/coi/files/:id

Requires valid API key. Users can only delete their own files

  • Paramaters
    • id: 1 (number, required) = The id of the file being deleted

Example URI

DELETE /api/coi/files/:id
Request
HideShow
Headers
Authorization: Bearer {authToken}
Response  200

Files

Create File
POST/api/coi/files

Requires valid API key. Users can only revise questions which are associated with their disclosures

Example URI

POST /api/coi/files
Request
HideShow
Headers
Authorization: Bearer {authToken}
Content-Type: multipart/form-data; boundary=---------------------------34625135819133741831659763503
Body
-----------------------------34625135819133741831659763503
Content-Disposition: form-data; name="attachments"; filename="test.pdf"
Content-Type: "\"application/pdf\""

Data

-----------------------------34625135819133741831659763503
Content-Disposition: form-data; name="data"

{"refId":1502,"type":"financialEntity","disclosureId":503}
-----------------------------34625135819133741831659763503--
Response  200
HideShow
Headers
Content-Type: application/json; charset=utf-8
Body
[
  {
    "file_type": "financialEntity",
    "ref_id": 1502,
    "type": "\"application/pdf\"",
    "key": "c5d71716632dbdd9985a77c7c7369685",
    "name": "test.pdf",
    "user_id": "10000000007",
    "uploaded_by": "Blood, Opal",
    "upload_date": "2015-10-29T14:05:05.791Z",
    "id": 5
  }
]

DRAFT - Research - COI PIs

DRAFT: This section addresses API routes that deal with COI PIs.

PI Response

Create PI Response
POST/api/coi/pi-response/:reviewId

Requires valid API key. Users can only respond to comments associated with there disclosures.

  • Paramaters
    • reviewId: 1 (number, required) = The id of the pi review being updated.

Example URI

POST /api/coi/pi-response/:reviewId
Request
HideShow
Headers
Authorization: Bearer {authToken}
Body
{
  "comment": "fdsf"
}
Response  200

PI Revise

Update Question
PUT/api/coi/pi-revise/:reviewId

Requires valid API key. Users can only revise questions which are associated with their disclosures

  • Paramaters
    • reviewId: 1 (number, required) = The id of the pi review being updated

Example URI

PUT /api/coi/pi-revise/:reviewId
Request
HideShow
Headers
Authorization: Bearer {authToken}
Content-Type: application/json;charset=UTF-8
Body
{
  "answer": "Yes"
}
Response  200
HideShow
Headers
Content-Type: application/json; charset=utf-8
Body
[
  true,
  1
]

PI Revise Entity Question

Update Entity Question
PUT/api/coi/pi-revise/:reviewId/entity-question/:questionId

Requires valid API key. Users can only revise entity-questions which are associated with their disclosures

  • Paramaters
    • reviewId: 1 (number, required) = The id of the pi review being updated
    • questionId: 1 (number, required) = The id of the entity question being updated

Example URI

PUT /api/coi/pi-revise/:reviewId/entity-question/:questionId
Request
HideShow
Headers
Authorization: Bearer {authToken}
Content-Type: application/json;charset=UTF-8
Body
{
  "comment": "fsdf"
}
Response  200
HideShow
Headers
Content-Type: application/json; charset=utf-8
Body
[
  true,
  1
]

PI Revise Entity

Create Entity Relationship
POST/api/coi/pi-revise/:reviewId/entity-relationship

Requires valid API key. Can only add relationships for entities which are associated with their disclosures

  • Paramaters
    • reviewId: 1 (number, required) = The id of the pi review being updated

Example URI

POST /api/coi/pi-revise/:reviewId/entity-relationship
Request
HideShow
Headers
Authorization: Bearer {authToken}
Content-Type: application/json;charset=UTF-8
Body
{
  "personCd": 1,
  "relationshipCd": 1,
  "typeCd": 5,
  "amountCd": 6,
  "comments": "sdf",
  "travel": {}
}
Response  200
HideShow
Headers
Content-Type: application/json; charset=utf-8
Body
[
  {
    "id": 1503,
    "comments": "I created some batteries for them",
    "relationshipCd": 4,
    "personCd": 2,
    "typeCd": 8,
    "amountCd": 18,
    "finEntityId": 1502
  },
  {
    "id": 1504,
    "comments": "sdf",
    "relationshipCd": 1,
    "personCd": 1,
    "typeCd": 5,
    "amountCd": 6,
    "finEntityId": 1502
  }
]

Entity Relationship

Delete Entity Relationship
DELETE/api/coi/pi-revise/:reviewId/entity-relationship/:relationshipId

Requires valid API key. Can only delete relationships for entities which are associated with their disclosures

  • Paramaters
    • reviewId: 1 (number, required) = The id of the pi review being updated
    • relationshipId: 1 (number, required) = The id of the relationship to delete

Example URI

DELETE /api/coi/pi-revise/:reviewId/entity-relationship/:relationshipId
Request
HideShow
Headers
Authorization: Bearer {authToken}
Response  200

Revise Declaration

Update Declaration
PUT/api/coi/pi-revise/:reviewId/declaration

Requires valid API key. Can only update declarations associated with their disclosures

  • Paramaters
    • reviewId: 1 (number, required) = The id of the pi review being updated

Example URI

PUT /api/coi/pi-revise/:reviewId/declaration
Request
HideShow
Headers
Authorization: Bearer {authToken}
Content-Type: application/json;charset=UTF-8
Body
{
  "disposition": "3",
  "comment": ""
}
Response  200

Revise Sub Question

Update Sub Question
PUT/api/coi/pi-revise/:reviewId/subquestion-answer/:subQuestionId

Requires valid API key. Can only update sub questions associated with their disclosures

  • Paramaters
    • reviewId: 1 (number, required) = The id of the pi review being updated
    • subQuestionId: 1 (number, required) = The id of the question being updated

Example URI

PUT /api/coi/pi-revise/:reviewId/subquestion-answer/:subQuestionId
Request
HideShow
Headers
Authorization: Bearer {authToken}
Content-Type: application/json;charset=UTF-8
Body
{
  "answer": {
    "value": "fdsfdsf"
  }
}
Response  200
HideShow
Headers
Content-Type: application/json; charset=utf-8
Body
[
  true,
  1
]

Delete Sub Question

Delete Sub Question
DELETE/api/coi/pi-revise/:reviewId/question-answers

Requires valid API key. Can only delete sub questions associated with their disclosures

  • Paramaters
    • reviewId: 1 (number, required) = The id of the pi review being updated

Example URI

DELETE /api/coi/pi-revise/:reviewId/question-answers
Request
HideShow
Headers
Authorization: Bearer {authToken}
Response  200

DRAFT - Research - Awards

DRAFT:

Awards

Kuali Research Awards providing Post Award management

Awards Summary
GET/award/api/v1/awards?summary

Summary of Awards

Example URI

GET /award/api/v1/awards?summary
URI Parameters
HideShow
summary
boolean (required) 

Renders the awards in a summary view instead of the full data from the award. Currently the only option and required.

updatedSince
date (optional) Example: 1446630596000

Criteria to restrict the awards returned to those updated since the date specified. Formatted as milliseconds since epoch.

limit
number (optional) Example: 50

Number of results to return. If not included, all awards matching the date, if specified, are returned.

page
number (optional) Example: 8

If a limit is specified this determines what page of the result set will be returned on this request.

Request
HideShow
Headers
Authorization: Bearer {api-key}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
{
   "count" : 1,
   "awards" : [
       {
         "title" : "LOC - by award",
         "sponsorAwardNumber" : null,
         "fundingProposals" : [
            {
               "awardSequenceNumber" : 1,
               "awardNumber" : "999901-00001",
               "proposalNumber" : "80070",
               "proposalSequenceNumber" : 1
            }
         ],
         "modificationNumber" : null,
         "activityType" : {
            "code" : "3",
            "description" : "Public Service"
         },
         "accountNumber" : "0211401",
         "awardId" : 2238,
         "awardNumber" : "999901-00001",
         "sponsor" : {
            "sponsorCode" : "055125",
            "sponsorName" : "Kuali LOC Testing3",
            "acronym" : null
         },
         "cfdaNumber" : "00.000",
         "awardStatus" : {
            "code" : "1",
            "description" : "Active"
         },
         "principalInvestigator" : {
            "emailAddress" : "kcnotification@gmail.com",
            "personId" : "10000000002",
            "roleCode" : "PI",
            "projectRole" : "Principal Investigator",
            "fullName" : "Joe  Tester",
            "userName" : "jtester"
         },
         "sequenceNumber" : 1
      },
   ],
   "totalFound" : 112
}

Award Accounts

List All Accounts
GET/award/api/v1/accounts

Get all accounts that are available for use

Example URI

GET /award/api/v1/accounts
URI Parameters
HideShow
startIndex
number (optional) Example: 0

Starting index of the results to be returned. If not included, all available accounts are returned.

size
number (optional) Example: 5

Size of the results to be returned. If not included, all available accounts are returned.

Request
HideShow
Headers
Authorization: Basic
Content-Type: application/json
Response  200
HideShow
Headers
Content-Type: application/json;
Body
{
  "totalFound": 2,
  "count": 2,
  "accounts": [
    {
      "id": 8,
      "accountNumber": "123456455",
      "createdByAwardId": 2670,
      "status": "CLOSED",
      "budgeted": 6.69,
      "pending": 7.7,
      "income": 9.9,
      "expense": 8.8,
      "available": 5.5
    },
    {
      "id": 9,
      "accountNumber": "55555",
      "createdByAwardId": 2742,
      "status": "CLOSED",
      "budgeted": 6.69,
      "pending": 7.7,
      "income": 999.99,
      "expense": 8.8,
      "available": 5.5
    }
  ],
  "awards": []
}

Get Account
GET/award/api/v1/accounts/55555

Get information on a particular account

Example URI

GET /award/api/v1/accounts/55555
URI Parameters
HideShow
showAwards
boolean (optional) Example: true

Flag to indicate if award ids linked to account should be returned.

Request
HideShow
Headers
Authorization: Basic
Content-Type: application/json
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
{
  "totalFound": 1,
  "count": 1,
  "accounts": [
    {
      "id": 9,
      "accountNumber": "55555",
      "createdByAwardId": 2742,
      "status": "CLOSED",
      "budgeted": 6.69,
      "pending": 7.7,
      "income": 999.99,
      "expense": 8.8,
      "available": 5.5
    }
  ],
  "awards": [
    2742,
    2778
  ]
}

Get Award Details by Account
GET/award/api/v1/accounts/awards/2742

Get award details required to create an account using award id

Example URI

GET /award/api/v1/accounts/awards/2742
Request
HideShow
Headers
Authorization: Basic
Content-Type: application/json
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
{
  "totalFound": 1,
  "count": 1,
  "accounts": [
    {
      "accountName": "NIH-McGregorGeoff",
      "accountNumber": "55555",
      "adminContactAddressCityName": null,
      "adminContactAddressStateCode": null,
      "adminContactAddressStreetAddress": null,
      "adminContactAddressZipCode": null,
      "cfdaNumber": null,
      "defaultAddressCityName": "Coeus",
      "defaultAddressStateCode": "MA",
      "defaultAddressStreetAddress": "1118 Kuali Drive",
      "defaultAddressZipCode": "53421",
      "effectiveDate": "2015-08-01",
      "expenseGuidelineText": "000022-00001",
      "expirationDate": "2015-08-31",
      "higherEdFunctionCode": "IPR",
      "incomeGuidelineText": "Cost reimbursement Established ACH mechanism for sponsor",
      "indirectCostRate": "",
      "indirectCostTypeCode": "",
      "offCampusIndicator": false,
      "principalId": "10000000001",
      "purposeText": "test",
      "unit": "000001"
    }
  ]
}

Update Account
PUT/award/api/v1/accounts/878787

Set various fields on an account. Fields not provided will not be updated.

Example URI

PUT /award/api/v1/accounts/878787
Request
HideShow
Headers
Authorization: Basic
Content-Type: application/json
Body
{
  "available": 1,
  "budgeted": 1,
  "pending": 1,
  "expense": 1,
  "income": 1,
  "status": "Hello, world!"
}
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "available": {
      "type": "number",
      "description": "available amount (max integral digits = 12, max fractional digits = 2)"
    },
    "budgeted": {
      "type": "number",
      "description": "budgeted amount (max integral digits = 12, max fractional digits = 2)"
    },
    "pending": {
      "type": "number",
      "description": "pending amount (max integral digits = 12, max fractional digits = 2)"
    },
    "expense": {
      "type": "number",
      "description": "expense amount (max integral digits = 12, max fractional digits = 2)"
    },
    "income": {
      "type": "number",
      "description": "income amount (max integral digits = 12, max fractional digits = 2)"
    },
    "status": {
      "type": "string",
      "description": "status (min size = 1, max size = 15], pattern [a-zA-Z]+)"
    }
  }
}
Response  200
HideShow
Headers
Content-Length: 0

DRAFT - Research - Common

DRAFT:

Organizations

Organization Summary
GET/research-common/api/v1/organizations?summary

Summary of all Organizations in the system

Example URI

GET /research-common/api/v1/organizations?summary
URI Parameters
HideShow
summary
boolean (required) 

Renders the organizations in a summary view instead of the full data from the organization. Currently the only option and required.

Request
HideShow
Headers
Authorization: Bearer {api-key}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
{
  "count": 1,
  "totalFound": 1,
  "organizations": [
    {
      "organizationName": "University",
      "address": "1375 N Scottsdale Rd, Suite 480, Scottsdale, AZ 85257-3454",
      "organizationId": "000001",
      "contact": {
        "middleName": null,
        "county": "Maricopa",
        "emailAddress": "sean.warren@rsmart.com",
        "active": true,
        "city": "Scottsdale",
        "suffix": null,
        "postalCode": "85257-3454",
        "lastName": "Warren",
        "addressLine3": null,
        "addressLine2": "Suite 480",
        "state": "AZ",
        "firstName": "Sean",
        "sponsor": null,
        "prefix": null,
        "rolodexId": 100013,
        "phoneNumber": "480-414-0450",
        "countryCode": "USA",
        "addressLine1": "1375 N Scottsdale Rd, Scottsdale, AZ 85257-3454",
        "title": "OSP Approver",
        "faxNumber": "602-391-2172"
      }
    }
  ]
}

Units

List All Units
GET/research-common/api/v1/units

Example URI

GET /research-common/api/v1/units
Request
HideShow
Headers
Authorization: Bearer {api-key}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
[
  {
    "unitNumber": "000001",
    "unitName": "University",
    "parentUnitNumber": null,
    "organizationId": "000001"
  },
  {
    "unitNumber": "BL-BL",
    "unitName": "BLOOMINGTON CAMPUS",
    "parentUnitNumber": "IU-UNIV",
    "organizationId": "000001"
  }
]

Activity Types

List All Activity Types
GET/research-common/api/v1/activity-types

Example URI

GET /research-common/api/v1/activity-types
Request
HideShow
Headers
Authorization: Bearer {api-key}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
[
  {
    "description": "Research",
    "code": "1"
  },
  {
    "description": "Instruction",
    "code": "2"
  }
]

Rate Class Types

List All Rate Class Types
GET/research-common/api/v1/rate-class-types

Example URI

GET /research-common/api/v1/rate-class-types
Request
HideShow
Headers
Authorization: Bearer {api-key}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
[
  {
    "code": "E",
    "sortId": 2,
    "description": "Fringe Benefits",
    "prefixActivityType": false
  },
  {
    "code": "I",
    "sortId": 3,
    "description": "Inflation",
    "prefixActivityType": false
  }
]

Rate Classes

List All Rate Classes
GET/research-common/api/v1/rate-classes

Example URI

GET /research-common/api/v1/rate-classes
Request
HideShow
Headers
Authorization: Bearer {api-key}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
[
  {
    "description": "MTDC",
    "rateClassTypeCode": "O",
    "code": "1"
  },
  {
    "description": "Lab Allocation - Salaries",
    "rateClassTypeCode": "Y",
    "code": "10"
  }
]

Rate Types

List All Rate Types
GET/research-common/api/v1/rate-types

Example URI

GET /research-common/api/v1/rate-types
Request
HideShow
Headers
Authorization: Bearer {api-key}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
[
  {
    "description": "MTDC",
    "rateClassCode": "1",
    "rateTypeCode": "1"
  },
  {
    "description": "Lab Allocation - Salaries",
    "rateClassCode": "10",
    "rateTypeCode": "1"
  }
]

Institute Rates

List All Institute Rates
GET/research-common/api/v1/institute-rates

Example URI

GET /research-common/api/v1/institute-rates
Request
HideShow
Headers
Authorization: Bearer {api-key}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
[
  {
    "unitNumber": "000001",
    "rateTypeCode": "1",
    "rateClassCode": "1",
    "startDate": "1995-07-01",
    "onOffCampusFlag": false,
    "fiscalYear": "1996",
    "instituteRate": 9,
    "activityTypeCode": "1"
  },
  {
    "unitNumber": "000001",
    "rateTypeCode": "1",
    "rateClassCode": "1",
    "startDate": "1995-07-01",
    "onOffCampusFlag": true,
    "fiscalYear": "1996",
    "instituteRate": 54.5,
    "activityTypeCode": "1"
  }
]

Update Rates
PUT/research-common/api/v1/institute-rates

Example URI

PUT /research-common/api/v1/institute-rates
Request
HideShow
Headers
Authorization: Bearer {api-key}
Body
[
  {
    "unitNumber": "000001",
    "rateTypeCode": "1",
    "rateClassCode": "1",
    "startDate": "1995-07-01",
    "onOffCampusFlag": false,
    "fiscalYear": "1996",
    "instituteRate": 9,
    "activityTypeCode": "1"
  },
  {
    "unitNumber": "000001",
    "rateTypeCode": "1",
    "rateClassCode": "1",
    "startDate": "1995-07-01",
    "onOffCampusFlag": true,
    "fiscalYear": "1996",
    "instituteRate": 54.5,
    "activityTypeCode": "1"
  }
]
Response  200

DRAFT - Research - Institutional Proposals

DRAFT: This section addresses API routes that deal with COI Configurations.

Institutional Proposal

Proposal Summary
GET/instprop/v1/institutional-proposals?summary

Summary of all Institutional Proposals in the system

Example URI

GET /instprop/v1/institutional-proposals?summary
URI Parameters
HideShow
summary
boolean (required) 

Renders the proposals in a summary view instead of the full data from the proposal. Currently the only option and required.

updatedSince
date (optional) Example: 1446630596000

Criteria to restrict the proposals returned to those updated since the date specified. Formatted as milliseconds since epoch.

limit
number (optional) Example: 50

Number of results to return. If not included, all proposals matching the date,if specified, are returned.

page
number (optional) Example: 8

If a numberPerPage is specified this determines what page of the result set will be returned on this request.

Request
HideShow
Headers
Authorization: Bearer {api-key}
Response  200
HideShow
Headers
Content-Type: application/json;charset=UTF-8
Body
{
   "totalFound" : 598,
   "count" : 1,
   "institutionalProposals" : [
      {
         "fundingProposals" : [
            {
               "proposalSequenceNumber" : 1,
               "awardNumber" : "999901-00001",
               "awardSequenceNumber" : 1,
               "proposalNumber" : "80070"
            },
            {
               "awardNumber" : "999901-00002",
               "proposalSequenceNumber" : 1,
               "awardSequenceNumber" : 1,
               "proposalNumber" : "80070"
            },
            {
               "proposalNumber" : "80070",
               "awardSequenceNumber" : 1,
               "proposalSequenceNumber" : 1,
               "awardNumber" : "999901-00003"
            }
         ],
         "principalInvestigator" : {
            "fullName" : "Inez  Chew",
            "personId" : "10000000005",
            "roleCode" : "PI",
            "projectRole" : "Principal Investigator",
            "userName" : "chew",
            "emailAddress" : "kcnotification@gmail.com"
         },
         "sponsor" : {
            "sponsorCode" : "055075",
            "acronym" : null,
            "sponsorName" : "Kuali LOC Testing"
         },
         "proposalNumber" : "80070"
      },
   ]
}

DRAFT - Files

DRAFT: The Files api is in draft format. It is subject to change without notice and it is NOT currently available or supported.

Encryption

Files uploaded to the file service will be automatically securely encrypted at rest and decrypted when retrieved.

File

Retrieve a File
GET/api/v1/files/{id}

IMPORTANT: Do not store the url attribute. It will likely be transient for security purposes. When retrieving a file, request the file attributes to get the most current url for the file.

Example URI

GET /api/v1/files/id
URI Parameters
HideShow
id
number (required) 

ID of the file in the form of a big integer

Request
HideShow
Headers
Authorization: Bearer {api-key}
Response  200
HideShow
Headers
Content-Type: application/json; charset=utf-8
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Always returned as a string"
    },
    "name": {
      "type": "string",
      "description": "Friendly name for the file, defaults to original file name"
    },
    "createdAt": {
      "type": "number"
    },
    "updatedAt": {
      "type": "number"
    },
    "size": {
      "type": "number"
    },
    "type": {
      "type": "string"
    },
    "url": {
      "type": "string",
      "description": "Url where file can be retrieved"
    }
  }
}

Delete a File
DELETE/api/v1/files/{id}

Example URI

DELETE /api/v1/files/id
URI Parameters
HideShow
id
number (required) 

ID of the file in the form of a big integer

Request
HideShow
Headers
Authorization: Bearer {api-key}
Response  204

Files

Upload a File
POST/api/v1/files

To upload a file, you’ll need to send a multipart/related request.

POST /files HTTP/1.1
Host: subdomain.kuali.co
Authorization: Bearer {api-key}
Content-Type: multipart/related; boundary="foo_bar_baz"
Content-Length: number_of_bytes_in_entire_request_body

--foo_bar_baz
Content-Type: application/json; charset=UTF-8

{
  "name": "My File"
}

--foo_bar_baz
Content-Type: image/docx

DOCX data
--foo_bar_baz--

Example URI

POST /api/v1/files
Response  201
HideShow
Headers
Content-Type: application/json; charset=utf-8
Location: /files/1226359532452324229
Schema
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Always returned as a string"
    },
    "name": {
      "type": "string",
      "description": "Friendly name for the file, defaults to original file name"
    },
    "createdAt": {
      "type": "number"
    },
    "updatedAt": {
      "type": "number"
    },
    "size": {
      "type": "number"
    },
    "type": {
      "type": "string"
    },
    "url": {
      "type": "string",
      "description": "Url where file can be retrieved"
    }
  }
}

DEPRECATED - Institution

DEPRECATED: The Institution api is now deprecated and should no longer be used. The Settings api should be used in its place.

Institution

Get Institution
GET/api/v1/institution

Requires valid API key with role of user or admin.

Example URI

GET /api/v1/institution
Request
HideShow
Headers
Content-Type: application/json
Authorization: Bearer {api-key}
Response  200
HideShow
Headers
Content-Type: application/json; charset=utf-8
Body
{
  "id": "1206493138879318188",
  "subdomain": "kuali",
  "provider": "kuali",
  "createdAt": 1259218800,
  "updatedAt": 1259218800,
  "name": "Kuali University",
  "featureFlagsCm": null,
  "idp": "",
  "eppn": "",
  "signInExpiresWithSession": "true",
  "signInExpiresIn": 12000,
  "timezone": "America/Denver"
}

Update Institution
PUT/api/v1/institution

Requires valid API key with admin role.

Example URI

PUT /api/v1/institution
Request
HideShow
Headers
Content-Type: application/json
Authorization: Bearer {api-key}
Body
{
  "subdomain": "kuali",
  "provider": "kuali",
  "createdAt": 1259218800,
  "updatedAt": 1259218800,
  "name": "Kuali University",
  "featureFlagsCm": null,
  "idp": "",
  "eppn": "",
  "signInExpiresWithSession": "true",
  "signInExpiresIn": 12000,
  "timezone": "America/Los_Angeles"
}
Response  200
HideShow
Headers
Content-Type: application/json; charset=utf-8
Body
{
    "id": "1206493138879318188",
    "subdomain": "kuali",
    "provider": "kuali",
    "createdAt": 1259218800,
    "updatedAt": 1259218800,
    "name": "Kuali University",
    "featureFlagsCm": null,
    "idp": "",
    "eppn": "",
    "signInExpiresWithSession": "true",
    "signInExpiresIn": 12000,
    "timezone: "America/Los_Angeles"
}

Generated by aglio on 02 Sep 2020