diff --git a/BookingNotification.java b/BookingNotification.java
new file mode 100644
index 0000000..3a4f523
--- /dev/null
+++ b/BookingNotification.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
+import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
+import com.google.api.client.http.HttpTransport;
+import com.google.api.client.json.JsonFactory;
+import com.google.api.client.json.jackson2.JacksonFactory;
+import com.google.api.services.mapsbooking.v1alpha.GoogleMapsBookingAPI;
+import com.google.api.services.mapsbooking.v1alpha.model.Booking;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Collections;
+
+/**
+ * Java client example using the Booking Notification API to notify Google of changes to an existing
+ * booking
+ */
+public class BookingNotification {
+
+  private static final String MAPS_BOOKING_SCOPE = "https://www.googleapis.com/auth/mapsbooking";
+
+  private static HttpTransport httpTransport;
+
+  private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
+
+  private static GoogleMapsBookingAPI googleMapsBookingAPI;
+
+  // TODO(partner): step1. put your partner_id here
+  private static final String PARTNER_ID = "{your partner_id}";
+
+  public static void main(String[] args) {
+    try {
+      try {
+        // get Credential through your Service Account
+        // TODO(partner): step2. put the path&file of your private key (JSON format) that you
+        // obtained from your service account into 'FileInputStream'
+        GoogleCredential credential =
+            GoogleCredential.fromStream(new FileInputStream("src/your-private-key.json"))
+                .createScoped(Collections.singleton(MAPS_BOOKING_SCOPE));
+
+        // get the service object to make requests to the API service
+        httpTransport = GoogleNetHttpTransport.newTrustedTransport();
+
+        // TODO(partner): step3. put your application name into 'setApplicationName'
+        googleMapsBookingAPI =
+            new GoogleMapsBookingAPI.Builder(httpTransport, JSON_FACTORY, credential)
+                .setApplicationName("PartnerBookingNotificationExample")
+                .build();
+
+        // TODO(partner): step5. call the methods you implement below to make
+        // booking changes notificatons
+        updateBooking();
+      } catch (IOException e) {
+        System.err.println(e.getMessage());
+      }
+    } catch (Throwable t) {
+      t.printStackTrace();
+    }
+    System.exit(1);
+  }
+
+  // TODO(partner): step4. implement this method with your data to make the updateBooking call
+  public static void updateBooking() throws IOException {
+    // example -> cancel a booking:
+    Booking updatedBooking = new Booking()
+        .setName("partners/" + PARTNER_ID + "/bookings/" + "{your booking id}")
+        .setMerchantId("{your merchant Id}")
+        .setServiceId("{your service Id}")
+        .setStatus("CANCELED")
+        .setStartTime("2018-01-02T10:00:00Z")
+        .setDuration("3600s")
+        .setClientInformation(...);
+
+    Booking testUpdatedBooking = updateBooking(updatedBooking, "status");
+
+    System.out.println("updated booking:");
+    System.out.println(testUpdatedBooking);
+  }
+
+  /**
+   * Updates an existing Booking.
+   *
+   * @param content The booking object contains the updated booking content. @Param updateMask The
+   *     specific fields to update for the booking.
+   * @return the updated instance of Booking.
+   */
+  private static Booking updateBooking(Booking content, String updateMask) throws IOException {
+
+    String name = content.getName();
+
+    return googleMapsBookingAPI
+        .notification()
+        .partners()
+        .bookings()
+        .patch(name, content)
+        .setUpdateMask(updateMask)
+        .execute();
+  }
+}
diff --git a/InventoryUpdate.java b/InventoryUpdate.java
new file mode 100644
index 0000000..42bd954
--- /dev/null
+++ b/InventoryUpdate.java
@@ -0,0 +1,479 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
+import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
+import com.google.api.client.http.HttpTransport;
+import com.google.api.client.json.JsonFactory;
+import com.google.api.client.json.jackson2.JacksonFactory;
+import com.google.api.services.mapsbooking.v1alpha.GoogleMapsBookingAPI;
+import com.google.api.services.mapsbooking.v1alpha.model.BatchReplaceServiceAvailabilityRequest;
+import com.google.api.services.mapsbooking.v1alpha.model.BatchReplaceServiceAvailabilityResponse;
+import com.google.api.services.mapsbooking.v1alpha.model.Empty;
+import com.google.api.services.mapsbooking.v1alpha.model.ExtendedServiceAvailability;
+import com.google.api.services.mapsbooking.v1alpha.model.Merchant;
+import com.google.api.services.mapsbooking.v1alpha.model.ReplaceServiceAvailabilityRequest;
+import com.google.api.services.mapsbooking.v1alpha.model.Service;
+import com.google.api.services.mapsbooking.v1alpha.model.ServiceAvailability;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Java client example using the Inventory Update API to provide real-time updates for invenotry
+ * changes
+ */
+public class InventoryUpdate {
+
+  private static final String MAPS_BOOKING_SCOPE = "https://www.googleapis.com/auth/mapsbooking";
+
+  private static HttpTransport httpTransport;
+
+  private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
+
+  private static GoogleMapsBookingAPI googleMapsBookingAPI;
+
+  // TODO(partner): step1. put your partner_id here
+  private static final String PARTNER_ID = "{your partner_id}";
+
+  public static void main(String[] args) {
+    try {
+      try {
+        // get Credential via your Service Account
+
+        // TODO(partner): step2. put the path&file of your private key (JSON format) that you
+        // obtained from your service account into 'FileInputStream'
+        GoogleCredential credential =
+            GoogleCredential.fromStream(new FileInputStream("src/your-private-key.json"))
+                .createScoped(Collections.singleton(MAPS_BOOKING_SCOPE));
+
+        // get the service object to make requests to the API service
+        httpTransport = GoogleNetHttpTransport.newTrustedTransport();
+
+        // TODO(partner): step3. put your application name into 'setApplicationName'
+        googleMapsBookingAPI =
+            new GoogleMapsBookingAPI.Builder(httpTransport, JSON_FACTORY, credential)
+                .setApplicationName("PartnerInventoryUpdateExample")
+                .build();
+
+        // TODO(partner): step12. call the methods you implement below to make inventory updates
+
+        createMerchant();
+        createService();
+
+        updateMerchant();
+        updateService();
+
+        updateAvailability();
+        batchUpdateAvailability();
+
+        deleteService();
+        deleteMerchant();
+
+      } catch (IOException e) {
+        System.err.println(e.getMessage());
+      }
+    } catch (Throwable t) {
+      t.printStackTrace();
+    }
+    System.exit(1);
+  }
+
+  // TODO(partner): step4. implement this method with your data to make the createMerchant call
+  public static void createMerchant() throws IOException {
+    // for example
+    PostalAddress postalAddress = new PostalAddress()
+        .setAddressCountry("US")
+        .setAddressLocality("WA")
+        .setAddressRegion("Kirkland")
+        .setPostalCode("98XXX")
+        .setStreetAddress("1111 11th Ave NE");
+
+    GeoCoordinates geo = new GeoCoordinates()
+        .setLatitude(47.67)
+        .setLongitude(-122.21)
+        .setAddress(postalAddress);
+
+    TaxRate taxRate = new TaxRate().setMicroPercent(0);
+
+    String merchantId = "sampleMerchant1";
+
+    Merchant merchant = new Merchant()
+        .setName("partners/" + PARTNER_ID + "/merchants/" + merchantId)
+        .setMerchantName("Test Create Merchant")
+        .setTelephone("206-888-8888")
+        .setUrl("www.****.com")
+        .setGeo(geo)
+        .setCategory("Fitness")
+        .setNumBookings30d((long)1000.00)
+        .setTaxRate(taxRate);
+
+    Merchant CreatedMerchant = createMerchant(merchant);
+
+    System.out.println("created merchant:");
+    System.out.println(CreatedMerchant);
+  }
+
+  // TODO(partner): step5. implement this method with your data to make the updateMerchant call
+  public static void updateMerchant() throws IOException {
+    // for example
+    PostalAddress postalAddress = new PostalAddress()
+        .setAddressCountry("US")
+        .setAddressLocality("WA")
+        .setAddressRegion("Kirkland")
+        .setPostalCode("98XXX")
+        .setStreetAddress("1111 11th Ave NE");
+
+    GeoCoordinates geo = new GeoCoordinates()
+        .setLatitude(47.67)
+        .setLongitude(-122.21)
+        .setAddress(postalAddress);
+
+    TaxRate taxRate = new TaxRate().setMicroPercent(0);
+
+    String merchantId = "sampleMerchant1";
+
+    Merchant merchantUpdate = new Merchant()
+        .setName("partners/" + PARTNER_ID + "/merchants/" + merchantId)
+        .setMerchantName("Test Update Merchant")
+        .setTelephone("206-666-6666")
+        .setUrl("www.****.com")
+        .setGeo(geo)
+        .setCategory("Fitness")
+        .setNumBookings30d((long)1000.00)
+        .setTaxRate(taxRate);
+
+    Merchant updatedMerchant =
+        updateMerchant(merchantUpdate, "merchantName,telephone");
+
+    System.out.println("updated merchant:");
+    System.out.println(updatedMerchant);
+  }
+
+  // TODO(partner): step6. implement this method with your data to make the deleteMerchant call
+  public static void deleteMerchant() throws IOException {
+    // for example
+    String merchantId = "sampleMerchant1";
+
+    Empty deletedMerchant = deleteMerchant(merchantId);
+
+    System.out.println("deleted merchant:");
+    System.out.println(deletedMerchant);
+  }
+
+  // TODO(partner): step7. implement this method with your data to make the createService call
+  public static void createService() throws IOException {
+    //for example
+    String merchantId = "sampleMerchant1";
+    String serviceId = "sampleService1";
+    Service service = new Service()
+        .setName("partners/" + PARTNER_ID + "/merchants/" + merchantId + "/services/" + serviceId)
+        .setServiceName("Yoga 101")
+        .setDescription("The entry-level Yoga course");
+
+    Service CreatedService = createService(service);
+
+    System.out.println("created service:");
+    System.out.println(CreatedService);
+  }
+
+  // TODO(partner): step8. implement this method with your data to make the updateService call
+  public static void updateService() throws IOException {
+    //for example
+    String merchantId = "sampleMerchant1";
+    String serviceId = "sampleService1";
+    Service service = new Service()
+        .setName("partners/" + PARTNER_ID + "/merchants/" + merchantId + "/services/" + serviceId)
+        .setServiceName("Yoga 201")
+        .setDescription("The mid-level Yoga course");
+
+    Service updatedService = updateService(service, "");
+
+    System.out.println("updated service:");
+    System.out.println(updatedService);
+  }
+
+  // TODO(partner): step9. implement this method with your data to make the deleteService call
+  public static void deleteService() throws IOException {
+    // for example
+    String merchantId = "sampleMerchant1";
+    String serviceId = "sampleService1";
+
+    Empty deletedService = deleteService(merchantId, serviceId);
+
+    System.out.println("deleted service:");
+    System.out.println(deletedService);
+  }
+
+  // TODO(partner): step10. implement this method with your data to make the
+  // replaceServiceAvailability call
+  public static void updateAvailability() throws IOException {
+    // for example
+    String merchantId = "sampleMerchant1";
+    String serviceId = "sampleService1";
+
+    Availability availability1 = new Availability()
+        .setStartTime("2018-01-02T09:00:00Z")
+        .setDuration("3600s")
+        .setSpotsTotal((long) 30)
+        .setSpotsOpen((long) 20);
+
+    Availability availability2 = new Availability()
+        .setStartTime("2018-01-02T13:00:00Z")
+        .setDuration("3600s")
+        .setSpotsTotal((long) 30)
+        .setSpotsOpen((long) 25);
+
+    List<Availability> availabilities1 = new ArrayList<Availability>();
+
+    availabilities1.add(availability1);
+    availabilities1.add(availability2);
+
+    ServiceAvailability serviceAvailability = new ServiceAvailability()
+        .setName("partners/" + PARTNER_ID + "/merchants/" + merchantId + "/services/" + serviceId)
+        .setAvailability(availabilities1)
+        .setStartTimeRestrict("2018-01-02T00:00:00Z")
+        .setEndTimeRestrict("2018-01-02T23:30:00Z");
+
+    ServiceAvailability updatedAvailability = replaceServiceAvailability(serviceAvailability);
+
+    System.out.println("updated availability:");
+    System.out.println(updatedAvailability);
+  }
+
+  // TODO(partner): step11. implement this method with your data to make the
+  // batchReplaceServiceAvailability call
+  public static void batchUpdateAvailability() throws IOException {
+    // for example
+    String merchantId1 = "sampleMerchant1";
+    String merchantId2 = "sampleMerchant2";
+    String serviceId1 = "sampleService1";
+    String serviceId2 = "sampleService2";
+
+    List<Availability> availabilities1 = // {your first batch of availabilities};
+    List<Availability> availabilities2 = // {your second batch of availabilities};
+
+    ExtendedServiceAvailability extendedServiceAvailability1 = new ExtendedServiceAvailability()
+        .setMerchantId(merchantId1)
+        .setServiceId(serviceId1)
+        .setAvailability(availabilities1)
+        .setStartTimeRestrict("2018-01-02T00:00:00Z")
+        .setEndTimeRestrict("2018-01-03T23:30:00Z");
+
+    ExtendedServiceAvailability extendedServiceAvailability2 = new ExtendedServiceAvailability()
+        .setMerchantId(merchantId2)
+        .setServiceId(serviceId2)
+        .setAvailability(availabilities2)
+        .setStartTimeRestrict("2018-01-02T00:00:00Z");
+
+    List<ExtendedServiceAvailability> extendedServiceAvailabilities =
+        new ArrayList<ExtendedServiceAvailability>();
+    extendedServiceAvailabilities.add(extendedServiceAvailability1);
+    extendedServiceAvailabilities.add(extendedServiceAvailability2);
+
+    BatchReplaceServiceAvailabilityResponse batchUpdatedAvailability =
+        batchReplaceServiceAvailability(extendedServiceAvailabilities);
+
+    System.out.println("batch updated availabilities:");
+    System.out.println(batchUpdatedAvailability);
+  }
+
+  /**
+   * Creates a new Merchant managed by the specified partner, and returns it.
+   *
+   * @param content The merchant object to create.
+   * @return the newly created instance of Merchant.
+   */
+  private static Merchant createMerchant(Merchant content) throws IOException {
+
+    String merchantId = content.getName().split("/")[3];
+
+    String parent = "partners/" + PARTNER_ID;
+
+    return googleMapsBookingAPI
+        .inventory()
+        .partners()
+        .merchants()
+        .create(parent, content)
+        .setMerchantId(merchantId)
+        .execute();
+  }
+
+  /**
+   * Deletes an existing Merchant managed by the specified partner. All the merchant's services and
+   * availability will be disabled.
+   *
+   * @param merchantId The merchant_id of the merchant to delete.
+   * @return the empty object.
+   */
+  private static Empty deleteMerchant(String merchantId) throws IOException {
+
+    String name = "partners/" + PARTNER_ID + "/merchants/" + merchantId;
+
+    return googleMapsBookingAPI.inventory().partners().merchants().delete(name).execute();
+  }
+
+  /**
+   * Updates an existing Merchant managed by the specified partner, and returns it.
+   *
+   * @param content The merchant object contains the updated merchant content. @Param updateMask The
+   *     specific fields to update for the merchant.
+   * @return the updated instance of Merchant.
+   */
+  private static Merchant updateMerchant(Merchant content, String updateMask) throws IOException {
+
+    String name = content.getName();
+
+    return googleMapsBookingAPI
+        .inventory()
+        .partners()
+        .merchants()
+        .patch(name, content)
+        .setUpdateMask(updateMask)
+        .execute();
+  }
+
+  /**
+   * Creates a new Service of a merchant managed by the specified partner, and returns it.
+   *
+   * @param content The service object to create.
+   * @return the newly created instance of Service.
+   */
+  private static Service createService(Service content) throws IOException {
+
+    String[] name = content.getName().split("/");
+    String merchantId = name[3];
+    String serviceId = name[5];
+    String parent = "partners/" + PARTNER_ID + "/merchants/" + merchantId;
+
+    return googleMapsBookingAPI
+        .inventory()
+        .partners()
+        .merchants()
+        .services()
+        .create(parent, content)
+        .setServiceId(serviceId)
+        .execute();
+  }
+
+  /**
+   * Deletes an existing Service of a merchant managed by the specified partner. All the service's
+   * availablity will be disabled.
+   *
+   * @param merchantId The merchant_id of the merchant who provides the to be deleted service.
+   * @param serviceId The service_id of the service to delete.
+   * @return the empty object.
+   */
+  private static Empty deleteService(String merchantId, String serviceId) throws IOException {
+
+    String name = "partners/" + PARTNER_ID + "/merchants/" + merchantId + "/services/" + serviceId;
+
+    return googleMapsBookingAPI
+        .inventory()
+        .partners()
+        .merchants()
+        .services()
+        .delete(name)
+        .execute();
+  }
+
+  /**
+   * Updates an existing Service of a merchant managed by the specified partner, and returns it.
+   *
+   * @param content The service object contains the updated service content. @Param updateMask The
+   *     specific fields to update for the service.
+   * @return the updated instance of Service.
+   */
+  private static Service updateService(Service content, String updateMask) throws IOException {
+
+    String name = content.getName();
+
+    return googleMapsBookingAPI
+        .inventory()
+        .partners()
+        .merchants()
+        .services()
+        .patch(name, content)
+        .setUpdateMask(updateMask)
+        .execute();
+  }
+
+  /**
+   * Replaces the Availability of an existing Service of a merchant managed by the specified
+   * partner, and returns it.
+   *
+   * @param serviceAvailability The service availability that is used to replace the existing ones.
+   * @return the successfully updated ServiceAvailability.
+   */
+  private static ServiceAvailability replaceServiceAvailability(
+      ServiceAvailability serviceAvailability) throws IOException {
+
+    String name = serviceAvailability.getName();
+
+    ReplaceServiceAvailabilityRequest replaceServiceAvailabilityRequest =
+        new ReplaceServiceAvailabilityRequest().setServiceAvailability(serviceAvailability);
+
+    return googleMapsBookingAPI
+        .inventory()
+        .partners()
+        .merchants()
+        .services()
+        .availability()
+        .replace(name, replaceServiceAvailabilityRequest)
+        .execute();
+  }
+
+  /**
+   * Replaces the Availability of existing Services. This batch call does not guarantee atomicity.
+   * Only successfully updated availability slots will be returned.
+   *
+   * @param extendedServiceAvailabilities The list of extended service availability that is used to
+   *     replace the existing availability slots.
+   * @return response containing successfully updated availability slots.
+   */
+  private static BatchReplaceServiceAvailabilityResponse batchReplaceServiceAvailability(
+      List<ExtendedServiceAvailability> extendedServiceAvailabilities) throws IOException {
+
+    String parent = "partners/" + PARTNER_ID;
+
+    BatchReplaceServiceAvailabilityRequest batchReplaceServiceAvailabilityRequest =
+        new BatchReplaceServiceAvailabilityRequest()
+            .setExtendedServiceAvailability(extendedServiceAvailabilities);
+
+    return googleMapsBookingAPI
+        .inventory()
+        .partners()
+        .availability()
+        .replace(parent, batchReplaceServiceAvailabilityRequest)
+        .execute();
+  }
+}
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..904003c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,57 @@
+# Java client example for real-time updates using RESTful calls
+
+### Prerequisite:
+
+Have your service account created, download your private key.
+
+### Get started:
+
+1.  Download the [Java client
+    library](https://dl.google.com/mapsbooking/apiclients/v1alpha/mapsbooking_java_public.zip)
+    , unzip the file to get the 'mapsbooking' package.
+
+2.  Create a java project in your IDE, download the sample codes
+    (InventoryUpdate.java & BookingNotification.java), import them into your
+    java project under src directory.
+
+3.  Make a copy of your private key (JSON file) to the src directory.
+
+4.  Add the Java Client Library to the dependencies of your project
+
+5.  In both java files, follow the TODOs to complete your implementations
+
+More detail about the REST API can be found
+[here.](https://developers.google.com/maps-booking/reference/maps-booking-api/rest/)
+
+### Troubleshooting:
+
+1.  Create a merchant/service with existing merchantId/serviceId, your will get
+    following error message: 409 Conflict { "code" : 409, "errors" : \[ {
+    "domain" : "global", "message" : "Requested entity already exists",
+    "reason" : "alreadyExists", "debugInfo" : "detail: \"\[ORIGINAL ERROR\]
+    generic::already_exists: ..."\n" } \], "message" : "Requested entity already
+    exists", "status" : "ALREADY_EXISTS" }
+
+2.  Update/Delete with wrong merchantId/serviceId (update with wrong bookingId),
+    your will get following error message: 404 Not Found { "code" : 404,
+    "errors" : \[ { "domain" : "global", "message" : "Requested entity was not
+    found.", "reason" : "notFound", "debugInfo" : "detail: \"\[ORIGINAL ERROR\]
+    spanner::Row not found:...\"\n" } \], "message" : "Requested entity was not
+    found.", "status" : "NOT_FOUND" }
+
+3.  In all update functions, the parameter 'updateMask' must be in
+    [FieldMask](https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#fieldmask)
+    format to specify the fields to update. The API is required to only change
+    the values of the fields as specified in the mask and leave the others
+    untouched. If you pass the wrong updateMask string, the update will not take
+    effect. If a field mask is not present on update, the operation applies to
+    all fields (as if a field mask of all fields has been specified). So if you
+    want to update all fields, just set the updateMask empty.
+
+4.  Since an Availability Slot is not associated with a merchant_id/service_id,
+    if you make the replace availability calls with invalid
+    merchant_id/service_id, you will be able to make the REST call without any
+    issue, but your request will not be served in the production due to the
+    invalid merchant_id/service_id.
+
+5.  Any field that has a zero value is not shown in the response.
