{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"4df3efe9-c11a-488e-93e3-725df6855834","name":"CEM Data API - Documentation","description":"### Overview\nCE Manager, the market leader in continuing education compliance tracking software, is used in over 400 jurisdictions worldwide. For nearly 20 years, firms have relied on CE Manager for its CLE, CPE, and CPD tracking and professional development capabilities.\n\nCE Manager's APIs belong to the Representational State Transfer (REST) category. They allow you to perform 'RESTful' operations such as reading, modifying, adding or deleting data from your  CE MAnager. The APIs also support Cross-Origin Resource Sharing (CORS).\n\n### New Features!\n\n  - Create courses & schedule\n  - Register attendees and instructors.\n  - Get compliance reports\n\nYou can also:\n  - List/Add/Edit your Firm system tables\n  - Validate attendees\n  - Adjust course credits\n  - Add course licenses\n  \n> Note:\n> This documentation is for the v1.0 of the APIs.\n\n### Policies\n**Deprecation Policy**\nThe current version of production level APIs is v1. When a new version of APIs is made generally available, the older version will be deprecated and will cease to function after one year. Once an API is removed, any request to it will result in a 404 error.\n\n> Note:\n> We will not remove any API until similar functionality is present in the new version\n\n**Breaking Change Policy**\nChanges that do not break an API, such as adding a new attribute can be made at any time. Changes that break a production level API such as removing attributes or making major changes to the API’s behavior will only be done with an advance notice of 60 days. However, there may be rare occasions where due to legal, performance, or security reasons, we are forced to make breaking changes without advance notice.\n\n# Getting Started\n### Authentication\nThe firm who wish to use the CE Manager API will be given a **client_id** and **client_secret**. These will be provided upon request. \n\n\n### API Methods\nCE Manager APIs are plain JSON over HTTPS and use the following HTTPS methods:\n\n| METHOD | PURPOSE |\n| ------ | ------ |\n|POST|Create an object|\n|GET|Fetch one or more objects|\n|PUT|Update an object|\n|DELETE|Remove an object|\n\n\n### Responses\nWeb API returns all response data as a JSON object. See the Web API Endpoint for a description of all the retrievable objects.\n\n### Response Status Codes\nWeb API uses the following response status codes, as defined in the **RFC 2616** and RFC 6585:\n\n| STATUS CODE | DESCRIPTION |\n| ------ | ------ |\n| 200 | OK - The request has succeeded. The client can read the result of the request in the body and the headers of the response |\n|400|Bad Request - The request could not be understood by the server due to malformed syntax. The message body will contain more information; see Response Schema.|\n|401|Unauthorized - The request requires user authentication or, if the request included authorization credentials, authorization has been refused for those credentials.|\n|403|Forbidden - The server understood the request, but is refusing to fulfill it.|\n|404|Not Found - The requested resource could not be found. This error can be due to a temporary or permanent condition.|\n|429|Too Many Requests - Rate limiting has been applied.|\n|500|Internal Server Error. You should never receive this error because our clever coders catch them all … but if you are unlucky enough to get one, please report it to us.|\n|502|Bad Gateway - The server was acting as a gateway or proxy and received an invalid response from the upstream server.|\n|503|Service Unavailable - The server is currently unable to handle the request due to a temporary condition which will be alleviated after some delay. You can choose to resend the request again.|\n\n## Response Schema\nWeb API uses two different formats to describe an error:\n1. Authentication Error Object\n2. Regular Error Object\n\n**Authentication Error Object**\nWhenever the application makes requests related to authentication or authorization to Web API, such as retrieving an access token or refreshing an access token, the error response follows RFC 6749 on the OAuth 2.0 Authorization Framework.\n\nHere is an example of a request that has an invalid access token.\n\n|KEY|VALUE TYPE|VALUE DESCRIPTION|\n| ------ | ------ |------|\n|error|string|A high level description of the error|\n|error_description|string|A more detailed description of the error|\n\n```sh\n{\n    \"error\": \"invalid_client\",\n    \"error_description\": \"Invalid client secret\"\n}\n```\n\n**Regular Error Object**\nApart from the response code, unsuccessful responses return a JSON object containing the following information:\n\n|KEY|VALUE TYPE|VALUE DESCRIPTION|\n| ------ | ------ |------|\n|IsValid|Boolean| An indicator if the object passed is valid or not |\n|Errors|-| A list of all the error encountered.|\n|Field|string|\tA specific field of the error|\n|Message|string|\tA short description of the cause of the error.|\n\nHere, for example is the error that occurs when trying to fetch information for a non-existent record:\n```sh\n[\n    {\n        \"IsValid\": false,\n        \"Errors\": [\n            {\n                \"Field\": \"field name\",\n                \"Message\": \"error message\"\n            },\n            {\n                \"Field\": \"field name\",\n                \"Message\": \"error message\"\n            }\n        ]\n    },\n    {\n        \"IsValid\": false,\n        \"Errors\": [\n            {\n                \"Field\": \"field name\",\n                \"Message\": \"error message\"\n            },\n            {\n                \"Field\": \"field name\",\n                \"Message\": \"error message\"\n            }\n        ]\n    }\n]\n```\n\n### Timestamps\nTimestamps are returned in ISO 8601 format as Coordinated Universal Time (UTC) with a zero offset: YYYY-MM-DDTHH:MM:SSZ. \n\n### Pagination\nSome endpoints support a way of paging the dataset, taking an offset and limit as query parameters:\n```js\n$ curl https://api.micronsystems.com/v1/courses?offset=20&limit=10\n```\nIn this example, in a list of 50 [total] courses under the firm: From the twentieth (offset) course, retrieve the next 10 (limit) courses.\n\n> *Note:* The offset numbering is zero-based. Omitting the offset parameter returns the first 30 records. Check the documentation for the specific endpoint and verify the default limit value. Requests that return an array of items are automatically paginated if the number of items exceeds 30. For example, attendance in a schedule. In such case, the results are returned within a paging object.\n\n\n ## Paging Objects\n| Name| Type | Description | \n | ------------- |:-------------:| -----:| \n|PageNumber|integer|O base index of the first record in the list|\n|PageSize|integer|Page size. Default is 30|\n|RecordCount|integer|Total number of record in the list|\n\n ## Rate Limiting\nRate Limiting enables Web API to share access bandwidth to its resources equally across all clients.\n\nRate limiting is applied as per application based on Client ID, and regardless of the number of users who authenticate using the Client ID.\n\nTo reduce the amount of requests, use endpoints that fetch multiple entities in one request. For example: If you often request single course, schedule or attendees use endpoints such as List All Courses, List All Schedules or Get All Schedule Attendees, instead. For POST request, maximize the request limit by sending bulk request. The bulk request limit is 100 records per minute.\n\nNote: If Web API returns status code 429, it means that you have sent too many requests. When this happens, check the X-Rate-Limit-Reset header, where you will see a number displayed. This is the number of seconds that you need to wait, before you try your request again.\n\nThe returned HTTP headers of any API request show your current rate limit status:\n\n| Header Name | Description |\n|------------------------|--------------------------------------------------------------------------------------------------------------------------|\n| X-Rate-Limit-Limit | The maximum number of requests you're permitted to make per hour. |\n| X-Rate-Limit-Remaining | The number of requests remaining in the current rate limit window. |\n| X-Rate-Limit-Reset | The time at which the current rate limit window resets in [UTC epoch seconds](https://en.wikipedia.org/wiki/Unix_times). |\n\n\n# API Index\n\n|API END POINT|CREATE|VIEW|UPDATE|DELETE|\n| ------ | ------ |------|------|------|\n|Affiliation|Yes|Yes|Yes|No|\n|Class year|Yes|Yes|Yes|No|\n|Compliance|No|No|Yes|No|\n|Country|No|No|Yes|No|\n|Course|Yes|Yes|Yes|No|\n|Department|Yes|Yes|Yes|No|\n|Ethnicity|Yes|Yes|Yes|No|\n|Format|No|No|Yes|No|\n|Learning Track|Yes|Yes|Yes|No|\n|Level|Yes|Yes|Yes|No|\n|Location|Yes|Yes|Yes|No|\n|Material|No|No|Yes|No|\n|Practice Area|Yes|Yes|Yes|No|\n|Provider|Yes|Yes|Yes|No|\n|Recommendation|Yes|Yes|Yes|No|\n|Schedule|Yes|Yes|Yes|No|\n|State|No|No|Yes|No|\n|Timezone|No|No|Yes|No|\n|Title|Yes|Yes|Yes|No|\n|User|Yes|Yes|Yes|No|","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":true,"owner":"6393935","team":95843,"collectionId":"4df3efe9-c11a-488e-93e3-725df6855834","publishedId":"TVemCpcG","public":true,"publicUrl":"https://devdoc.microncloud.net","privateUrl":"https://go.postman.co/documentation/6393935-4df3efe9-c11a-488e-93e3-725df6855834","customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"EF5B25"},"documentationLayout":"classic-double-column","customisation":null,"version":"8.10.1","publishDate":"2020-11-12T04:43:55.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{},"logos":{}},"statusCode":200},"environments":[],"user":{"authenticated":false,"permissions":{"publish":false}},"run":{"button":{"js":"https://run.pstmn.io/button.js","css":"https://run.pstmn.io/button.css"}},"web":"https://www.getpostman.com/","team":{"logo":"https://res.cloudinary.com/postman/image/upload/t_team_logo_pubdoc/v1/team/08e13abd4482308e2b6094cf1cc947fe9752dbed5ffb59f39da107ee610cc028","favicon":"https://microncloud.net/favicon.ico"},"isEnvFetchError":false,"languages":"[{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"HttpClient\"},{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"RestSharp\"},{\"key\":\"curl\",\"label\":\"cURL\",\"variant\":\"cURL\"},{\"key\":\"dart\",\"label\":\"Dart\",\"variant\":\"http\"},{\"key\":\"go\",\"label\":\"Go\",\"variant\":\"Native\"},{\"key\":\"http\",\"label\":\"HTTP\",\"variant\":\"HTTP\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"OkHttp\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"Unirest\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"Fetch\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"jQuery\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"XHR\"},{\"key\":\"c\",\"label\":\"C\",\"variant\":\"libcurl\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Axios\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Native\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Request\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Unirest\"},{\"key\":\"objective-c\",\"label\":\"Objective-C\",\"variant\":\"NSURLSession\"},{\"key\":\"ocaml\",\"label\":\"OCaml\",\"variant\":\"Cohttp\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"cURL\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"Guzzle\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"HTTP_Request2\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"pecl_http\"},{\"key\":\"powershell\",\"label\":\"PowerShell\",\"variant\":\"RestMethod\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"http.client\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"Requests\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"httr\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"RCurl\"},{\"key\":\"ruby\",\"label\":\"Ruby\",\"variant\":\"Net::HTTP\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"Httpie\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"wget\"},{\"key\":\"swift\",\"label\":\"Swift\",\"variant\":\"URLSession\"}]","languageSettings":[{"key":"csharp","label":"C#","variant":"HttpClient"},{"key":"csharp","label":"C#","variant":"RestSharp"},{"key":"curl","label":"cURL","variant":"cURL"},{"key":"dart","label":"Dart","variant":"http"},{"key":"go","label":"Go","variant":"Native"},{"key":"http","label":"HTTP","variant":"HTTP"},{"key":"java","label":"Java","variant":"OkHttp"},{"key":"java","label":"Java","variant":"Unirest"},{"key":"javascript","label":"JavaScript","variant":"Fetch"},{"key":"javascript","label":"JavaScript","variant":"jQuery"},{"key":"javascript","label":"JavaScript","variant":"XHR"},{"key":"c","label":"C","variant":"libcurl"},{"key":"nodejs","label":"NodeJs","variant":"Axios"},{"key":"nodejs","label":"NodeJs","variant":"Native"},{"key":"nodejs","label":"NodeJs","variant":"Request"},{"key":"nodejs","label":"NodeJs","variant":"Unirest"},{"key":"objective-c","label":"Objective-C","variant":"NSURLSession"},{"key":"ocaml","label":"OCaml","variant":"Cohttp"},{"key":"php","label":"PHP","variant":"cURL"},{"key":"php","label":"PHP","variant":"Guzzle"},{"key":"php","label":"PHP","variant":"HTTP_Request2"},{"key":"php","label":"PHP","variant":"pecl_http"},{"key":"powershell","label":"PowerShell","variant":"RestMethod"},{"key":"python","label":"Python","variant":"http.client"},{"key":"python","label":"Python","variant":"Requests"},{"key":"r","label":"R","variant":"httr"},{"key":"r","label":"R","variant":"RCurl"},{"key":"ruby","label":"Ruby","variant":"Net::HTTP"},{"key":"shell","label":"Shell","variant":"Httpie"},{"key":"shell","label":"Shell","variant":"wget"},{"key":"swift","label":"Swift","variant":"URLSession"}],"languageOptions":[{"label":"C# - HttpClient","value":"csharp - HttpClient - C#"},{"label":"C# - RestSharp","value":"csharp - RestSharp - C#"},{"label":"cURL - cURL","value":"curl - cURL - cURL"},{"label":"Dart - http","value":"dart - http - Dart"},{"label":"Go - Native","value":"go - Native - Go"},{"label":"HTTP - HTTP","value":"http - HTTP - HTTP"},{"label":"Java - OkHttp","value":"java - OkHttp - Java"},{"label":"Java - Unirest","value":"java - Unirest - Java"},{"label":"JavaScript - Fetch","value":"javascript - Fetch - JavaScript"},{"label":"JavaScript - jQuery","value":"javascript - jQuery - JavaScript"},{"label":"JavaScript - XHR","value":"javascript - XHR - JavaScript"},{"label":"C - libcurl","value":"c - libcurl - C"},{"label":"NodeJs - Axios","value":"nodejs - Axios - NodeJs"},{"label":"NodeJs - Native","value":"nodejs - Native - NodeJs"},{"label":"NodeJs - Request","value":"nodejs - Request - NodeJs"},{"label":"NodeJs - Unirest","value":"nodejs - Unirest - NodeJs"},{"label":"Objective-C - NSURLSession","value":"objective-c - NSURLSession - Objective-C"},{"label":"OCaml - Cohttp","value":"ocaml - Cohttp - OCaml"},{"label":"PHP - cURL","value":"php - cURL - PHP"},{"label":"PHP - Guzzle","value":"php - Guzzle - PHP"},{"label":"PHP - HTTP_Request2","value":"php - HTTP_Request2 - PHP"},{"label":"PHP - pecl_http","value":"php - pecl_http - PHP"},{"label":"PowerShell - RestMethod","value":"powershell - RestMethod - PowerShell"},{"label":"Python - http.client","value":"python - http.client - Python"},{"label":"Python - Requests","value":"python - Requests - Python"},{"label":"R - httr","value":"r - httr - R"},{"label":"R - RCurl","value":"r - RCurl - R"},{"label":"Ruby - Net::HTTP","value":"ruby - Net::HTTP - Ruby"},{"label":"Shell - Httpie","value":"shell - Httpie - Shell"},{"label":"Shell - wget","value":"shell - wget - Shell"},{"label":"Swift - URLSession","value":"swift - URLSession - Swift"}],"layoutOptions":[{"value":"classic-single-column","label":"Single Column"},{"value":"classic-double-column","label":"Double Column"}],"versionOptions":[],"environmentOptions":[{"value":"0","label":"No Environment"}],"canonicalUrl":"https://devdoc.microncloud.net/view/metadata/TVemCpcG"}