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.
-
Open the Users application.
-
Add a new user with the role: ‘Service’.
-
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 SettingsGET/cor/settings/api/v1/settings
Requires valid API key with role of user or admin.
Example URI
Headers
Content-Type: application/json
Authorization: Bearer {api-key}
200
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 SettingsPUT/cor/settings/api/v1/settings
Requires valid API key with admin role.
Example URI
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"
}
200
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 UserGET/api/v1/users/{id}
Requires valid API key with role of user or admin.
Example URI
- id
number
(required)ID of the User in the form of a big integer
Headers
Content-Type: application/json
Authorization: Bearer {api-key}
200
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 UserPUT/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
- id
number
(required)ID of the User in the form of a big integer
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
}
200
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 UserDELETE/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
- id
number
(required)ID of the User in the form of a big integer
Headers
Content-Type: application/json
Authorization: Bearer {api-key}
204
Current User ¶
Get Current UserGET/api/v1/users/current
Example URI
Headers
Content-Type: application/json
Authorization: Bearer {api-key}
200
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 UsersGET/api/v1/users{?q,sort,limit,skip,attribute,fields,includeInactive}
Requires valid API key with role of user or admin.
Example URI
- 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 equalsExamples
?created=gt(1490645684620)
?updated=gte(1490645684620)
- lt
string
(optional)Return documents where the specified field is less than a value. Add
e
to include equalsExamples
?created=lt(1490645684620)
?updated=lte(1490645684620)
- includeInactive
boolean
(optional)Return users that are both active and inactive
Examples
?includeInactive=true
Headers
Content-Type: application/json
Authorization: Bearer {authToken}
200
Headers
Content-Type: application/json
Schema
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "array"
}
Create a New UserPOST/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
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
}
201
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 GroupsGET/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
- 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)
200
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 GroupsPOST/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
Body
{
"name": "",
"parentId": null,
"categoryId": null,
"fields": [],
"roles": [],
"relationships": [],
"startDate": "2016-05-11T19:04:44.000Z"
}
200
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 GroupGET/api/v1/groups/{id}/{?date,fields}
Example URI
- id
string
(required) Example: NJEY2BvZg- fields
string
(optional)- date
date
(optional) Example: 2015-08-21T22:11:06.819Z
200
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"
}
404
Headers
Content-Type: text/plain
Body
"Group not found"
Update GroupPUT/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
- id
string
(required) Example: NJEY2BvZg
Body
{
"name": "College of Computer Science"
}
200
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"
}
404
Headers
Content-Type: text/plain
Body
"Group not found"
Delete GroupDELETE/api/v1/groups/{id}/
Requires valid API key with role of user or admin.
Calling this endpoint will delete a group.
Example URI
- id
string
(required) Example: NJEY2BvZg
204
Headers
Content-Type: application/json
404
Headers
Content-Type: text/plain
Body
"Group not found"
GET Group VersionsGET/api/v1/groups/{id}/versions
Example URI
- id
string
(required)
200
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 VersionGET/api/v1/groups/{id}/versions/{versionId}
Example URI
- id
string
(required)- versionId
string
(required)
200
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 CategoriesPOST/api/v1/categories/
Requires valid API key with role of user or admin.
Calling this endpoint will create a group.
Example URI
Body
{
"name": "",
"parentId": null,
"roleSchemas": [],
"fieldSchemas": [],
"startDate": "2016-05-11T19:07:02.000Z"
}
200
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 CategoryGET/api/v1/categories/{id}/
Example URI
- id
string
(required) Example: f6da4d4a-b490-4172-9e54-07b56ab1fc4d- fields
string
(optional)- date
string
(optional) Example: 2015-08-21T22:11:06.819Z
200
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"
}
404
Headers
Content-Type: text/plain
Body
"Category not found"
Update CategoryPUT/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
- id
string
(required) Example: f6da4d4a-b490-4172-9e54-07b56ab1fc4d
Body
{
"name": "College of Math"
}
200
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"
}
404
Headers
Content-Type: text/plain
Body
"Category not found"
Delete CategoryDELETE/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
- id
string
(required) Example: f6da4d4a-b490-4172-9e54-07b56ab1fc4d
204
Headers
Content-Type: application/json
404
Headers
Content-Type: text/plain
Body
"Category not found"
GET Category VersionsGET/api/v1/categories/{id}/versions
Example URI
- id
string
(required)
200
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 VersionGET/api/v1/categories/{id}/versions/{versionId}
Example URI
- id
string
(required)- versionId
string
(required)
200
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 JobGET/api/v1/jobs/{id}
Example URI
- id
string
(required)ID of the Job in the form of a mongo id
Headers
Content-Type: application/json
Authorization: Bearer {service-token}
200
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 JobPUT/api/v1/jobs/{id}
Example URI
- id
string
(required)ID of the Job in the form of a mongo id
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
}
200
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 JobDELETE/api/v1/jobs/{id}
Example URI
- id
string
(required)ID of the Job in the form of a mongo id
Headers
Content-Type: application/json
Authorization: Bearer {service-token}
204
Jobs ¶
List JobsGET/api/v1/jobs
Example URI
Headers
Content-Type: application/json
Authorization: Bearer {service-token}
200
Headers
Item-Count: 10
Body
[
+ Attributes (Job)
]
Create JobPOST/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
week
s.
Example URI
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
}
201
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 idGET/api/v1/jobs/results
Example URI
Headers
Content-Type: application/json
Authorization: Bearer {service-token}
200
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 manuallyPOST/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
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 Form
s over time without breaking Document
s 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 Document
s attached to that Form
version. See the Form
s documentation below for more information.
General Changes
-
Change all endpoint requests to hit
/v2/
instead of/v1/
. -
Change all
PUT
endpoints for updates to sendPATCH
requests instead. -
Field-level changes:
- The
_id
property has been renamed toid
for all resource types. FormContainer
:- The
lbl
property has been renamed tolabel
.
- The
Form
:- The
metaId
property has been renamed toformContainerId
. - The
tmpl
property has been renamed totemplate
. - The
trashed
property has been removed, as with form versioning it is no longer necessary.
- The
Document
:- Added the
formId
which references theForm
that the document was created under. - When creating a new
Document
viaPOST
, you must provide thedata
key at the top-level of the request body, for consistency with theupdate
request. Previously the whole request body was used as the data object.
- Added the
- The
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 theformId
, NOT theformContainerId
. 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 aFormContainer
(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 referencedFormContainer
. -
Added
POST /cor/forms/api/v2/form-containers/:id/forms/current/documents
for creating a new document attached to the “current”Form
of the referencedFormContainer
. -
Added
GET /cor/forms/api/v2/forms/:id/documents
for fetching all documents attached to the referencedForm
. -
Added
POST /cor/forms/api/v2/forms/:id/documents
for creating a new document attached to the referencedForm
.
FormContainers ¶
A FormContainer
resource represents an umbrella structure which owns one or more versions of a Form
schema, along with all Document
s associated through the child Form
s. The FormContainer
has a String label
property which is used for storing the human-readable name of the underlying Form
s.
In addition to the standard REST endpoints for working with the FormContainer
by listing or ID, endpoints are also provided for working with downstream Form
s and Document
s as well. See their respective documentation for those endpoints.
Get All FormContainersGET/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 FormContainer
s created or readable by you.
Example URI
200
- 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 FormContainersGET/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 FormContainer
s created or writable by you.
Example URI
200
- 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 FormContainerGET/cor/forms/api/v2/form-containers/:id
Get the FormContainer
record for the given ID, or a 404.
Example URI
- `id`
String
(required) Example: 5923e510b630f13200885baf
200
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"
}
404
Headers
Content-Type: text/plain
Body
Not Found
Create a new FormContainerPOST/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
Headers
Content-Type: application/json
Body
{
"label": "film"
}
200
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 FormContainerPATCH/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
- `id`
String
(required) Example: 5923e510b630f13200885baf
Headers
Content-Type: application/json
Body
{
"label": "Hidden Games",
"hidden": true
}
200
- 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"
}
400
- Returned when using an invalid ID.
Body
Invalid ID
404
- Returned when the object does not exist or you do not have permission to update it.
Body
Not Found
Delete a FormContainerDELETE/cor/forms/api/v2/form-containers/:id
Deletes a FormContainer
by ID.
Example URI
- `id`
String
(required) Example: 5923e510b630f13200885baf
200
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"
}
400
- Returned when using an invalid ID.
Body
Invalid ID
404
- 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 Form
s with the Formbot library is outside the scope of this document.
Get all FormContainer FormsGET/cor/forms/api/v2/form-containers/:id/forms
Get all Form
s 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
- `id`
string
(required) Example: 5923e510b630f13200885baf
200
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 FormGET/cor/forms/api/v2/forms/:id
Get a Form
by ID.
Example URI
- `id`
string
(required) Example: 5923e510b630f13200885bb4
200
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"
}
404
Get Form SchemaGET/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
- `id`
string
(required) Example: 5923e510b630f13200885bb4
200
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 FormGET/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
- `id`
string
(required) Example: 5923e510b630f13200885baf
200
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"
}
404
Create a new FormPOST/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
- `id`
string
(required) Example: 5923e510b630f13200885baf
200
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"
}
403
Update a FormPATCH/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 Document
s.
Example URI
- `id`
string
(required) Example: 5923e510b630f13200885bb4
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"
}
]
}
}
200
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"
}
]
},
}
403
Rename a formKeyPATCH/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
- `id`
string
(required) Example: 5923e510b630f13200885bb4
Headers
Content-Type: application/json
Body
{
"oldKey": "courses",
"newKey": "programs"
}
200
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"
}
403
Delete a FormDELETE/cor/forms/api/v2/forms/:id
Delete a Form
by ID.
Example URI
- `id`
String
(required) Example: 5923e510b630f13200885baf
204
Headers
Content-Type: application/json
404
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 Document
s 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 Document
s 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 DocumentsGET/cor/forms/api/v2/form-containers/:id/forms/current/documents
Fetches a list of all Document
s, if any, associated to the “current” form of the given FormContainer
. For the semantics of the term “current form”, see the Form
s documentation. May return an empty array.
Example URI
- `id`
string
(required) Example: 5923e510b630f13200885baf
200
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 DocumentsGET/cor/forms/api/v2/forms/:id/documents
Fetches a list of all Document
s, if any, associated to Form
with the given ID. This endpoint may return an empty array.
Example URI
- `id`
string
(required) Example: 5923e510b630f13200885bb4
200
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 DocumentGET/cor/forms/api/v2/documents/:id
Get a Document
by ID.
Example URI
- `id`
string
(required) Example: 5923e5e6b630f13200885bb5
200
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"
}
404
Create a FormContainer DocumentPOST/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 Form
s documentation.
Example URI
- `id`
string
(required) Example: 5923e510b630f13200885baf
Headers
Content-Type: application/json
Body
{
"data": {
"title": "Tetris",
"description": "The best shape game ever made!",
"courses": {
"id": "5909a5f874821f0e1dd079fe",
"versionId": "5909a5f874821f0e1dd079ff"
}
}
}
200
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"
}
403
Create a Form DocumentPOST/cor/forms/api/v2/forms/:id/documents
Creates a new Document
associated to the given Form
and its parent FormContainer
.
Example URI
- `id`
string
(required) Example: 5923e510b630f13200885bb4
Headers
Content-Type: application/json
Body
{
"data": {
"title": "Tetris",
"description": "The best shape game ever made!",
"courses": {
"id": "5909a5f874821f0e1dd079fe",
"versionId": "5909a5f874821f0e1dd079ff"
}
}
}
200
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"
}
403
Update a DocumentPATCH/cor/forms/api/v2/documents/:id
Update a Document
by ID. The given data
object is merged with the existing data
object.
Example URI
- `id`
string
(required) Example: 5923e5e6b630f13200885bb5
Headers
Content-Type: application/json
Body
{
"data": {
"description": "The best shape game ever made!"
}
}
200
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"
}
403
Delete a DocumentDELETE/cor/forms/api/v2/documents/:id
Delete an existing Document
by ID.
Example URI
- `id`
string
(required) Example: 5923e5e6b630f13200885bb5
204
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 SchemaGET/api/cm/courses/schema
Example URI
200
Headers
Content-Type: application/json
Body
{
"number": {
"label": "Number",
"limit": "5"
},
...
}
Course Schema Attribute ¶
Get Schema AttributeGET/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
- key
string
(required) Example: numberSchema attribute key
200
Headers
Content-Type: application/json
Body
{
"label": "Number",
"limit": "5"
}
Dependencies ¶
Get DependenciesGET/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
- id
string
(required) Example: 8e738178-c009-45df-81a2-093d2f030e77Item Id
200
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 VersionsGET/api/cm/courses/{pid}/versions
Return an array containing all versions of a course with the newest version at index 0.
Example URI
- pid
string
(required) Example: 8e738178-c009-45df-81a2-093d2f030e77Item Id
200
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"
}
...
]
}
404
Headers
Content-Type: text/plain
Body
Course not found
Latest Active Version ¶
Get Lastest Active VersionGET/api/cm/courses/{pid}/latestActive
Return the course object of the active version of the requested pid.
Example URI
- pid
string
(required) Example: 8e738178Parent Id (pid) of the item
200
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.",
...
}
404
Headers
Content-Type: text/plain
Body
Course not found
Proposal in Review ¶
Get Proposal in ReviewGET/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
- pid
string
(required) Example: 8e738178Parent Id (pid) of the item
200
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"
}
Course Clones ¶
Create Course ClonePOST/api/cm/courses/{id}
Creates a proposal from the course with the given id, and returns the newly cloned proposal object.
Example URI
- id
string
(required) Example: 8e738178-c009-45df-81a2-093d2f030e77Id of the item
200
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 : DEPRECATEDPOST/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
- pid
string
(required) Example: 8e738178Parent Id (pid) of the item
Headers
Content-Type: application/json
Body
{
startTerm: {
type: "year",
year: "2018"
},
id: "8e738178-c009-45df-81a2-093d2f030e77"
}
200
Headers
Content-Type: application/json
Body
{
unique: false
}
Course Retirement ¶
Retire a CoursePUT/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
- id
string
(required) Example: 8e738178-c009-45df-81a2-093d2f030e77Id of the item
Body
endDate: {
type: 'year',
year: '2015'
},
rationale: 'Retire rationale here'
200
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 ProposalPUT/api/cm/courses/{id}/sharing
Shares the proposal with the users in the request body.
Example URI
- id
string
(required) Example: 8e738178-c009-45df-81a2-093d2f030e77Id of the item
Body
[
{
id: "1366763d-35d2-462b-b7d9-b3ffef07b78f",
name: "admin"
}
...
]
200
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 ApprovalPOST/api/cm/courses/{id}/submitForApproval
Submits the given proposal id for approval via workflow.
Example URI
- id
string
(required) Example: 8e738178-c009-45df-81a2-093d2f030e77Id of the item
200
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 ProposalPOST/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
- id
string
(required) Example: 8e738178-c009-45df-81a2-093d2f030e77Id of the item
Body
comment: 'Looks great!'
200
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 ProposalPOST/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
- id
string
(required) Example: 8e738178-c009-45df-81a2-093d2f030e77Id of the item
Body
{comment: 'Change the description to be more accurate'}
200
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 ConfigGET/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
200
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"
}
]
}
ModifyPUT/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
Course ¶
Get CourseGET/api/cm/courses/{id}{?includeSchema}
Example URI
- id
string
(required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4auto-generated course ID
- includeSchema
boolean
(optional) Example: true
200
Headers
Content-Type: application/json
Body
{
"id": "fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4",
"title": "Disappearing & Hiding",
"subjectCode": "SCAR",
"number": "201A",
"updatedBy": "12345",
...
}
404
Headers
Content-Type: text/plain
Body
Course not found
Update CoursePUT/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
- id
string
(required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4auto-generated course ID
- includeSchema
boolean
(optional) Example: true
Body
{
"title": "Disappearing & Hiding, Modified",
}
200
Headers
Content-Type: application/json
Body
{
"id": "fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4",
"title": "Disappearing & Hiding, Modified",
"subjectCode": "SCAR",
"number": "201A",
...
"validations": "{error object}"
}
404
Headers
Content-Type: text/plain
Body
Course not found
Delete CourseDELETE/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
- id
string
(required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4auto-generated course ID
- includeSchema
boolean
(optional) Example: true
204
404
Headers
Content-Type: text/plain
Body
No item found
Courses ¶
Create CoursePOST/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
Body
{
"title": "Tactics for Scary Napping",
"subjectCode": "NAPS",
"number": "400",
"startTerm": {
"type": "year",
"year": 2015
},
"status": "active"
}
200
Headers
Content-Type: application/json
Body
{
"id": "92062dcf-d975-4e57-8073-03f202082786",
"title": "Tactics for Scary Napping",
"subjectCode": "NAPS",
"number": "400"
}
Query ¶
ItemGET/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
- 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 equalsExamples
?created=gt(1490645684620)
?updated=gte(1490645684620)
- lt
string
(optional)Return documents where the specified field is less than a value. Add
e
to include equalsExamples
?created=lt(1490645684620)
?updated=lte(1490645684620)
200
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 ProposalsGET/api/cm/proposals/courses/
Return an array containing the proposals created by the user with which the API key is associated.
Example URI
200
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"
},
...
]
404
Headers
Content-Type: text/plain
Body
Proposal not found
Create ProposalPOST/api/cm/proposals/courses/
Create a new proposal with the details sent in the body of the request.
Example URI
200
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"
}
404
Headers
Content-Type: text/plain
Body
Proposal not found
Proposal ¶
Get ProposalGET/api/cm/proposals/courses/
Return proposal with given ID.
Example URI
200
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"
}
404
Headers
Content-Type: text/plain
Body
Proposal not found
Update ProposalPUT/api/cm/proposals/courses/
Change proposal with a given ID.
Example URI
Body
{
description: "API TESTING COURSE! Modified"
}
200
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"
}
404
Headers
Content-Type: text/plain
Body
Proposal not found
Clone ProposalPOST/api/cm/proposals/courses/
Make a new proposal based off of the proposal with given ID.
Example URI
200
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"
}
404
Headers
Content-Type: text/plain
Body
Proposal not found
Delete ProposalDELETE/api/cm/proposals/courses/
Deletes the proposal with the specified ID.
Example URI
200
Body
OK
404
Headers
Content-Type: text/plain
Body
Proposal not found
Proposal Status ¶
Update Proposal StatusPUT/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
- id
string
(required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4auto-generated course ID
- status
string
(required) Example: approved
200
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
}
404
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 OptionGET/api/cm/options/{id}
Example URI
- id
string
(required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4auto-generated option ID
200
Headers
Content-Type: application/json
Body
{
"active": true,
"id": "0a9ccc24-06f9-401c-8fa2-f191db77dbb1",
"locale": "en-US",
"name": "Marketing",
"type": "curricularUnit"
}
404
Headers
Content-Type: text/plain
Body
Option not found
Update OptionPUT/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
- id
string
(required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4auto-generated option ID
Body
{
"name": "Online Marketing"
}
200
Headers
Content-Type: application/json
Body
{
"active": true,
"id": "0a9ccc24-06f9-401c-8fa2-f191db77dbb1",
"locale": "en-US",
"name": "Online Marketing",
"type": "curricularUnit"
}
404
Headers
Content-Type: text/plain
Body
Option not found
Inactivate OptionDELETE/api/cm/options/{id}
Options do not support deletion. However, an option can be inactivated by calling this endpoint.
Example URI
- id
string
(required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4auto-generated option ID
200
Headers
Content-Type: application/json
404
Headers
Content-Type: text/plain
Body
Option not found
Options ¶
Create OptionPOST/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
Body
{
"locale": "en-US",
"name": "Music",
"type": "jacs"
}
200
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 TypesGET/api/cm/options/types
Example URI
200
Headers
Content-Type: application/json
Body
[
"costcenters",
"curricularUnit",
"jacs",
"org",
"settings",
"subject-code",
"subjectcodes",
"terms"
]
Option Type ¶
Get Option TypeGET/api/cm/options/types/{type}
Example URI
- type
string
(required) Example: jacs
200
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 SchemaGET/api/cm/calendar/settings/schema
Example URI
200
Headers
Content-Type: application/json
Body
{
"allowExternalTermId": {
"type": "boolean"
},
"allowExternalYearId": {
"type": "boolean"
},
"reverseDisplayOrder": {
"type": "boolean"
}
}
Calendar Settings ¶
Get Calendar SettingsGET/api/cm/calendar/settings
Example URI
200
Headers
Content-Type: application/json
Body
{}
Update Calendar SettingsPUT/api/cm/calendar/settings
Modify calendar settings by sending a PUT request.
Example URI
Body
{
"reverseDisplayOrder": true
}
200
Headers
Content-Type: application/json
Body
{
"reverseDisplayOrder": true
}
Calendar Upload ¶
Upload caledar dataPOST/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
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
200
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 SchemaGET/api/cm/calendar/years/schema
Example URI
200
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 YearPOST/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
Body
{
"externalId": "123",
"label": "2020-2021",
"start": 1462904494515,
"end": 1494440662973
}
200
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 YearsGET/api/cm/calendar/years/{?active}
Example URI
- active
boolean
(optional) Example: true
200
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 YearGET/api/cm/calendar/years/{id}
Example URI
- id
string
(required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4auto-generated option ID
200
Headers
Content-Type: application/json
Body
{
"active": true,
"end": 1494440662973,
"externalId": "123",
"id": "eda362dd-195a-4739-b116-6cfb910a5f1e",
"label": "2020-2021",
"start": 1462904494515
}
Update YearPUT/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
- id
string
(required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4auto-generated option ID
Body
{
"active": false
}
200
Headers
Content-Type: application/json
Body
[
{
"active": false,
"end": 1494440662973,
"externalId": "123",
"id": "eda362dd-195a-4739-b116-6cfb910a5f1e",
"label": "2020-2021",
"start": 1462904494515
}
]
404
Headers
Content-Type: text/plain
Body
"No year found with that ID"
Delete YearDELETE/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
- id
string
(required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4auto-generated option ID
200
Headers
Content-Type: application/json
204
Headers
Content-Type: application/json
404
Headers
Content-Type: text/plain
Body
"No year found with that ID"
Terms Schema ¶
GET Terms SchemaGET/api/cm/calendar/terms/schema
Example URI
200
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 TermPOST/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
Body
{
"externalId": "123",
"label": "2020-2021",
"start": 1462904494515,
"end": 1494440662973,
"yearId": "788b8e90-e850-49c4-8467-c484c3de84b7"
}
200
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 TermsGET/api/cm/calendar/terms/{?active}
Example URI
- active
boolean
(optional) Example: true
200
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 TermGET/api/cm/calendar/terms/{id}
Example URI
- id
string
(required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4auto-generated option ID
200
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 TermPUT/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
- id
string
(required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4auto-generated option ID
Body
{
"active": false
}
200
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"
}
404
Headers
Content-Type: text/plain
Body
"No term found with that ID"
Delete TermDELETE/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
- id
string
(required) Example: fa2ef9e1-1ca2-4acb-a4b0-1b87ea4026a4auto-generated option ID
204
Headers
Content-Type: application/json
404
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
APILabel
s. These are how you specify which specific gadget you want to populate. -
type
: This is thegadget
type. The most populargadget
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 Object
s 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 checkboxesOptionAPILabel
s 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 whentype
is set to ‘month’. -
Optional -
termOptionId
:String
- Only required whentype
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 String
s 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 ifmode
===flat
, contains one or morerulesObject
's -
Optional -
groupings
:Array
- Used ifmode
===groupings
, contains one or moregroupingsObject
'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 aruleObject
in therules
array that has analpha
value that matches. -
Required -
rules
:Array
A ruleObject
will consist of the following key
: value
pairs.
-
Required -
key
:String
- Must match a character in thelogic
string. -
Required -
data
:Object
- The data rule requires. -
Required -
alpha
:String
- Single character string that must be represented in therulesObject
: ‘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 Object
s 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 moreruleObject
's
A ruleObject
will consist of the following key
: value
pairs.
-
Required -
id
:String
- Obtained from yourrule
's schema. -
Optional -
type
:String
- Obtained from yourrule
's schema. -
Optional -
rules
:Object
- Anyrule
's that thisrule
depends on. -
Optional -
subtype
:String
- Obtained from yourrule
's schema. -
Required -
isRuleSet
:Boolean
- Obtained from yourrule
's schema. -
Required -
alphaCharacter
:String
- Obtained from yourrule
'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 optionID
s 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.
- 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>
- 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 -->
- 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>
- 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 DisclosureGET/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
- id
number
(required) Example: 1The Id of the disclosure being retrieved.
Headers
Authorization: Bearer {authToken}
200
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 DisclosureGET/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
Headers
Authorization: Bearer {authToken}
200
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 IdGET/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
Headers
Authorization: Bearer {authToken}
200
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 EntityPOST/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
- id
number
(required) Example: 1The id of the parent disclosure.
Headers
Authorization: Bearer {authToken}
200
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 EntityPUT/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
- id
number
(required) Example: 1The id of the parent diclosure.
- entityId
number
(required) Example: 54The id of the financial entity being updated.
Headers
Authorization: Bearer {authToken}
200
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 DeclarationPOST/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
- id
number
(required) Example: 1The id of the parent disclosure
Headers
Authorization: Bearer {authToken}
Body
{
"finEntityId": 1502,
"typeCd": 1,
"projectId": 1003
}
200
Headers
Content-Type: application/json;charset=UTF-8
Body
{
"finEntityId": 1502,
"typeCd": 1,
"projectId": 1003,
"disclosure_id": "503",
"id": 3002
}
Declarations ¶
Update DeclarationPUT/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
- id
number
(required) Example: 1The id of the parent disclosure.
- declarationId
number
(required) Example: 23The id of the declaration being updated.
Headers
Authorization: Bearer {authToken}
Body
{
"finEntityId": 1502,
"typeCd": 2,
"projectId": 1003,
"disclosure_id": "503",
"id": 3002
}
200
Question Answers ¶
Create Question AnswerPOST/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
- id
number
(required) Example: 1The id of the parent disclosure.
Headers
Authorization: Bearer {authToken}
Body
{
"questionId": 2,
"answer": {
"value": "No"
}
}
200
Headers
Content-Type: application/json;charset=UTF-8
Body
{
"questionId": 2,
"answer": {
"value": "No"
},
"id": 10
}
Delete Question AnswerDELETE/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
- id
number
(required) Example: 1The id of the parent disclosure.
Headers
Authorization: Bearer {authToken}
Body
{
toDelete: [ 5 ]
}
204
Question Answers ¶
Update Question AnswerPUT/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
- id
number
(required) Example: 1The id of the parent disclosure.
- questionId
number
(required) Example: 3The id of the question being answered.
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
}
}
}
200
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 ItemsGET/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
- id
number
(required) Example: 1The id of the parent disclosure.
Headers
Authorization: Bearer {authToken}
200
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 SummariesGET/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
Headers
Authorization: Bearer {authToken}
200
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 SummariesGET/api/coi/disclosure-summaries/
Requires valid API key with role of admin. Admins can view all disclosure summaries.
Example URI
Headers
Authorization: Bearer {authToken}
200
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 DisclosureGET/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
- id
number
(required) Example: 1The id of the disclosure being retrieved.
Headers
Authorization: Bearer {authToken}
200
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 ConfigurationGET/api/coi/config
Requires valid API key.
Example URI
Headers
Authorization: Bearer {authToken}
200
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 ConfigPOST/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
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
}
}
}
200
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 ConfigurationGET/api/coi/config/:id
Requires valid API key.
Example URI
- id
number
(required) Example: 1The Id of the config being retrieved.
Headers
Authorization: Bearer {authToken}
200
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 ProjectsGET/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
Headers
Authorization: Bearer {authToken}
200
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 ProjectPOST/api/coi/projects
Requires valid API key with role of admin or user. Creates or updates a project from an external system.
Example URI
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"
}
200
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 personsGET/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
- filter:
Example URI
Headers
Content-Type: application/json; charset=utf-8
Authorization: Bearer {authToken}
200
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 FileGET/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
- id:
Example URI
Headers
Authorization: Bearer {authToken}
200
Body
Data
Delete FileDELETE/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
- id:
Example URI
Headers
Authorization: Bearer {authToken}
200
Files ¶
Create FilePOST/api/coi/files
Requires valid API key. Users can only revise questions which are associated with their disclosures
Example URI
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--
200
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 ResponsePOST/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.
- reviewId:
Example URI
Headers
Authorization: Bearer {authToken}
Body
{
"comment": "fdsf"
}
200
PI Revise ¶
Update QuestionPUT/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
- reviewId:
Example URI
Headers
Authorization: Bearer {authToken}
Content-Type: application/json;charset=UTF-8
Body
{
"answer": "Yes"
}
200
Headers
Content-Type: application/json; charset=utf-8
Body
[
true,
1
]
PI Revise Entity Question ¶
Update Entity QuestionPUT/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
- reviewId:
Example URI
Headers
Authorization: Bearer {authToken}
Content-Type: application/json;charset=UTF-8
Body
{
"comment": "fsdf"
}
200
Headers
Content-Type: application/json; charset=utf-8
Body
[
true,
1
]
PI Revise Entity ¶
Create Entity RelationshipPOST/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
- reviewId:
Example URI
Headers
Authorization: Bearer {authToken}
Content-Type: application/json;charset=UTF-8
Body
{
"personCd": 1,
"relationshipCd": 1,
"typeCd": 5,
"amountCd": 6,
"comments": "sdf",
"travel": {}
}
200
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 RelationshipDELETE/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
- reviewId:
Example URI
Headers
Authorization: Bearer {authToken}
200
Revise Declaration ¶
Update DeclarationPUT/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
- reviewId:
Example URI
Headers
Authorization: Bearer {authToken}
Content-Type: application/json;charset=UTF-8
Body
{
"disposition": "3",
"comment": ""
}
200
Revise Sub Question ¶
Update Sub QuestionPUT/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
- reviewId:
Example URI
Headers
Authorization: Bearer {authToken}
Content-Type: application/json;charset=UTF-8
Body
{
"answer": {
"value": "fdsfdsf"
}
}
200
Headers
Content-Type: application/json; charset=utf-8
Body
[
true,
1
]
Delete Sub Question ¶
Delete Sub QuestionDELETE/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
- reviewId:
Example URI
Headers
Authorization: Bearer {authToken}
200
DRAFT - Research - Awards ¶
DRAFT:
Awards ¶
Kuali Research Awards providing Post Award management
Awards SummaryGET/award/api/v1/awards?summary
Summary of Awards
Example URI
- 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: 1446630596000Criteria to restrict the awards returned to those updated since the date specified. Formatted as milliseconds since epoch.
- limit
number
(optional) Example: 50Number of results to return. If not included, all awards matching the date, if specified, are returned.
- page
number
(optional) Example: 8If a limit is specified this determines what page of the result set will be returned on this request.
Headers
Authorization: Bearer {api-key}
200
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 AccountsGET/award/api/v1/accounts
Get all accounts that are available for use
Example URI
- startIndex
number
(optional) Example: 0Starting index of the results to be returned. If not included, all available accounts are returned.
- size
number
(optional) Example: 5Size of the results to be returned. If not included, all available accounts are returned.
Headers
Authorization: Basic
Content-Type: application/json
200
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 AccountGET/award/api/v1/accounts/55555
Get information on a particular account
Example URI
- showAwards
boolean
(optional) Example: trueFlag to indicate if award ids linked to account should be returned.
Headers
Authorization: Basic
Content-Type: application/json
200
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 AccountGET/award/api/v1/accounts/awards/2742
Get award details required to create an account using award id
Example URI
Headers
Authorization: Basic
Content-Type: application/json
200
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 AccountPUT/award/api/v1/accounts/878787
Set various fields on an account. Fields not provided will not be updated.
Example URI
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]+)"
}
}
}
200
Headers
Content-Length: 0
DRAFT - Research - Common ¶
DRAFT:
Organizations ¶
Organization SummaryGET/research-common/api/v1/organizations?summary
Summary of all Organizations in the system
Example URI
- summary
boolean
(required)Renders the organizations in a summary view instead of the full data from the organization. Currently the only option and required.
Headers
Authorization: Bearer {api-key}
200
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 UnitsGET/research-common/api/v1/units
Example URI
Headers
Authorization: Bearer {api-key}
200
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 TypesGET/research-common/api/v1/activity-types
Example URI
Headers
Authorization: Bearer {api-key}
200
Headers
Content-Type: application/json;charset=UTF-8
Body
[
{
"description": "Research",
"code": "1"
},
{
"description": "Instruction",
"code": "2"
}
]
Rate Class Types ¶
List All Rate Class TypesGET/research-common/api/v1/rate-class-types
Example URI
Headers
Authorization: Bearer {api-key}
200
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 ClassesGET/research-common/api/v1/rate-classes
Example URI
Headers
Authorization: Bearer {api-key}
200
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 TypesGET/research-common/api/v1/rate-types
Example URI
Headers
Authorization: Bearer {api-key}
200
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 RatesGET/research-common/api/v1/institute-rates
Example URI
Headers
Authorization: Bearer {api-key}
200
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 RatesPUT/research-common/api/v1/institute-rates
Example URI
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"
}
]
200
DRAFT - Research - Institutional Proposals ¶
DRAFT: This section addresses API routes that deal with COI Configurations.
Institutional Proposal ¶
Proposal SummaryGET/instprop/v1/institutional-proposals?summary
Summary of all Institutional Proposals in the system
Example URI
- 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: 1446630596000Criteria to restrict the proposals returned to those updated since the date specified. Formatted as milliseconds since epoch.
- limit
number
(optional) Example: 50Number of results to return. If not included, all proposals matching the date,if specified, are returned.
- page
number
(optional) Example: 8If a numberPerPage is specified this determines what page of the result set will be returned on this request.
Headers
Authorization: Bearer {api-key}
200
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 FileGET/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
- id
number
(required)ID of the file in the form of a big integer
Headers
Authorization: Bearer {api-key}
200
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 FileDELETE/api/v1/files/{id}
Example URI
- id
number
(required)ID of the file in the form of a big integer
Headers
Authorization: Bearer {api-key}
204
Files ¶
Upload a FilePOST/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
201
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 InstitutionGET/api/v1/institution
Requires valid API key with role of user or admin.
Example URI
Headers
Content-Type: application/json
Authorization: Bearer {api-key}
200
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 InstitutionPUT/api/v1/institution
Requires valid API key with admin role.
Example URI
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"
}
200
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"
}