Lucid Meetings is a fully hosted solution with everything you need to run excellent meetings that get results, and encourage accountability for those results throughout your organization.
In support of our results-oriented, organizational accountability mission, we provide programmatic access to your data via a full service REST API built on pragmatic RESTful design principles.
Concepts
- Introduction
- Changes
- Authentication
- Requests
- Responses
- Rate Limiting
- Field Types
- Field Filtering
- Embedding
- Counting
- Enveloping
- Pagination
- Sorting
- Transforms
Resources
Metadata
Members
Organizations
Rooms
Meeting Series
- Recurrence
- Invitees
- Meeting Summaries
- Meeting Series Sources
- Deleted Meeting Series
- Deleted Invitees
Meetings
Notes
Action Items
REST Hooks
- Introduction
- Properties
- Listing Hooks
- Getting a Single Hook
- Creating a Hook
- Deleting a Hook
- Sending a Hook
Examples
Introduction
#Our API uses resource-oriented URLs that leverage built in features of HTTP, like authentication, verbs and response codes. All request and response bodies are JSON encoded, including error responses. Any off-the-shelf HTTP client can be used to communicate with the API.
We believe an API is a user interface for a developer - accordingly, we've made sure our API can be easily explored from the browser!
Changes
#This is a versionless API. Advance notification of breaking changes will be available in this document and will be sent by email to our developer mailing list. Please contact us at support@lucidmeetings.com to connect with the team.
Authentication
#This API can be authenticated using OAuth2, or using an API access token you create within Lucid Meetings. All requests must be made over HTTPS. Any requests over plain HTTP will fail.
All requests are associated with a specific user in Lucid Meetings and permissions are limited to that user's capabilities.
Access can be scoped as either Read-Only or Read/Write. Read-Only access restricts the API caller to the GET, HEAD, and OPTIONS methods. Read-Write access allows the API caller full access to modify data on behalf of the user.
Authentication Using OAuth2
OAuth2 is the recommended authentication method if you are using the API as part of an application that may be used by multiple users. See Using the OAuth2 Provider for more information.
Authentication Using an API Access Token
To use an API Access Token, create an access token (see below) and supply it in the an "x-api-token" header in your requests.
$ curl -H x-api-key:12345678 https://site.lucidmeetings.com/lucid/api/v1/meetings
How to Create an API Access Token
- Sign in to Lucid Meetings
- Click the Account link at the top of the page to access your personal account
- Click the Authorize applications button to authorize a new application
- Click the Create token button for either the read or read/write token option
- Enter the name of your application as the token name (highly recommended)
- Click the Save token button to store your new token
- Click the Show API Token link to view or copy your token
Requests
#
The base URL of the API is https://site.lucidmeetings.com/lucid/api/v1
where site
should be replaced with your site subdomain.
For Lucid Meetings on-demand customers, the base URL is https://meet.lucidmeetings.com/lucid/api/v1
.
JSON Bodies
All POST, PUT, and PATCH requests are JSON encoded and must have have content type of application/json
, or the API will return a 415 Unsupported Media Type
status code.
$ curl -H x-api-key:X https://site.lucidmeetings.com/lucid/api/v1/meetings/123 \ -X PATCH \ -H 'Content-Type: application/json' \ -d '{"name":"Weekly Staff Meeting"}'
HTTP Verbs
We use standard HTTP verbs to indicate intent of a request:
OPTIONS
- To retrieve the set of allowable verbs for the resource and requestorHEAD
- To retrieve the HTTP headers for a resource or a collection of resourcesGET
- To retrieve a resource or a collection of resourcesPOST
- To create a resourcePATCH
- To modify a resourcePUT
- To set a resourceDELETE
- To delete a resource
PATCH Support For Incremental Updates
The Lucid Meetings API supports both PATCH and PUT methods for updating its resources.
The PATCH method performs partial updates via instructions
that indicate which fields should be modified. For Lucid Meetings resources, all instructions are implicitly
"REPLACE", with the field names and replacement values represented as key
: value
pairs.
{ "email" : "new.email@example.org" }
Limited HTTP Clients
If you are using an HTTP client that doesn't support PUT, PATCH or DELETE requests, send a POST request with an X-HTTP-Method-Override
header specifying the desired verb.
$ curl -H x-api-key:X https://site.lucidmeetings.com/lucid/api/v1/meetings/123 \ -X POST \ -H "X-HTTP-Method-Override: DELETE"
Responses
#All response bodies are JSON encoded.
A single resource is represented as a JSON object:
{ "field1": "value", "field2": true, "field3": [] }
A collection of resources is represented as a JSON array of objects:
[ { "field1": "value", "field2": true, "field3": [] }, { "field1": "another value", "field2": false, "field3": [] } ]
Timestamps are in UTC and formatted as ISO 8601.
Unset fields will be represented as a null
instead of not being present.
If the field is an array, it will be represented as an empty array - ie []
.
HTTP Status Codes
We use HTTP status codes to indicate success or failure of a request.
Success codes:
200 OK
- Request succeeded. Response included201 Created
- Resource created. URL to new resource in Location header204 No Content
- Request succeeded, but no response body
Error codes:
400 Bad Request
- Could not parse request401 Unauthorized
- No authentication credentials provided or authentication failed403 Forbidden
- Authenticated user does not have access404 Not Found
- Resource not found405 Method Not Allowed
- The requested HTTP method is not implemented or not allowed410 Gone
- The requested resource is no longer available415 Unsupported Media Type
- POST/PUT/PATCH request occurred without a application/json content type422 Unprocessable Entity
- A request to modify or create a resource failed due to a validation error429 Too Many Requests
- Request rejected due to rate limiting500, 501, 502, 503, etc
- An internal server error occurred
Errors
All 400 series errors (400, 401, 403, etc) will be returned with a JSON object in the body and a application/json
content type.
{ "message": "Not Found" }
500 series error codes (500, 501, 502, etc) do not return JSON bodies.
Validation Errors
In the case of validation errors on a GET/POST/PUT/PATCH request, a 422 Unprocessable Entry
status code will be returned.
The JSON response body will include an array of error messages.
{ "message": "Validation Failed", "errors": { "resource": "rooms", "field": "embed", "code": "invalid_value", "details": "In some cases the details string will provide an additional hint." } }
If unknown query parameters are supplied to a GET, a 422 Unprocessable Entry
status code will be returned.
The JSON response body will include an array of error messages.
{ "message": "Validation Failed", "errors": { "resource": "meetings", "field": "query string field", "code": "invalid_value", "details": null } }
Rate Limiting
#The API is rate limited to 100 credits per minute for a single user. A request is typically worth 1 credit. However, embedding can increase the the amount of required credits for a request. All responses include headers describing the current rate limit status:
X-Rate-Limit-Limit: 100 X-Rate-Limit-Remaining: 98 X-Rate-Limit-Used: 2 X-Rate-Limit-Reset: 20
X-Rate-Limit-Limit
- Total credit for current periodX-Rate-Limit-Remaining
- Remaining credit for current periodX-Rate-Limit-Used
- Number of credits used for this requestX-Rate-Limit-Reset
- Number of seconds until the the credit count resets
If the rate limit is hit, the API will return a 429 Too Many Requests
status code.
In this situation, your application should not send any further requests until Rate-Limit-Reset seconds have elapsed.
Field Types
#
Most resource fields are typed as basic types, such as plain text
, html
, email address
, enum
, integer
, boolean
, etc.
In addition to these basic types, the Lucid Meetings API presents some data as timestamps
or tuples
that include both the raw
value and a more readily usable or display-ready value. This is essentially a light form of embedding.
Plain Text
Input fields identified as plain text are filtered to remove HTML tags during POST, PATCH, and PUT operations. Examples of plain text fields in the Lucid Meetings model include member name, company, title, etc.
HTML
Input fields identified as HTML are filtered via HTMLPurifier to remove unsupported HTML tags and attributes. The current set of tags corresponds to the Lucid Meetings CKEditor (WYSIWYG) configuration: <p>, <b>, <strong>, <s>, <strike>, <del>, <i>, <em>, <span>, <ul>, <ol>, <li>, <br>, <div>, and <a> (allowing "href" and "target" attributes with <a>).
Content generated via the Lucid Meetings UI may also contain media embeds, for which we permit <div> and <iframe> tags with a restricted set of attributes. This implementation is subject to change, and we do not currently recommend that you attempt to add embedded media beyond what has already been constructed within the Lucid Meetings UI.
Invalid markup is silently removed and/or corrected. Examples of HTML fields in the Lucid Meetings model include the description fields for Action Items and Notes.
Timestamps
Internally, the application stores all dates and times as Unix timestamps,
deferring conversion to the user's local timezone and language as a matter of the user interface. For programmer convenience,
we present timestamps as a tuple
containing both the Unix timestamp (value) and an ISO 8601 date/time represenation.
The ISO 8601 format is a bit more user friendly and is compatible with a variety of API client usage scenarios.
{ "create_ts": { "value": 1464124304, "iso_8601": "2016-05-24T21:11:44Z", "pretty": { "time": "5:11 PM", "date": "24 May 2016", "timezone": "New York" } } }
The API can use either format when processing dates and times, though internally we always convert the ISO 8601 values to
Unix timestamps via strtotime
(or equivalent). The strtotime() conversion also accepts
Relative Formats, such as "today",
"tomorrow", "next week", etc.
Tuples
Internally, the application uses integer
IDs throughout as either references or as tokens associated with
display values for named properties. All named properties are translatable and subject to change in the application
interfaces. For programmer convenience, we strive to include both the reference ID and a display value when presenting
coded fields.
{ "meeting_id": 1214, "room_id": { "value": 74, "display": "Engineering Team" }, "template_id": { "value": 192, "display": "Staff Meeting Template" }, "name": "Weekly staff meeting" }
When dealing with the field programmatically, we use the ID portion of the tuple. For example, role_id, member_id, organization_id. To reduce API round trips, we also provide the translated (if available) display value for the reference or field constant value. While this breaks with resource presentation simplicity, ready access to the display value has proved to be a useful tradeoff.
Field Filtering
#
All responses from the API can limit fields to only the fields you need.
Just pass in a fields
query parameter with a comma separated list of fields you need.
For example:
GET /lucid/api/v1/meetings?fields=meeting_id,name
Would have the following response body:
[ { "name": "Weekly staff meeting", "meeting_id": 1214 }, { "name": "Code review meeting", "meeting_id": 1212 } ]
Embedding
#Many endpoints support embedding related resources to minimize the number of required API round trips.
Embedding is triggered by passing in an embed query parameter, which takes a comma separated list of endpoint types.
GET /lucid/api/v1/rooms/74?fields=room_id,name&embed=managers
{ "room_id": 74, "name": "Engineering Team", "managers": [ { "room_member_id": 224, "member_id": { "value": 75, "display": "Sally Johnson" } }, { "room_member_id": 333, "member_id": { "value": 157, "display": "Carol Jones" } }, { "room_member_id": 142, "member_id": { "value": 1, "display": "Bob Smith" } }, { "room_member_id": 276, "member_id": { "value": 105, "display": "Jack Bronson" } } ] }
Only certain resource types can be embedded from certain endpoints. The endpoint documentation specifies which ones can be embedded.
Counting
#All endpoints that return a collection provide a count of the total number of results and result pages. The count will be returned in a header X-Total-Count.
GET /lucid/api/v1/meetings
200 OK X-Total-Count: 302 X-Total-Pages: 31 X-Page-Num: 0 X-Per-Page: 10 Link: <https://site.lucidmeetings.com/lucid/api/v1/meetings?per_page=10page=1&z=>; rel="next" [ ... results ... ]
Note that the count represents the total amount of available results, not the amount returned as part of the current response.
Enveloping
#If your HTTP client makes it difficult to read status codes or headers, we can package everything neatly into the response body. Just include envelope=true as a request parameter and the API will always return a 200 HTTP status code. The real status, headers and response will be within the body.
GET /lucid/api/v1/members/does-not-exist?envelope=true
200 OK { "status": 404, "headers": { "X-Rate-Limit-Limit": 200, "X-Rate-Limit-Remaining": 150, "X-Rate-Limit-Used": 0, "X-Rate-Limit-Reset": 25 }, "response": { "message": "Not Found" } }
Pagination
#
Requests for collections can return between 0 and 100 results, controlled using the per_page
and
page
query parameters. A request with a page
parameter greater than the maximum available
results in a response for the last page of the collection.
All end points are limited to 10 results by default. Responses from end points that return paginated results include
headers describing the number of results available:
X-Total-Count
: Total number of entities in the collection.X-Total-Pages
: Number of pages available (at current per-page setting).X-Page-Num
: Position of page of results, 0-indexed.X-Per-Page
: Number of entries per page.
In the example below, there are 21 pages of results at a setting of 15 per page. The page indexes are 0 through 20.
GET /lucid/api/v1/meetings?per_page=15&page=2
200 OK X-Total-Count: 302 X-Total-Pages: 21 X-Page-Num: 1 X-Per-Page: 15 Link: <https://site.lucidmeetings.com/lucid/api/v1/meetings?per_page=15&page=0&z=>; rel="prev", <https://site.lucidmeetings.com/lucid/api/v1/meetings?per_page=15&page=2&z=>; rel="next" [ ... results ... ]
Not all endpoints support pagination. If they do, it will be mentioned in their documentation.
Sorting
#
Some endpoints offer result sorting, triggered using the sort
query parameter.
The value of sort is a comma separated list of fields to sort by.
You can specify descending sort by prepending -
to a field.
Not all fields can be sorted on. The endpoint documentation will list supported sort options.
Unless otherwise specified in the endpoint documentation, the default sort for all endpoints is descending order of creation.
To get upcoming scheduled meetings, sorted in descending order of meeting date:
GET /lucid/api/v1/meetings?sort=-start_time
Transforms
#For applications that synchronize Lucid Meetings data with another system, it may be necessary to compare values that are formatted differently. The Transforms endpoints offer a means of determining how Lucid Meetings would transform or "clean up" data for some field types.