{"id":9166,"date":"2021-12-21T08:00:28","date_gmt":"2021-12-21T16:00:28","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/?p=9166"},"modified":"2021-12-20T07:37:28","modified_gmt":"2021-12-20T15:37:28","slug":"new-features-in-microsoft-graph-bookings-apis-provide-enhanced-booking-infrastructure","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/new-features-in-microsoft-graph-bookings-apis-provide-enhanced-booking-infrastructure\/","title":{"rendered":"New features in Microsoft Graph Bookings APIs provide enhanced booking infrastructure"},"content":{"rendered":"<p>The Microsoft Graph team is committed to providing booking infrastructure through the Bookings APIs so that customers can build robust customized solutions. We have been listening to customers and have received many requests for new features. Based on this feedback, we have launched some key new features such as SMS notifications, online meetings, group appointments and custom questions.<\/p>\n<h3>SMS notifications<\/h3>\n<p>SMS notifications have always been one of the major asks of customers across industries like healthcare, retail, and finance because reaching consumers is often more convenient through SMS notifications. \u00a0Recently, we went GA with a SMS notification feature in the United States and Canada. Today, we are excited to announce the addition of SMS notification support in the Bookings API. Currently, this feature is only available for customers in US and Canada on Bookings Calendars created in the NAM region. We will look to expand availability to other countries in the future.<\/p>\n<p>SMS notifications can be enabled for a bookingService and at a bookingAppointment level as well, with the bookingAppointment level setting taking precedence.<\/p>\n<table style=\"width: 76.435%;\">\n<tbody>\n<tr>\n<td style=\"width: 30.7153%;\" width=\"126\"><strong>Attribute<\/strong><\/td>\n<td style=\"width: 24.6711%;\" width=\"114\"><strong>Resource Type<\/strong><\/td>\n<td style=\"width: 90.3418%;\" width=\"384\"><strong>Description<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 30.7153%;\" width=\"126\"><strong>smsNotificationsEnabled<\/strong><\/td>\n<td style=\"width: 24.6711%;\" width=\"114\">bookingService<\/td>\n<td style=\"width: 90.3418%;\" width=\"384\">Indicates if SMS is enabled for the service<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 30.7153%;\" width=\"126\"><strong>smsNotificationsEnabled<\/strong><\/td>\n<td style=\"width: 24.6711%;\" width=\"114\">bookingAppointment<\/td>\n<td style=\"width: 90.3418%;\" width=\"384\">Indicates if SMS is enabled for the appointment<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3><\/h3>\n<h3>Online meetings<\/h3>\n<p>Support for online meetings was launched for our web and Team\u2019s apps. It has been one of the key features of Bookings and has seen tremendous growth over the last couple of years. Now, one can enable online meetings for a bookingService via APIs. For an appointment of such a service, a Team\u2019s meeting link will be auto generated. This link is part of the appointment resource type and can be accessed via APIs.<\/p>\n<table style=\"width: 75.4873%;\">\n<tbody>\n<tr>\n<td style=\"width: 30.7307%;\" width=\"126\"><strong>Attribute<\/strong><\/td>\n<td style=\"width: 24.8417%;\" width=\"114\"><strong>Resource Type<\/strong><\/td>\n<td style=\"width: 98.5906%;\" width=\"384\"><strong>Description<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 30.7307%;\" width=\"126\"><strong>isLocationOnline<\/strong><\/td>\n<td style=\"width: 24.8417%;\" width=\"114\">bookingService<\/td>\n<td style=\"width: 98.5906%;\" width=\"384\">Indicates if the meeting is online<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 30.7307%;\" width=\"126\"><strong>joinWebUrl<\/strong><\/td>\n<td style=\"width: 24.8417%;\" width=\"114\">bookingAppointment<\/td>\n<td style=\"width: 98.5906%;\" width=\"384\">The URL to join the online meeting<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<h3>Staff and customer time zones<\/h3>\n<p>The bookingAppointment resource type has an attribute for customer timezone and the bookingStaffMember resource type has an attribute for the staff timezone.<\/p>\n<table style=\"width: 75.92%;\">\n<tbody>\n<tr>\n<td style=\"width: 30.3701%;\" width=\"126\"><strong>Attribute<\/strong><\/td>\n<td style=\"width: 25.7768%;\" width=\"114\"><strong>Resource Type<\/strong><\/td>\n<td style=\"width: 96.5089%;\" width=\"384\"><strong>Description<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 30.3701%;\" width=\"126\"><strong>customerTimeZone<\/strong><\/td>\n<td style=\"width: 25.7768%;\" width=\"114\">bookingAppointment<\/td>\n<td style=\"width: 96.5089%;\" width=\"384\">Timezone of the customer for the appointment<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 30.3701%;\" width=\"126\"><strong>timeZone<\/strong><\/td>\n<td style=\"width: 25.7768%;\" width=\"114\">bookingStaffMember<\/td>\n<td style=\"width: 96.5089%;\" width=\"384\">Timezone of the staff member<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<h3>Enhanced bookingCustomer resource type<\/h3>\n<p>We have enhanced the resource type to bring it at par with our webapp in which one can add and view additional customer properties such as address and phone number. The following new attributes have been added.<\/p>\n<table style=\"width: 75.9208%;\">\n<tbody>\n<tr>\n<td style=\"width: 30.8614%;\" width=\"126\"><strong>Attribute<\/strong><\/td>\n<td style=\"width: 25.6608%;\" width=\"114\"><strong>Resource Type<\/strong><\/td>\n<td style=\"width: 99.3544%;\" width=\"384\"><strong>Description<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 30.8614%;\" width=\"126\"><strong>location<\/strong><\/td>\n<td style=\"width: 25.6608%;\" width=\"114\">bookingCustomer<\/td>\n<td style=\"width: 99.3544%;\" width=\"384\">The address of the customer. Location is of type physicalAddress. However only the \u201cother\u201d address type is supported.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 30.8614%;\" width=\"126\"><strong>phone<\/strong><\/td>\n<td style=\"width: 25.6608%;\" width=\"114\">bookingCustomer<\/td>\n<td style=\"width: 99.3544%;\" width=\"384\">The phone number of the customer<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<h3>Custom questions<\/h3>\n<p>Custom questions are one of the key features of Bookings. It can be used to collect additional information in an appointment.<\/p>\n<p>Custom questions are created for a \u2018bookingBusiness\u2019 resource type. They can be attached to bookingServices resource type of that bookingBusiness. Finally, a bookingAppointment of these bookingServices will contain the custom questions and answers to those question.<\/p>\n<p>CRUD operations can be done on custom questions via APIs.<\/p>\n<h4>Example of CRUD operations for custom questions<\/h4>\n<p><strong>Retrieve a custom question object<\/strong><\/p>\n<pre class=\"prettyprint\">GET https:\/\/graph.microsoft.com\/beta\/bookingBusinesses\/&lt;businessId&gt;\/customQuestions\/&lt;questionId&gt;\r\n\r\nHTTP\/1.1 200 OK\r\n{\r\n  \"id\": \"3bc6fde0-4ad3-445d-ab17-0fc15dba0774\",\r\n  \"displayName\": \"What is your age\",\r\n  \"answerInputType\": \"text\",\r\n  \"answerOptions\": []\r\n}<\/pre>\n<p><strong>List all custom questions in a business<\/strong><\/p>\n<pre class=\"prettyprint\">GET https:\/\/graph.microsoft.com\/beta\/bookingBusinesses\/&lt;businessId&gt;\/customQuestions\r\n\r\nHTTP\/1.1 200 OK\r\n[\r\n  {\r\n    \"id\": \"\",\r\n    \"displayName\": \"What\u2019s your faviourite color\",\r\n    \"answerInputType\": \"text\",\r\n    \"answerOptions\": []\r\n  },\r\n  {\r\n    \"id\": \"\",\r\n    \"displayName\": \"What do you want to get from this session?\",\r\n    \"answerInputType\": \"text\",\r\n    \"answerOptions\": []\r\n  }\r\n]<\/pre>\n<p class=\"prettyprint\"><strong>Create a custom question<\/strong><\/p>\n<pre class=\"prettyprint\">POST https:\/\/graph.microsoft.com\/beta\/bookingBusinesses\/&lt;businessId&gt;\/customQuestions\r\n{\r\n  \"displayName\": \"What is your age\",\r\n  \"answerInputType\": \"text\",\r\n  \"answerOptions\": []\r\n}\r\n\r\nHTTP\/1.1 201 Created\r\n{\r\n  \"id\": \"3bc6fde0-4ad3-445d-ab17-0fc15dba0774\",\r\n  \"displayName\": \"What is your age\",\r\n  \"answerInputType\": \"text\",\r\n  \"answerOptions\": []\r\n}<\/pre>\n<pre class=\"prettyprint\"><\/pre>\n<p><strong>Update a custom question<\/strong><\/p>\n<pre class=\"prettyprint\">PATCH https:\/\/graph.microsoft.com\/beta\/bookingBusinesses\/&lt;businessId&gt;\/customQuestions\/&lt;questionId&gt;\r\n{\r\n  \"displayName\": \"What is your date of Birth\"\r\n}\r\n\r\nHTTP\/1.1 204 No Content\r\n\r\nDELETE https:\/\/graph.microsoft.com\/beta\/bookingBusinesses\/&lt;businessId&gt;\/customQuestions\/&lt;questionId&gt;\r\n\r\nHTTP\/1.1 204 NO CONTENT<\/pre>\n<h3>Custom questions in a bookingService<\/h3>\n<p>One can associate any custom question in a bookingService. It can be done by using a complex type called custom questions. An example is shown below in which a service is being created with custom fields. The \u201cisRequired\u201d field indicates if it is mandatory to have a value for this custom field in an appointment.<\/p>\n<pre class=\"prettyprint\">POST https:\/\/graph.microsoft.com\/beta\/bookingBusinesses\/Contosolunchdelivery@M365B489948.onmicrosoft.com\/services\r\nContent-type: application\/json\r\n\r\n{\r\n    \"@odata.type\":\"#microsoft.graph.bookingService\",\r\n    ..\r\n    ..\r\n    ..\r\n    \r\n    \"customQuestions\": [\r\n        {\r\n            \"questionId\": \"75fc2eaf-624f-40b2-a289-63e51a56fcf2\",\r\n            \"isRequired\": true\r\n        },\r\n        {\r\n            \"questionId\": \"b90e7840-4c0c-430f-b96f-74ad9d2f64f7\",\r\n            \"isRequired\": false\r\n        }\r\n    ]\r\n}<\/pre>\n<h4>Custom questions in an appointment<\/h4>\n<p>Within a bookingAppointment, answers to custom questions can be added for an individual customer within a customer collection. Note that depending on the setting in the service some of the answers may be mandatory.<\/p>\n<p>Here, a snippet is shown where an appointment is being created with custom questions.<\/p>\n<pre class=\"prettyprint\">POST https:\/\/graph.microsoft.com\/beta\/bookingBusinesses\/Contosolunchdelivery@M365B489948.onmicrosoft.com\/appointments\r\nContent-type: application\/json\r\n\r\n{\r\n    \"@odata.type\":\"#microsoft.graph.bookingAppointment\",\r\n     ...\r\n     ...\r\n     ...\r\n    \"customers\": [\r\n        {\r\n            \"@odata.type\":\"#microsoft.graph.bookingCustomerInformation\",\r\n            \"customerName\":\"Jordan Miller\",\r\n           \r\n           ...\r\n           ...\r\n            \"customQuestionAnswers\": [\r\n                {\r\n                    \"questionId\": \"75fc2eaf-624f-40b2-a289-63e51a56fcf2\",\r\n                    \"answer\": \"Bread\",\r\n                    \"selectedOptions\": [\"Bread\"]\r\n                }\r\n            ],\r\n             ...\r\n             ...\r\n            }\r\n        }\r\n    ],\r\n    ...\r\n    ...\r\n    ...\r\n\r\n}<\/pre>\n<p>Here is another example where an appointment is being retrieved<\/p>\n<pre class=\"prettyprint\">GET https:\/\/graph.microsoft.com\/beta\/bookingBusinesses\/Contosolunchdelivery@M365B489948.onmicrosoft.com\/appointments\/AAMkADKnAAA=\r\n\r\nResponse\r\n\r\nHTTP\/1.1 200 OK\r\nContent-type: application\/json\r\n\r\n{\r\n    \"@odata.context\": \"https:\/\/graph.microsoft.com\/beta\/$metadata#bookingBusinesses('Contosolunchdelivery%40M365B489948.onmicrosoft.com')\/appointments\/$entity\",\r\n    \"id\": \"AAMkADKnAAA=\",\r\n    \"selfServiceAppointmentId\": \"00000000-0000-0000-0000-000000000000\",\r\n    ...\r\n    ...\r\n    \"customers\": [\r\n        {\r\n            \"customerId\": \"7ed53fa5-9ef2-4f2f-975b-27447440bc09\",\r\n            \"customerName\": \"Jordan Miller\",\r\n            ...\r\n            ...\r\n            \"customQuestionAnswers\": [\r\n                {\r\n                    \"questionId\": \"75fc2eaf-624f-40b2-a289-63e51a56fcf2\",\r\n                    \"question\": \"What's your favourite food\",\r\n                    \"answerInputType\": \"radioButton\",\r\n                    \"answerOptions\": [\r\n                        \"Banana Bread\",\r\n                        \"Apple Pie\",\r\n                        \"Cheese Cake\"\r\n                    ],\r\n                    \"isRequired\": true,\r\n                    \"answer\": \"Apple Pie\",\r\n                    \"selectedOptions\": [\"Apple Pie\"]\r\n                }\r\n            ],\r\n            ...\r\n            ...\r\n            }\r\n        }\r\n    ]\r\n}<\/pre>\n<pre class=\"prettyprint\"><\/pre>\n<h3>Attributes and complex types of custom questions<\/h3>\n<table style=\"width: 77.2796%;\">\n<tbody>\n<tr>\n<td style=\"width: 26.2774%;\" width=\"121\"><strong>Attribute<\/strong><\/td>\n<td style=\"width: 27.1533%;\" width=\"185\"><strong>Resource Type<\/strong><\/td>\n<td style=\"width: 101.727%;\" width=\"318\"><strong>Description<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 26.2774%;\" width=\"121\"><strong>Id<\/strong><\/td>\n<td style=\"width: 27.1533%;\" width=\"185\">bookingCustomQuestions<\/td>\n<td style=\"width: 101.727%;\" width=\"318\">The unique id<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 26.2774%;\" width=\"121\"><strong>displayName<\/strong><\/td>\n<td style=\"width: 27.1533%;\" width=\"185\">bookingCustomQuestions<\/td>\n<td style=\"width: 101.727%;\" width=\"318\">The display name for the custom question<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 26.2774%;\" width=\"121\"><strong>answerInputType<\/strong><\/td>\n<td style=\"width: 27.1533%;\" width=\"185\">bookingCustomQuestions<\/td>\n<td style=\"width: 101.727%;\" width=\"318\">The answer type. The data type is graph.answerInputType. Supported values are radio button and text.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 26.2774%;\" width=\"121\"><strong>answerOptions<\/strong><\/td>\n<td style=\"width: 27.1533%;\" width=\"185\">bookingCustomQuestions<\/td>\n<td style=\"width: 101.727%;\" width=\"318\">This field is applicable if the answer type is radio button. This is a collection of strings<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 26.2774%;\" width=\"121\"><strong>\u00a0<\/strong><\/td>\n<td style=\"width: 27.1533%;\" width=\"185\"><\/td>\n<td style=\"width: 101.727%;\" width=\"318\"><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 26.2774%;\" width=\"121\"><strong>customQuestions<\/strong><\/td>\n<td style=\"width: 27.1533%;\" width=\"185\">bookingService<\/td>\n<td style=\"width: 101.727%;\" width=\"318\">Collection of bookingQuestionAssignment for the service<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 26.2774%;\" width=\"121\"><strong>customQuestionAnswers<\/strong><\/td>\n<td style=\"width: 27.1533%;\" width=\"185\">bookingAppointment<\/td>\n<td style=\"width: 101.727%;\" width=\"318\">Collection of bookingQuestionAnswer. This collection is an attribute within a complex type bookingCustomerInformation, which itself is present in bookingAppointment.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<table style=\"width: 77.4941%;\" width=\"624\">\n<tbody>\n<tr>\n<td style=\"width: 25.0837%;\" width=\"121\"><strong>Attribute<\/strong><\/td>\n<td style=\"width: 27.7782%;\" width=\"183\"><strong>ComplexType<\/strong><\/td>\n<td style=\"width: 107.953%;\" width=\"320\"><strong>Description<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 25.0837%;\" width=\"121\"><strong>questionId<\/strong><\/td>\n<td style=\"width: 27.7782%;\" width=\"183\">bookingQuestionAssignment<\/p>\n<p>&nbsp;<\/td>\n<td style=\"width: 107.953%;\" width=\"320\">The id of the custom question which is being attached to the service.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 25.0837%;\" width=\"121\"><strong>isRequired<\/strong><\/td>\n<td style=\"width: 27.7782%;\" width=\"183\">bookingQuestionAssignment<\/td>\n<td style=\"width: 107.953%;\" width=\"320\">Indicates if the custom question answer is mandatory in the service<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 25.0837%;\" width=\"121\"><strong>questionId<\/strong><\/td>\n<td style=\"width: 27.7782%;\" width=\"183\">bookingQuestionAnswer<\/td>\n<td style=\"width: 107.953%;\" width=\"320\">The is of custom question<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 25.0837%;\" width=\"121\"><strong>question<\/strong><\/td>\n<td style=\"width: 27.7782%;\" width=\"183\">bookingQuestionAnswer<\/td>\n<td style=\"width: 107.953%;\" width=\"320\">The display name of the question when the appointment was created<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 25.0837%;\" width=\"121\"><strong>answerInputType<\/strong><\/td>\n<td style=\"width: 27.7782%;\" width=\"183\">bookingQuestionAnswer<\/td>\n<td style=\"width: 107.953%;\" width=\"320\">The answer Input type of the question at the time of creation of appointment<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 25.0837%;\" width=\"121\"><strong>answerOptions<\/strong><\/td>\n<td style=\"width: 27.7782%;\" width=\"183\">bookingQuestionAnswer<\/td>\n<td style=\"width: 107.953%;\" width=\"320\">The possible answer options of the question at the time of creation of an appointment<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 25.0837%;\" width=\"121\"><strong>isRequired<\/strong><\/td>\n<td style=\"width: 27.7782%;\" width=\"183\">bookingQuestionAnswer<\/td>\n<td style=\"width: 107.953%;\" width=\"320\">If the answer is mandatory. It reflects the value at the time of appointment creation<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 25.0837%;\" width=\"121\"><strong>answer<\/strong><\/td>\n<td style=\"width: 27.7782%;\" width=\"183\">bookingQuestionAnswer<\/td>\n<td style=\"width: 107.953%;\" width=\"320\">The answer for the question<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 25.0837%;\" width=\"121\"><strong>selectedOptions<\/strong><\/td>\n<td style=\"width: 27.7782%;\" width=\"183\">bookingQuestionAnswer<\/td>\n<td style=\"width: 107.953%;\" width=\"320\">The selected option for the question if the question was of non-text type<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<h3>Appointments with more than one customer (group appointments)<\/h3>\n<p>In the web app we support appointments in which more than one customer can attend. We call these appointments \u201cgroup appointments\u201d. One can set a service to support group appointments by increasing the count of attribute maximumAttendeesCount. In the bookingAppointment resource type, maximumAttendeesCount, indicates the maximum number of allowed attendees and is inherited from the same-named attribute in the bookingService resource type. The filledAttendeesCount attribute denotes the current number of customers in an appointment.<\/p>\n<table style=\"width: 77.0654%;\">\n<tbody>\n<tr>\n<td style=\"width: 26.2272%;\" width=\"126\"><strong>Attribute<\/strong><\/td>\n<td style=\"width: 26.9317%;\" width=\"114\"><strong>Resource Type<\/strong><\/td>\n<td style=\"width: 93.7263%;\" width=\"384\"><strong>Description<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 26.2272%;\" width=\"126\"><strong>maximumAttendeesCount<\/strong><\/td>\n<td style=\"width: 26.9317%;\" width=\"114\">bookingService<\/td>\n<td style=\"width: 93.7263%;\" width=\"384\">Max allowed number of customers in an appointment<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 26.2272%;\" width=\"126\"><strong>maximumAttendeesCount<\/strong><\/td>\n<td style=\"width: 26.9317%;\" width=\"114\">bookingAppointment<\/td>\n<td style=\"width: 93.7263%;\" width=\"384\">Max allowed number of customers in an appointment<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 26.2272%;\" width=\"126\"><strong>filledAttendeesCount<\/strong><\/td>\n<td style=\"width: 26.9317%;\" width=\"114\">bookingAppointment<\/td>\n<td style=\"width: 93.7263%;\" width=\"384\">Current number of customers in an appointment<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<h4>Changes in customer information in a bookingAppointment resource type<\/h4>\n<p>Customer information was available at the root level in the appointment object. Since a list of customers is now supported, the information will be within a complex type. Customer information for appointments in which maximumAttendeesCount is 1 will continue to also exist at the root level in beta- however it will be deprecated.<\/p>\n<p>The difference can be seen in the two code snippets below.<\/p>\n<p><strong>Old structure of bookingAppointment<\/strong><\/p>\n<pre class=\"prettyprint\">Content-type: application\/json\r\n\r\n{\r\n    \"@odata.context\": \"https:\/\/graph.microsoft.com\/beta\/$metadata#bookingBusinesses('Contosolunchdelivery%40M365B489948.onmicrosoft.com')\/appointments\/$entity\",\r\n    \"id\": \"AAMkADKnAAA=\",\r\n    \"selfServiceAppointmentId\": \"00000000-0000-0000-0000-000000000000\",\r\n    \"customerId\": \"7ed53fa5-9ef2-4f2f-975b-27447440bc09\",\r\n    \"customerName\": \"Jordan Miller\",\r\n    \"customerEmailAddress\": \"jordanm@contoso.com\",\r\n    \"customerPhone\": \"213-555-0199\",\r\n    \"customerNotes\": null,\r\n    \"serviceId\": \"57da6774-a087-4d69-b0e6-6fb82c339976\",\r\n    \"serviceName\": \"Catered bento\",\r\n  ...\r\n  ...     \r\n  ...\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>New structure of bookingAppointment<\/strong><\/p>\n<pre class=\"prettyprint\">Content-type: application\/json\r\n\r\n{\r\n    \"@odata.context\": \"https:\/\/graph.microsoft.com\/beta\/$metadata#bookingBusinesses('Contosolunchdelivery%40M365B489948.onmicrosoft.com')\/appointments\/$entity\",\r\n    \"id\": \"AAMkADKnAAA=\",\r\n    \"selfServiceAppointmentId\": \"00000000-0000-0000-0000-000000000000\",\r\n    ...\r\n    ...\r\n    ...\r\n   \r\n    \"customers\": [\r\n        {\r\n            \"customerId\": \"7ed53fa5-9ef2-4f2f-975b-27447440bc09\",\r\n            \"customerName\": \"Jordan Miller\",\r\n            \"customerEmailAddress\": \"jordanm@contoso.com\",\r\n            \"customerPhone\": \"213-555-0199\",\r\n            \"customerNotes\": \"notes\",\r\n            \"customQuestionAnswers\": [\r\n                {\r\n                    \"questionId\": \"75fc2eaf-624f-40b2-a289-63e51a56fcf2\",\r\n                    \"question\": \"What's your favourite food\",\r\n                    \"answerInputType\": \"radioButton\",\r\n                    \"answerOptions\": [\r\n                        \"KFC\",\r\n                        \"McDonald's\",\r\n                        \"BurgerKing\"\r\n                    ],\r\n                    \"isRequired\": true,\r\n                    \"answer\": \"KFC\",\r\n                    \"selectedOptions\": [\"KFC\"]\r\n                }\r\n            ],\r\n            \"customerLocation\": {\r\n                \"displayName\": \"home\",\r\n                \"locationEmailAddress\": null,\r\n                \"locationUri\": \"\",\r\n                \"locationType\": null,\r\n                \"uniqueId\": null,\r\n                \"uniqueIdType\": null,\r\n                \"address\": {\r\n                    \"type\": \"home\",\r\n                    \"postOfficeBox\": \"\",\r\n                    \"street\": \"\",\r\n                    \"city\": \"\",\r\n                    \"state\": \"\",\r\n                    \"countryOrRegion\": \"\",\r\n                    \"postalCode\": \"\"\r\n                },\r\n                \"coordinates\": {\r\n                    \"altitude\": null,\r\n                    \"latitude\": null,\r\n                    \"longitude\": null,\r\n                    \"accuracy\": null,\r\n                    \"altitudeAccuracy\": null\r\n                }\r\n            }\r\n        }\r\n    ]\r\n    ...\r\n    ...\r\n}<\/pre>\n<p><strong>\u00a0<\/strong><\/p>\n<h4><strong>The new complex type <\/strong><\/h4>\n<p>The complex type is called\u00a0bookingCustomerInformation. The \u201ccustomers\u201d attribute within appointment is a collection of this type.<\/p>\n<table style=\"width: 77.4216%;\">\n<tbody>\n<tr>\n<td style=\"width: 33.2273%;\" width=\"208\"><strong>Attribute<\/strong><\/td>\n<td style=\"width: 33.3863%;\" width=\"208\"><strong>Complex Type<\/strong><\/td>\n<td style=\"width: 94.4812%;\" width=\"208\"><strong>Description<\/strong><\/td>\n<\/tr>\n<tr>\n<td style=\"width: 33.2273%;\" width=\"208\"><strong>Id<\/strong><\/td>\n<td style=\"width: 33.3863%;\" width=\"208\">bookingCustomerInformation<\/td>\n<td style=\"width: 94.4812%;\" width=\"208\">The id of the customer<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 33.2273%;\" width=\"208\"><strong>name<\/strong><\/td>\n<td style=\"width: 33.3863%;\" width=\"208\">bookingCustomerInformation<\/td>\n<td style=\"width: 94.4812%;\" width=\"208\">The name of the customer<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 33.2273%;\" width=\"208\"><strong>emailAddress<\/strong><\/td>\n<td style=\"width: 33.3863%;\" width=\"208\">bookingCustomerInformation<\/td>\n<td style=\"width: 94.4812%;\" width=\"208\">The email address of the customer<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 33.2273%;\" width=\"208\"><strong>phone<\/strong><\/td>\n<td style=\"width: 33.3863%;\" width=\"208\">bookingCustomerInformation<\/td>\n<td style=\"width: 94.4812%;\" width=\"208\">The phone number of the customer<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 33.2273%;\" width=\"208\"><strong>notes<\/strong><\/td>\n<td style=\"width: 33.3863%;\" width=\"208\">bookingCustomerInformation<\/td>\n<td style=\"width: 94.4812%;\" width=\"208\">The notes of the customer<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 33.2273%;\" width=\"208\"><strong>location<\/strong><\/td>\n<td style=\"width: 33.3863%;\" width=\"208\">bookingCustomerInformation<\/td>\n<td style=\"width: 94.4812%;\" width=\"208\">The address of the customer. Location is of type physicalAddress. However only the \u201cother\u201d address type is supported.<\/td>\n<\/tr>\n<tr>\n<td style=\"width: 33.2273%;\" width=\"208\"><strong>timeZone<\/strong><\/td>\n<td style=\"width: 33.3863%;\" width=\"208\">bookingCustomerInformation<\/td>\n<td style=\"width: 94.4812%;\" width=\"208\">The timeZone of the customer<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>We hope that these new features will help your custom applications be more comprehensive and robust. Please give us feedback and keep reaching out to us with your use cases and requests. Check out this<a href=\"https:\/\/docs.microsoft.com\/en-us\/graph\/api\/resources\/booking-api-overview?view=graph-rest-1.0\"> link<\/a> to find resources that will help you get started.<\/p>\n<p>Stay tuned and keep following <a href=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\" target=\"_blank\" rel=\"noopener\">our blog<\/a> for updates on our APIs.<\/p>\n<p>Happy coding!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>We have launched some key new features to continue providing a booking infrastructure through the Bookings APIs so that customers can build robust customized solutions. <\/p>\n","protected":false},"author":69077,"featured_media":25159,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[3],"tags":[160],"class_list":["post-9166","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-microsoft-graph","tag-bookings-api"],"acf":[],"blog_post_summary":"<p>We have launched some key new features to continue providing a booking infrastructure through the Bookings APIs so that customers can build robust customized solutions. <\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-json\/wp\/v2\/posts\/9166","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-json\/wp\/v2\/users\/69077"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-json\/wp\/v2\/comments?post=9166"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-json\/wp\/v2\/posts\/9166\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-json\/wp\/v2\/media\/25159"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-json\/wp\/v2\/media?parent=9166"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-json\/wp\/v2\/categories?post=9166"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-json\/wp\/v2\/tags?post=9166"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}