Webhooks
With webhooks, you can have certain Teem platform data sent to a URL of your choosing. You can feed that raw data into other systems like reporting tools or facilities management platforms.
Available Webhooks
The following webhooks are available.
LobbyConnect Visitor webhooks:
- LobbyConnect Visitor Check-in: This will send a visitor payload whenever you have a successful visitor check-in on the LobbyConnect application.
- LobbyConnect Visitor Check-out: This will send a visitor payload whenever you have a successful visitor checkout on the LobbyConnect application. This will require that checkout is enabled for LobbyConnect.
EventBoard Event webhooks:
- EventBoard Event Created, Updated, or Deleted: Whenever an event is created, updated, or deleted this webhook will fire with a payload containing the calendar and room id the event belongs to.
- EventBoard Event Cancelled by User: This will send an event payload whenever a user selects Cancel Event on the check-in screen on an EventBoard room display. This will require that Cancellations are turned on. See more information on these settings here.
- EventBoard Event Cancelled by No Check-in: This will send an event payload whenever a meeting is canceled because no one checked in for the event using the EventBoard display. This will require that Event Check-in is turned on. See more information on these settings here.
- EventBoard Event Check-in: This will send an event payload whenever a meeting is successfully checked into. This will require that Event Check-in is turned on as well.
- Work Requests: This will send information regarding the work request once it is submitted from the EventBoard device. The following items are included in the payload: id, floor, building name, building id, room name, room id, campus name, campus id, organization name, organization id, description, timestamp, resource name, resource id
Set up Webhooks
The setup for any of these webhooks is the same. Let's set up the LobbyConnect Checkin as an example. Navigate to your Teem admin dashboard and select Apps & Integrations under Manage. From there, select 3rd Party Apps.
Look for the section labeled Webhooks. You will see a box named LobbyConnect Checkin. Click the yellow Activate button.
After activation, select Settings.
From here you can configure two things. First, enter the URL that Teem should call with the webhook. Second, enter an optional secret, which can be used to verify that we are the senders of the information. Once these fields are complete, select Save.
Payload Result and Headers
After that is done, Teem will send the appropriate payload to be consumed by your application. Below is the example of the visitor payload, or the event payload that will be sent with each webhook.
Note: The visitor payload is the same for both visitor webhooks, and the reservation payload is the same for all reservation webhooks.
The LobbyConnect visitor payload will have the following schema:
{ "no_contact_reason": null, "contacted": true, "contact_info": { "phone": "415-725-55555", "first_name": "John", "last_name": "Appleseed", "email": "john.appleseed@teem.com" }, "visitor": { "last_name": "G", "contacted": false, "photo": "https://teemapp.s3.amazonaws.com/media/contacts/3902/0b0d579b.jpg", "visitor_id": 146412, "updated_at": "1457063992", "contact_id": null, "pdf_filename": "2016-03-02 17:35:50.786373+00:00-K G-agreement.pdf", "id": 146412, "first_name": "K", "notification_description": "K G", "title": "", "contact_method": null, "company_id": 3902, "employer": "K", "signature_image": "https://eventboardapp.s3.amazonaws.com/media/lobbyconnect/signatures/3902/146412/5d2e53b9.jpg", "pk": 146412, "email": "zach@someexternalcompany.io", "version_id": 718, "phone": "4153495555", "visits": 10, "visit_type_id": 2560, "no_contact_reason": "", "created_at": "1456965340", "formatted_phone_number": "+4153495555", "flags": [ ], "fullname": "K G", "nda_id": 568, "phone_last_4": "5555" }, "created_at": "1457063992", "custom_values": { }, "visitor_id": 146412, "updated_at": "1457063992", "id": 187958, "contact_method": null, "notification_description": "K G", "type_id": 2560, "pk": 187958, "ioffice_user_id": null, "nda_id": 54274, "checkout": null, "checkin": "1457060343", "checkin_localized": "2016-03-03 13:59:03.211768-06:00", "device_id": 34489 }
The EventBoard Event Created Payload will have the following:
{ "calendar_id": 3524, "room_id": 4156 }
The EventBoard Event payload will have the following:
{ "end": 1466186400, "description": "Hi there, \n\nEnder Wiggins is inviting you to a scheduled Zoom meeting. \n\nJoin from PC, Mac, Linux, iOS or Android:...", "tentative": false, "title": "M.C. Dean / Teem Discussion", "all_day": false, "private": true, "start": 1466182800, "participants": [ { "status": "", "name": "ender@teem.com", "created_at": "2016-06-16T19:48:16.840535+00:00", "updated_at": "2016-06-17T13:55:50.987240+00:00", "id": 18502978365, "is_organizer": true, "role": "", "type": "", "email": "ender@teem.com" }, { "status": "", "name": "someone@theirdomain.com", "created_at": "2016-06-16T19:48:16.849607+00:00", "updated_at": "2016-06-17T13:55:50.996114+00:00", "id": 18502978366, "is_organizer": false, "role": "", "type": "", "email": "someone@theirdomain.com" } ], "visibility": "private", "organizer": { "status": "", "name": "", "created_at": "2016-06-17T13:55:50.953837+00:00", "updated_at": "2016-06-17T13:55:50.961515+00:00", "email": "squid@teem.com", "role": "", "type": "", "id": 19259941 }, "identifier": "692fua9264g38n13tm83s99hu4", "recurring": false, "id": 106844973, "location": "https://teem.zoom.us/j/8680254618" }
The Work Requests payload will have the following:
{ organization_id: 1, resource_name: "Apple TV", campus_id: 10414, description: "Tester2345", floor: "1st Floor", timestamp: "2017-01-19T15:39:00.636550+00:00", resource_id: 3, room_name: "Phil's Room", organization_name: "Blender & Labs, LLC", room_id: 55624, building_id: 10895, id: 6287, campus_name: "SLC", building_name: "HQ" }
Using that data, you can have your own application do anything that you want.
The next logical question is "How do I tell a check-in from a check-out?" We include a header in the request that you can refer to for that purpose. The header is X-EventBoard-Event, and the value follows the following table:
Webhook |
X-EventBoard-Event Header Data |
EventBoard Event Checkin |
event-checkin |
EventBoard Event Cancelled by no check-in |
event-cancellation-no-checkin |
EventBoard Event Cancelled by user |
event-cancellation-explicit |
LobbyConnect Checkin |
lobbyconnect-checkin |
LobbyConnect Checkout |
lobbyconnect-checkout |
In addition, if you have set the secret, we will also set an additional header on the HTTP post. X-EventBoard-Signature will contain a HMAC hex digest (MD5) of the checkin payload being sent and your secret. An example of that, done in Python, where the JSON payload is set at variable payload, would be the following:
>>> import hmac >>> h = hmac.new(str('This is your secret'), payload) >>> print h.hexdigest() d908efa0ed3ae8c000e4e52732bf1112
Using that, you can implement logic in your consuming application that verifies it is LobbyConnect/EventBoard that actually sent the payload.
Troubleshooting
I don't get any data when a checkin happens
Please make sure that your webhook URL is reachable. This should be a globally accessible URL, and use the X-EventBoard-Signature to verify that we are the sender.
I didn’t get the X-EventBoard-Signature header
First, check to make sure the secret is not blank. If it is, we don’t send the header. If you did provide a secret, double-check that it is exactly the same as the secret you are testing with. (Note: We are forcing that secret to be a string.) Also, are you using the entire JSON payload as the other part of that HMAC hex digest? Following that, you can try manually testing by creating a HMAC hex digest and making sure it is the same as what we send. Make sure you’re using MD5 as the hashing algorithm. If you're still having issues at this point, please reach out and we can rope our developers in on it.
When I go to configure the integration, I get a 404 error?
If this happens, it's a bug. Please let us know and we can help get that sorted right away.