The Google Calendar Connector Web Service relies on a feature in Google Calendar to allow external Free Busy information to be included in the meeting scheduler dialog. This requires a Google Apps domain to have this feature enabled and for the endpoint of the Google Calendar Connector Web Service to be configured. This document describes the protocol used when a request is issued by Google Calendar.
When the Google Calendar client needs free/busy information for a user whose calendar does not reside in Google Calendar, a POST request will be made to the URL configured for the domain.
POST /free-busy-endpoint HTTP/1.1 Host: example.org Content-type: application/x-www-form-urlencoded ... text=[<version>,<messageId>,[<emails>],<start>/<end>,<since>,<tz>]
where:
- <version>: Version # - currently 1
- <messageId>: ID for the request
- <emails>: comma separated list of emails to get free/busy info for
- <start>: Start of range to get free/busy info for (as YYYYMMDD)
- <end>: End of range to get free/busy info for (as YYYYMMDD)
- <since>: Return free/busy info modified since this time (as YYYYMMDDTHHMMSS)
- <tz>: Timezone for the request as an Olson Time zone
HTTP/1.1 200 OK Content-type: text/html ... <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> </head> <body> <form id="Form1" method="POST" action="<submitUrl>"> <input name="text" value="<freeBusyResponse>" /> </form> <script type="text/javascript"> document.getElementById('Form1').submit(); </script> </body> </html>
Where:
- <submitUrl>: URL for a Google Apps domain specific mailslot URL
- <freeBusyResponse>: A free/busy response JSON expression.
Note that the JSON must be valid. Specifically, use double quotes to denote strings, not single quotes.
[<version>,<messageId>, ["_ME_AddData", "<start>/<end>","<since>", [ "<user1>","<email>","<accessLevel>", // for each user [ ["<subject>","<start>","<end>","<location>","<organizer>",<status>] // for each appointment ], "<user2>","<email>","<accessLevel>", // for each user [ ["<subject>","<start>","<end>","<location>","<organizer>",<status>] // for each appointment ] ] ] ]
Where:
- <version>: Version # - currently 1
- <messageId>: ID from the request
- <start>: Start of range for free/busy request (as YYYYMMDD)
- <end>: End of range for free/busy request (as YYYMMDD)
- <since>: Since time from the request (as YYMMDDTHHMMSS)
- <userName>: Display name of the user the Free/Busy results are for
- <email>: Email address of the user the Free/Busy results are for
- <accessLevel>: Access level the user has (not currently used)
- <subject>: Subject of the event (if available)
- <start>: Start date time for the free busy block (as YYMMDDTHHMMSS)
- <end>: End date time for the free busy block (as YYMMDDTHHMMSS)
- <location>: Location of the event (if available)
- <organizer>: Organizer of the event
- <status>: Free/Busy status (number)