{
  "resources": {
    "invalidation": {
      "resources": {
        "partners": {
          "methods": {
            "invalidateResource": {
              "path": "v1alpha/invalidation/{+resourceId}:invalidateResource",
              "request": {
                "$ref": "InvalidateResourceRequest"
              },
              "description": "Invalidates an existing resource. A request is ignored if the requested resource is not subscribed to Google service. Supported resource types: - Pickup",
              "response": {
                "$ref": "Empty"
              },
              "id": "mapsbooking.invalidation.partners.invalidateResource",
              "httpMethod": "POST",
              "flatPath": "v1alpha/invalidation/partners/{partnersId}:invalidateResource",
              "parameters": {
                "resourceId": {
                  "required": true,
                  "description": "The name of the resource to be invalidated. For example, for a Pickup resource, name should have the format of `partners/{partner_id}/pickups/{pickup_id}`. Implementations MUST remove cached versions of the identified resource.",
                  "pattern": "^partners/.*$",
                  "location": "path",
                  "type": "string"
                }
              },
              "parameterOrder": [
                "resourceId"
              ]
            }
          }
        }
      }
    },
    "partners": {
      "resources": {
        "adsAccountLinks": {
          "methods": {
            "create": {
              "response": {
                "$ref": "AdsAccountLink"
              },
              "parameterOrder": [
                "parent"
              ],
              "parameters": {
                "adsAccountLinkId": {
                  "location": "query",
                  "description": "Required. The ID to use for the Ads Account Link. This is same as Google Ads Customer Id. For details see https://support.google.com/google-ads/answer/1704344 Format : xxx-xxx-xxxx.",
                  "type": "string"
                },
                "parent": {
                  "description": "Required. The parent resource where this Ads account link will be created. This is same as the Partner Center account id. Format: partners/{partner}",
                  "required": true,
                  "pattern": "^partners/[^/]+$",
                  "location": "path",
                  "type": "string"
                }
              },
              "flatPath": "v1alpha/partners/{partnersId}/adsAccountLinks",
              "id": "mapsbooking.partners.adsAccountLinks.create",
              "httpMethod": "POST",
              "path": "v1alpha/{+parent}/adsAccountLinks",
              "request": {
                "$ref": "AdsAccountLink"
              },
              "description": "Creates Ads account link. This will initiate link between the Google Ads account and Partner Center. The link will be in the `Pending` state until it is approved from the Ads portal."
            },
            "get": {
              "response": {
                "$ref": "AdsAccountLink"
              },
              "path": "v1alpha/{+name}",
              "id": "mapsbooking.partners.adsAccountLinks.get",
              "httpMethod": "GET",
              "flatPath": "v1alpha/partners/{partnersId}/adsAccountLinks/{adsAccountLinksId}",
              "parameters": {
                "name": {
                  "description": "Required. The name of the Ads account link to retrieve. Format: `partners/{partner}/adsAccountLinks/{ads_account_link}`",
                  "required": true,
                  "pattern": "^partners/[^/]+/adsAccountLinks/[^/]+$",
                  "location": "path",
                  "type": "string"
                }
              },
              "parameterOrder": [
                "name"
              ],
              "description": "Gets Ads account link."
            },
            "delete": {
              "path": "v1alpha/{+name}",
              "response": {
                "$ref": "Empty"
              },
              "parameters": {
                "name": {
                  "type": "string",
                  "pattern": "^partners/[^/]+/adsAccountLinks/[^/]+$",
                  "location": "path",
                  "description": "Required. The name of the AdsAccountLink to delete. Format: partners/{partner}/adsAccountLinks/{ads_account_link}",
                  "required": true
                }
              },
              "parameterOrder": [
                "name"
              ],
              "description": "Deletes Ads account link. This will unlink the Google Ads account and the Partner Center account.",
              "id": "mapsbooking.partners.adsAccountLinks.delete",
              "httpMethod": "DELETE",
              "flatPath": "v1alpha/partners/{partnersId}/adsAccountLinks/{adsAccountLinksId}"
            },
            "patch": {
              "request": {
                "$ref": "AdsAccountLink"
              },
              "description": "Updates Ads account link with inventory items. This will update the Ads account link with the provided inventory items.",
              "path": "v1alpha/{+name}",
              "flatPath": "v1alpha/partners/{partnersId}/adsAccountLinks/{adsAccountLinksId}",
              "id": "mapsbooking.partners.adsAccountLinks.patch",
              "httpMethod": "PATCH",
              "parameterOrder": [
                "name"
              ],
              "parameters": {
                "name": {
                  "description": "Identifier. Resource name of the AdsAccountLink. Format: `partners/{partner}/adsAccountLinks/{ads_account_link}`",
                  "required": true,
                  "pattern": "^partners/[^/]+/adsAccountLinks/[^/]+$",
                  "location": "path",
                  "type": "string"
                },
                "updateMask": {
                  "location": "query",
                  "description": "Optional. The list of fields to update.",
                  "format": "google-fieldmask",
                  "type": "string"
                }
              },
              "response": {
                "$ref": "AdsAccountLink"
              }
            }
          }
        }
      }
    },
    "notification": {
      "resources": {
        "partners": {
          "resources": {
            "bookings": {
              "methods": {
                "patch": {
                  "response": {
                    "$ref": "Booking"
                  },
                  "parameters": {
                    "bookingFailure.rejectedCardType": {
                      "location": "query",
                      "type": "string",
                      "description": "(required only if cause is PAYMENT_ERROR_CARD_TYPE_REJECTED)",
                      "enum": [
                        "CREDIT_CARD_TYPE_UNSPECIFIED",
                        "VISA",
                        "MASTERCARD",
                        "AMERICAN_EXPRESS",
                        "DISCOVER",
                        "JCB"
                      ],
                      "enumDescriptions": [
                        "Unused.",
                        "A Visa credit card.",
                        "A Mastercard credit card.",
                        "An American Express credit card.",
                        "A Discover credit card.",
                        "A JCB credit card."
                      ]
                    },
                    "bookingFailure.paymentFailure.threeds1Parameters.mdMerchantData": {
                      "type": "string",
                      "location": "query",
                      "description": "Merchant data. To be posted to the ACSUrl form if supplied."
                    },
                    "updateMask": {
                      "format": "google-fieldmask",
                      "type": "string",
                      "location": "query",
                      "description": "Field mask of all booking fields to be updated"
                    },
                    "name": {
                      "description": "Resource name of the booking: `partners/{partner ID}/bookings/{booking ID}`",
                      "required": true,
                      "type": "string",
                      "pattern": "^partners/[^/]+/bookings/[^/]+$",
                      "location": "path"
                    },
                    "bookingFailure.description": {
                      "location": "query",
                      "description": "This optional field is used for the partner to include additional information for debugging purpose only. (optional)",
                      "type": "string"
                    },
                    "bookingFailure.cause": {
                      "type": "string",
                      "location": "query",
                      "enumDescriptions": [
                        "Represents the default value. Don't use; amounts to an \"unknown error\".",
                        "Indicates the referenced availability slot is not available any longer.",
                        "Indicates the user has already booked an appointment for the referenced availability slot.",
                        "Indicates the lease (if provided) has expired and cannot be used any longer to complete the requested booking.",
                        "Indicates the requested cancellation cannot be performed at the current time due to time restrictions in the merchant's cancellation policy.",
                        "Indicates an error was encountered while processing the payment because the provided credit card type was not accepted by the merchant. The credit card type must be supplied in rejected_card_type.",
                        "Indicates an error was encountered while processing the payment because the provided credit card was declined.",
                        "Indicates an error was encountered with the pack/membership used to pay for the booking. There could be no valid uses left, it could have expired, etc.",
                        "Indicates an error was encountered while processing the payment for this booking. Use this value to indicate a general payment related error, only if the error does not match to a specific payment error above.",
                        "Indicates the user cannot use the given payment option (e.g. user trying to use a first time price for the second time).",
                        "Indicates a booking that the user tried to cancel has already been cancelled.",
                        "Indicates a booking that the user tried to cancel is not cancellable.",
                        "Indicates the user has an existing reservation too close to this time.",
                        "Indicates booking failed due to the user being over the aggregator's per-user bookings limit.",
                        "Indicates payment is rejected because you are requesting that the transaction be tried again, but this time after undergoing 3DS1 challenge/response. Note that the current transaction's failure state will stay failed. The retry will be completely separate. When this is the failure reason, payment_failure.3DS1_parameters MUST be set. If it is not, then the current cause will be treated as if it were PAYMENT_ERROR.",
                        "Indicates the provided name contains unsupported characters (e.g., non-local alphabets).",
                        "Indicates the provided phone number is not supported (e.g., foreign numbers).",
                        "Indicates the user is banned from the partner's platform."
                      ],
                      "description": "Required. The reason why the booking failed. (required)",
                      "enum": [
                        "CAUSE_UNSPECIFIED",
                        "SLOT_UNAVAILABLE",
                        "SLOT_ALREADY_BOOKED_BY_USER",
                        "LEASE_EXPIRED",
                        "OUTSIDE_CANCELLATION_WINDOW",
                        "PAYMENT_ERROR_CARD_TYPE_REJECTED",
                        "PAYMENT_ERROR_CARD_DECLINED",
                        "PAYMENT_OPTION_NOT_VALID",
                        "PAYMENT_ERROR",
                        "USER_CANNOT_USE_PAYMENT_OPTION",
                        "BOOKING_ALREADY_CANCELLED",
                        "BOOKING_NOT_CANCELLABLE",
                        "OVERLAPPING_RESERVATION",
                        "USER_OVER_BOOKING_LIMIT",
                        "PAYMENT_REQUIRES_3DS1",
                        "UNSUPPORTED_NAME",
                        "UNSUPPORTED_PHONE_NUMBER",
                        "BANNED_USER"
                      ]
                    },
                    "bookingFailure.paymentFailure.threeds1Parameters.paReq": {
                      "type": "string",
                      "location": "query",
                      "description": "A PaymentAuthentication Request. To be posted to the ACSUrl form if supplied."
                    },
                    "bookingFailure.paymentFailure.threeds1Parameters.acsUrl": {
                      "description": "The URL from which to load a form to present to the User for authentication.",
                      "location": "query",
                      "type": "string"
                    },
                    "bookingFailure.paymentFailure.threeds1Parameters.transactionId": {
                      "type": "string",
                      "description": "An identifier used by the ACS provider. To be posted to the ACSUrl form if supplied.",
                      "location": "query"
                    }
                  },
                  "parameterOrder": [
                    "name"
                  ],
                  "id": "mapsbooking.notification.partners.bookings.patch",
                  "httpMethod": "PATCH",
                  "flatPath": "v1alpha/notification/partners/{partnersId}/bookings/{bookingsId}",
                  "path": "v1alpha/notification/{+name}",
                  "request": {
                    "$ref": "Booking"
                  },
                  "description": "Updates an existing Booking."
                }
              }
            },
            "orders": {
              "methods": {
                "patch": {
                  "path": "v1alpha/notification/{+name}",
                  "request": {
                    "$ref": "Order"
                  },
                  "description": "Updates an existing Order.",
                  "response": {
                    "$ref": "Order"
                  },
                  "parameters": {
                    "name": {
                      "pattern": "^partners/[^/]+/orders/[^/]+$",
                      "location": "path",
                      "type": "string",
                      "required": true,
                      "description": "Resource name of the order: `partners/{partner ID}/orders/{order ID}`"
                    },
                    "updateMask": {
                      "location": "query",
                      "description": "Field mask of all order fields to be updated",
                      "format": "google-fieldmask",
                      "type": "string"
                    }
                  },
                  "parameterOrder": [
                    "name"
                  ],
                  "id": "mapsbooking.notification.partners.orders.patch",
                  "httpMethod": "PATCH",
                  "flatPath": "v1alpha/notification/partners/{partnersId}/orders/{ordersId}"
                }
              }
            }
          }
        }
      }
    },
    "inventory": {
      "resources": {
        "partners": {
          "resources": {
            "availability": {
              "methods": {
                "replace": {
                  "parameters": {
                    "parent": {
                      "type": "string",
                      "pattern": "^partners/[^/]+$",
                      "location": "path",
                      "description": "Format of `partners/{partner_id}`.",
                      "required": true
                    }
                  },
                  "parameterOrder": [
                    "parent"
                  ],
                  "id": "mapsbooking.inventory.partners.availability.replace",
                  "httpMethod": "POST",
                  "flatPath": "v1alpha/inventory/partners/{partnersId}/availability:replace",
                  "response": {
                    "$ref": "BatchReplaceServiceAvailabilityResponse"
                  },
                  "request": {
                    "$ref": "BatchReplaceServiceAvailabilityRequest"
                  },
                  "description": "Replaces the Availability of existing Services. This batch call does not guarantee atomicity. Only successfully updated availability slots will be returned.",
                  "path": "v1alpha/inventory/{+parent}/availability:replace"
                }
              }
            },
            "feeds": {
              "resources": {
                "record": {
                  "methods": {
                    "batchPush": {
                      "parameterOrder": [
                        "parent"
                      ],
                      "parameters": {
                        "parent": {
                          "required": true,
                          "description": "Resource name, which has the format of - `partners/{partner_id}/feeds/{feed_name}`.",
                          "pattern": "^partners/[^/]+/feeds/[^/]+$",
                          "location": "path",
                          "type": "string"
                        }
                      },
                      "flatPath": "v1alpha/inventory/partners/{partnersId}/feeds/{feedsId}/record:batchPush",
                      "id": "mapsbooking.inventory.partners.feeds.record.batchPush",
                      "httpMethod": "POST",
                      "response": {
                        "$ref": "Empty"
                      },
                      "request": {
                        "$ref": "BatchPushGenericRecordRequest"
                      },
                      "description": "Inserts and/or updates records of specified feed type. Only performs basic validation (like malformed request) after which an appropriate response is returned to the partner immediately. Google performs business logic validation on the request asynchronously. This batch call does not guarantee atomicity.",
                      "path": "v1alpha/inventory/{+parent}/record:batchPush"
                    },
                    "batchDelete": {
                      "response": {
                        "$ref": "Empty"
                      },
                      "flatPath": "v1alpha/inventory/partners/{partnersId}/feeds/{feedsId}/record:batchDelete",
                      "id": "mapsbooking.inventory.partners.feeds.record.batchDelete",
                      "httpMethod": "POST",
                      "parameterOrder": [
                        "parent"
                      ],
                      "parameters": {
                        "parent": {
                          "description": "Resource name, which has the format of - `partners/{partner_id}/feeds/{feed_name}`.",
                          "required": true,
                          "pattern": "^partners/[^/]+/feeds/[^/]+$",
                          "location": "path",
                          "type": "string"
                        }
                      },
                      "path": "v1alpha/inventory/{+parent}/record:batchDelete",
                      "request": {
                        "$ref": "BatchDeleteGenericRecordsRequest"
                      },
                      "description": "Deletes records of specified feed type. Only performs basic validation (like malformed request) after which an appropriate response is returned to the partner immediately. Google performs business logic validation on the request asynchronously. This batch call does not guarantee atomicity."
                    }
                  }
                },
                "status": {
                  "methods": {
                    "list": {
                      "id": "mapsbooking.inventory.partners.feeds.status.list",
                      "httpMethod": "GET",
                      "flatPath": "v1alpha/inventory/partners/{partnersId}/feeds/{feedsId}/status",
                      "parameters": {
                        "name": {
                          "required": true,
                          "description": "The feed resource name, which has the format of - `partners/{partner_id}/feeds/merchants` - `partners/{partner_id}/feeds/services` - `partners/{partner_id}/feeds/availability`",
                          "pattern": "^partners/[^/]+/feeds/[^/]+$",
                          "location": "path",
                          "type": "string"
                        },
                        "pageSize": {
                          "type": "integer",
                          "format": "int32",
                          "description": "The maximum number of items to return.",
                          "location": "query"
                        },
                        "pageToken": {
                          "location": "query",
                          "description": "The next_page_token value returned from a previous List request, if any.",
                          "type": "string"
                        },
                        "stateRestrict": {
                          "description": "Optional restrict to filter results by feed state.",
                          "enum": [
                            "STATE_UNSPECIFIED",
                            "IN_PROGRESS",
                            "SUCCESS",
                            "FAILURE"
                          ],
                          "enumDescriptions": [
                            "Default value. Unused.",
                            "The feed is still being processed.",
                            "The feed has been successfully processed.",
                            "We encountered an error while processing the feed."
                          ],
                          "type": "string",
                          "location": "query"
                        },
                        "timeRangeRestrict.startTime": {
                          "format": "google-datetime",
                          "type": "string",
                          "location": "query",
                          "description": "The lower bound of the time range."
                        },
                        "timeRangeRestrict.endTime": {
                          "format": "google-datetime",
                          "type": "string",
                          "location": "query",
                          "description": "The upper bound of the time range."
                        }
                      },
                      "parameterOrder": [
                        "name"
                      ],
                      "description": "Retrieves the Status of multiple previously uploaded merchant, service, or availability feeds by the specified aggregator, and returns them.",
                      "response": {
                        "$ref": "ListStatusResponse"
                      },
                      "path": "v1alpha/inventory/{+name}/status"
                    }
                  }
                }
              },
              "methods": {
                "getStatus": {
                  "parameters": {
                    "name": {
                      "pattern": "^partners/[^/]+/feeds/[^/]+/[^/]+$",
                      "location": "path",
                      "type": "string",
                      "description": "The feed resource name, which has the format of - `partners/{partner_id}/feeds/merchants/{file_name}` - `partners/{partner_id}/feeds/services/{file_name}` - `partners/{partner_id}/feeds/availability/{file_name}`",
                      "required": true
                    }
                  },
                  "parameterOrder": [
                    "name"
                  ],
                  "description": "Retrieves the Status of a previously uploaded feed by the specified aggregator, and returns it.",
                  "id": "mapsbooking.inventory.partners.feeds.getStatus",
                  "httpMethod": "GET",
                  "flatPath": "v1alpha/inventory/partners/{partnersId}/feeds/{feedsId}/{feedsId1}/status",
                  "path": "v1alpha/inventory/{+name}/status",
                  "response": {
                    "$ref": "FeedStatus"
                  }
                }
              }
            },
            "merchants": {
              "resources": {
                "status": {
                  "methods": {
                    "list": {
                      "path": "v1alpha/inventory/{+parent}/status",
                      "response": {
                        "$ref": "ListMerchantStatusesResponse"
                      },
                      "parameters": {
                        "waitlistInventoryStatusRestrict": {
                          "enumDescriptions": [
                            "Not specified.",
                            "Merchant doesn't have service supporting waitlist.",
                            "Merchant has service supporting waitlist."
                          ],
                          "description": "Optional. Optional restriction to filter results by waitlist inventory status.",
                          "enum": [
                            "WAITLIST_INVENTORY_STATUS_UNSPECIFIED",
                            "NO_VALID_WAITLIST_SERVICE",
                            "HAS_VALID_WAITLIST_SERVICE"
                          ],
                          "type": "string",
                          "location": "query"
                        },
                        "pageToken": {
                          "location": "query",
                          "description": "Optional. The nextPageToken value returned from a previous ListMerchantStatusResponse, if any.",
                          "type": "string"
                        },
                        "parent": {
                          "pattern": "^partners/[^/]+/merchants$",
                          "location": "path",
                          "type": "string",
                          "required": true,
                          "description": "Required. The parent, which owns this collection of merchant status. Format: `partners/{partner_id}/merchants`"
                        },
                        "geoMatchRestrict": {
                          "enumDescriptions": [
                            "Not specified.",
                            "Merchant is not geo matched.",
                            "Merchant is geo matched."
                          ],
                          "description": "Optional. Optional restriction to filter results by Geo matching status.",
                          "enum": [
                            "GEO_MATCHING_STATUS_UNSPECIFIED",
                            "GEO_UNMATCHED",
                            "GEO_MATCHED"
                          ],
                          "type": "string",
                          "location": "query"
                        },
                        "pageSize": {
                          "description": "Required. The maximum number of items to return. Note that the server may reduce the page size.",
                          "location": "query",
                          "type": "integer",
                          "format": "int32"
                        },
                        "bookingInventoryStatusRestrict": {
                          "location": "query",
                          "type": "string",
                          "enumDescriptions": [
                            "Not specified.",
                            "Merchant doesn't have booking inventory in the next 30 day.",
                            "Merchant has booking inventory in the next 30 day."
                          ],
                          "description": "Optional. Optional restriction to filter results by booking inventory status.",
                          "enum": [
                            "BOOKING_INVENTORY_STATUS_UNSPECIFIED",
                            "NO_VALID_FUTURE_INVENTORY",
                            "HAS_VALID_FUTURE_INVENTORY"
                          ]
                        }
                      },
                      "parameterOrder": [
                        "parent"
                      ],
                      "description": "List all MerchantStatus of a partner that satisfy the filter conditions.",
                      "id": "mapsbooking.inventory.partners.merchants.status.list",
                      "httpMethod": "GET",
                      "flatPath": "v1alpha/inventory/partners/{partnersId}/merchants/status"
                    }
                  }
                },
                "services": {
                  "methods": {
                    "delete": {
                      "path": "v1alpha/inventory/{+name}",
                      "response": {
                        "$ref": "Empty"
                      },
                      "parameters": {
                        "name": {
                          "required": true,
                          "description": "The resource name of the service to delete. In the format of `partners/{partner_id}/merchants/{merchant_id}/services/{service_id}`",
                          "type": "string",
                          "pattern": "^partners/[^/]+/merchants/[^/]+/services/[^/]+$",
                          "location": "path"
                        }
                      },
                      "parameterOrder": [
                        "name"
                      ],
                      "description": "Deletes an existing Service of a merchant managed by the specified aggregator. All the service's availability will be deleted, too.",
                      "id": "mapsbooking.inventory.partners.merchants.services.delete",
                      "httpMethod": "DELETE",
                      "flatPath": "v1alpha/inventory/partners/{partnersId}/merchants/{merchantsId}/services/{servicesId}"
                    },
                    "patch": {
                      "request": {
                        "$ref": "Service"
                      },
                      "description": "Updates an existing Service of a merchant managed by the specified aggregator, and returns it.",
                      "path": "v1alpha/inventory/{+name}",
                      "id": "mapsbooking.inventory.partners.merchants.services.patch",
                      "httpMethod": "PATCH",
                      "flatPath": "v1alpha/inventory/partners/{partnersId}/merchants/{merchantsId}/services/{servicesId}",
                      "parameters": {
                        "name": {
                          "required": true,
                          "description": "The service resource name, which has the format of `partners/{partner_id}/merchants/{merchant_id}/services/{service_id}`.",
                          "pattern": "^partners/[^/]+/merchants/[^/]+/services/[^/]+$",
                          "location": "path",
                          "type": "string"
                        },
                        "updateMask": {
                          "location": "query",
                          "description": "The specific fields to update for the service.",
                          "format": "google-fieldmask",
                          "type": "string"
                        }
                      },
                      "parameterOrder": [
                        "name"
                      ],
                      "response": {
                        "$ref": "Service"
                      }
                    },
                    "create": {
                      "request": {
                        "$ref": "Service"
                      },
                      "description": "Creates a new Service of a merchant managed by the specified aggregator, and returns it.",
                      "path": "v1alpha/inventory/{+parent}/services",
                      "parameterOrder": [
                        "parent"
                      ],
                      "parameters": {
                        "parent": {
                          "required": true,
                          "description": "The parent resource name for the merchant who owns this service, in the format of `partners/{partner_id}/merchants/{merchant_id}`.",
                          "type": "string",
                          "pattern": "^partners/[^/]+/merchants/[^/]+$",
                          "location": "path"
                        },
                        "serviceId": {
                          "type": "string",
                          "description": "The service id to use for this service.",
                          "location": "query"
                        }
                      },
                      "flatPath": "v1alpha/inventory/partners/{partnersId}/merchants/{merchantsId}/services",
                      "id": "mapsbooking.inventory.partners.merchants.services.create",
                      "httpMethod": "POST",
                      "response": {
                        "$ref": "Service"
                      }
                    }
                  },
                  "resources": {
                    "availability": {
                      "methods": {
                        "replace": {
                          "request": {
                            "$ref": "ReplaceServiceAvailabilityRequest"
                          },
                          "description": "Replaces the Availability of an existing Service of a merchant managed by the specified aggregator, and returns it.",
                          "path": "v1alpha/inventory/{+name}/availability:replace",
                          "id": "mapsbooking.inventory.partners.merchants.services.availability.replace",
                          "httpMethod": "POST",
                          "flatPath": "v1alpha/inventory/partners/{partnersId}/merchants/{merchantsId}/services/{servicesId}/availability:replace",
                          "parameters": {
                            "name": {
                              "description": "The resource name of the service to apply this to. In the format of `partners/{partner_id}/merchants/{merchant_id}/services/{service_id}`",
                              "required": true,
                              "type": "string",
                              "pattern": "^partners/[^/]+/merchants/[^/]+/services/[^/]+$",
                              "location": "path"
                            }
                          },
                          "parameterOrder": [
                            "name"
                          ],
                          "response": {
                            "$ref": "ServiceAvailability"
                          }
                        }
                      }
                    }
                  }
                }
              },
              "methods": {
                "delete": {
                  "path": "v1alpha/inventory/{+name}",
                  "response": {
                    "$ref": "Empty"
                  },
                  "parameters": {
                    "name": {
                      "required": true,
                      "description": "The resource name of the merchant to delete. In the format of partners/{partner_id}/merchants/{merchant_id}",
                      "pattern": "^partners/[^/]+/merchants/[^/]+$",
                      "location": "path",
                      "type": "string"
                    }
                  },
                  "parameterOrder": [
                    "name"
                  ],
                  "description": "Deletes an existing Merchant managed by the specified aggregator. All the merchant's services and availability will be disabled, too. If you re-add the merchant later, the same set of services and availability slots will appear.",
                  "id": "mapsbooking.inventory.partners.merchants.delete",
                  "httpMethod": "DELETE",
                  "flatPath": "v1alpha/inventory/partners/{partnersId}/merchants/{merchantsId}"
                },
                "getStatus": {
                  "path": "v1alpha/inventory/{+name}",
                  "response": {
                    "$ref": "MerchantStatus"
                  },
                  "parameterOrder": [
                    "name"
                  ],
                  "description": "Get the MerchantStatus of a Merchant.",
                  "parameters": {
                    "name": {
                      "description": "Required. Resource name, in the format of partners/{partner_id}/merchants/{merchant_id}/status.",
                      "required": true,
                      "type": "string",
                      "pattern": "^partners/[^/]+/merchants/[^/]+/status$",
                      "location": "path"
                    }
                  },
                  "flatPath": "v1alpha/inventory/partners/{partnersId}/merchants/{merchantsId}/status",
                  "id": "mapsbooking.inventory.partners.merchants.getStatus",
                  "httpMethod": "GET"
                },
                "patch": {
                  "path": "v1alpha/inventory/{+name}",
                  "request": {
                    "$ref": "Merchant"
                  },
                  "description": "Updates an existing Merchant managed by the specified aggregator, and returns it.",
                  "response": {
                    "$ref": "Merchant"
                  },
                  "parameterOrder": [
                    "name"
                  ],
                  "parameters": {
                    "name": {
                      "description": "The merchant resource name, which has the format of `partners/{partner_id}/merchants/{merchant_id}`.",
                      "required": true,
                      "type": "string",
                      "pattern": "^partners/[^/]+/merchants/[^/]+$",
                      "location": "path"
                    },
                    "updateMask": {
                      "description": "The specific fields to update for the merchant.",
                      "location": "query",
                      "type": "string",
                      "format": "google-fieldmask"
                    }
                  },
                  "flatPath": "v1alpha/inventory/partners/{partnersId}/merchants/{merchantsId}",
                  "id": "mapsbooking.inventory.partners.merchants.patch",
                  "httpMethod": "PATCH"
                },
                "create": {
                  "parameters": {
                    "parent": {
                      "type": "string",
                      "pattern": "^partners/[^/]+$",
                      "location": "path",
                      "required": true,
                      "description": "The parent resource name for the partner who owns this merchant, in the format of `partners/{partner_id}`."
                    },
                    "merchantId": {
                      "description": "The merchant id to use for this merchant.",
                      "location": "query",
                      "type": "string"
                    }
                  },
                  "parameterOrder": [
                    "parent"
                  ],
                  "id": "mapsbooking.inventory.partners.merchants.create",
                  "httpMethod": "POST",
                  "flatPath": "v1alpha/inventory/partners/{partnersId}/merchants",
                  "response": {
                    "$ref": "Merchant"
                  },
                  "request": {
                    "$ref": "Merchant"
                  },
                  "description": "Creates a new Merchant managed by the specified aggregator, and returns it.",
                  "path": "v1alpha/inventory/{+parent}/merchants"
                }
              }
            }
          }
        }
      }
    }
  },
  "ownerDomain": "google.com",
  "mtlsRootUrl": "https://mapsbooking.mtls.googleapis.com/",
  "name": "mapsbooking",
  "ownerName": "Google",
  "batchPath": "batch",
  "canonicalName": "Google Maps Booking API",
  "version_module": true,
  "discoveryVersion": "v1",
  "baseUrl": "https://mapsbooking.googleapis.com/",
  "revision": "20260427",
  "title": "Google Maps Booking API",
  "kind": "discovery#restDescription",
  "schemas": {
    "AdvanceOrderDetails": {
      "type": "object",
      "id": "AdvanceOrderDetails",
      "properties": {
        "isSupported": {
          "description": "True if Advance Orders, also known as Order Ahead, is supported. (required)",
          "type": "boolean"
        }
      },
      "description": "For order ahead support."
    },
    "RefundCondition": {
      "description": "Defines a single refund condition. Multiple refund conditions could be used together to describe \"refund steps\" as various durations before the service start time.",
      "type": "object",
      "id": "RefundCondition",
      "properties": {
        "minDurationBeforeStartTime": {
          "description": "Duration before the start time, until when the customer can receive a refund for part of the service's cost specified in `refund_percent`. When set to 0 (default), the service can be cancelled at any time.",
          "format": "google-duration",
          "type": "string"
        },
        "refundPercent": {
          "description": "The percent that can be refunded, as long as the service booking is cancelled at least `min_duration_before_start_time` before the service start time, in the range of [0, 100]. When set to 0 (default), the service is not refundable. When set to 100 this service is fully refundable.",
          "type": "integer",
          "format": "uint32"
        }
      }
    },
    "Location": {
      "description": "Geographic information about a location.",
      "id": "Location",
      "properties": {
        "name": {
          "description": "The location's name, telephone, url and geo are used to support matching the location with places already present on Google Maps. This field is optional, but may be required in some contexts. For example, a Service.location without a name will not be matched to a business entity, even if they are located at the same address. (optional)",
          "type": "string"
        },
        "url": {
          "description": "The url of the location's public website. (optional)",
          "type": "string"
        },
        "geo": {
          "$ref": "GeoCoordinates",
          "description": "The Geo info of the location, including latitude, longitude, and address. (optional)"
        },
        "placeId": {
          "description": "The Place ID for a place in the Google Places database and on Google Maps. See https://developers.google.com/places/web-service/place-id for more about Place IDs. If this is provided, Google will match the location to this place.",
          "type": "string"
        },
        "telephone": {
          "description": "The public telephone number of the location including its country and area codes, e.g. +14567891234. (optional)",
          "type": "string"
        },
        "locationType": {
          "type": "string",
          "enumDescriptions": [
            "Location type unspecified.",
            "The location where this service visits.",
            "The location where this service starts, also serves as MEETING_LOCATION.",
            "The location where this service ends."
          ],
          "description": "The type of the location, must be supplied if this location is provided for a Service.",
          "enum": [
            "LOCATION_TYPE_UNSPECIFIED",
            "VISITED_LOCATION",
            "START_LOCATION",
            "END_LOCATION"
          ]
        },
        "locationId": {
          "description": "Unique reference of the location within the service. This id can be used to refer to this location in other service fields. E.g. in the custom intake form, a set of location ids can be used to specify pick up location options. If set, this id should be unique within the same service. (optional)",
          "type": "string"
        }
      },
      "type": "object"
    },
    "WaitlistStatus": {
      "description": "Status related to waitlist integration.",
      "id": "WaitlistStatus",
      "properties": {
        "hasValidWaitlistService": {
          "description": "True if the merchant has waitlist service. Doesn't guarantee the merchant is actually served.",
          "type": "boolean"
        }
      },
      "type": "object"
    },
    "LinkoutTemplate": {
      "description": "A template specifying how Google should generate URLs to a partner's site.",
      "id": "LinkoutTemplate",
      "properties": {
        "uriTemplate": {
          "description": "The uri template must follow the RFC 6570, see https://datatracker.ietf.org/doc/html/rfc6570. Supports Level 1 templates and all Level 4 composite templates. e.g. http://example.com/book/{foo}?b={bar} * foo = 2 * bar = abc https://example.com/book/2?b=abc",
          "type": "string"
        }
      },
      "type": "object"
    },
    "FeedStatistics": {
      "id": "FeedStatistics",
      "properties": {
        "newItems": {
          "description": "Newly added items by this feed. Items can be merchants, services or availability slots, depending on the type of the feed.",
          "type": "string",
          "format": "int64"
        },
        "deletedItems": {
          "description": "Items no longer present in this feed, and that were removed as a result.",
          "format": "int64",
          "type": "string"
        },
        "existingItems": {
          "description": "Existing items, updated as needed from newer information from the feed.",
          "type": "string",
          "format": "int64"
        }
      },
      "type": "object",
      "description": "Statistics obtained while processing an uploaded feed."
    },
    "UnsupportedPartySizeOption": {
      "description": "Options for parties that are out of range.",
      "type": "object",
      "id": "UnsupportedPartySizeOption",
      "properties": {
        "callMerchant": {
          "$ref": "CallMerchant",
          "description": "Party sizes that are out of range can call the business. A predefined message will be displayed to the user. Sample text to be displayed: \"For parties larger than {waitlist_rules.max_party_size} please call the restaurant at {phone}.\" CallMerchant must be set, but will be empty."
        }
      }
    },
    "MaddenIngestionOfferFoodOfferRestrictions": {
      "description": "[START food_offer_restrictions_definition]",
      "id": "MaddenIngestionOfferFoodOfferRestrictions",
      "properties": {
        "mealTypes": {
          "type": "array",
          "description": "The meal types the offer can be applied to, such as lunch or dinner. If unset, the offer can be applied to all meal types.",
          "items": {
            "type": "string",
            "enumDescriptions": [
              "The UNSPECIFIED or default enum value should not be used in feeds.",
              "",
              "",
              ""
            ],
            "enum": [
              "MEAL_TYPE_UNSPECIFIED",
              "MEAL_TYPE_BREAKFAST",
              "MEAL_TYPE_LUNCH",
              "MEAL_TYPE_DINNER"
            ]
          }
        },
        "restrictedToCertainCourses": {
          "description": "Whether the offer can only be applied to certain courses.",
          "type": "boolean"
        }
      },
      "type": "object"
    },
    "FulfillmentOption": {
      "description": "The fulfillment option for an order online action link.",
      "id": "FulfillmentOption",
      "properties": {
        "fulfillmentType": {
          "enumDescriptions": [
            "The fulfillment type is unspecified.",
            "The fulfillment type is delivery.",
            "The fulfillment type is pickup."
          ],
          "description": "Required. The fulfillment type.",
          "enum": [
            "FULFILLMENT_TYPE_UNSPECIFIED",
            "FULFILLMENT_TYPE_DELIVERY",
            "FULFILLMENT_TYPE_PICKUP"
          ],
          "type": "string"
        },
        "minimumOrder": {
          "$ref": "Price",
          "description": "Required. Minimum order for the fulfillment method associated with the action link."
        },
        "feeDetails": {
          "description": "Required. Fee details for the fulfillment method.",
          "$ref": "FeeDetails"
        },
        "availableDay": {
          "type": "array",
          "description": "Required. A list of days on which there is availability for this fulfillment method (preferably at least 2).",
          "items": {
            "$ref": "AvailableDay"
          }
        }
      },
      "type": "object"
    },
    "HomeServiceData": {
      "description": "Additional information required to be provided for home service vertical.",
      "id": "HomeServiceData",
      "properties": {
        "categoryType": {
          "description": "The high level category to which this home service belongs to. E.g. plumber, electrician etc.",
          "type": "string"
        },
        "jobType": {
          "description": "The job type under the category to which the given home service belongs to. E.g. unclog_drain, install_faucet are the job types under plumber category.",
          "type": "string"
        }
      },
      "type": "object"
    },
    "FoodOrderingServiceV1MoneyRange": {
      "description": "[START epa_money_range_definition] Wrapper for a range of monetary amount that could be bounded or unbounded. At least one of min_amount or max_amount is required.",
      "id": "FoodOrderingServiceV1MoneyRange",
      "properties": {
        "minAmount": {
          "$ref": "Money",
          "description": "Minimum amount."
        },
        "maxAmount": {
          "description": "Maximum amount.",
          "$ref": "Money"
        }
      },
      "type": "object"
    },
    "UserPurchaseRestriction": {
      "id": "UserPurchaseRestriction",
      "properties": {
        "newToPaymentOption": {
          "description": "A payment option that can only be purchased by users who have never purchased the same payment option before.",
          "type": "boolean"
        },
        "newToMerchant": {
          "description": "A payment option that can only be purchased by users who have never purchased from the same merchant before.",
          "type": "boolean"
        }
      },
      "type": "object",
      "description": "Restricts the users eligible to purchase a payment option."
    },
    "OrderedTickets": {
      "type": "object",
      "id": "OrderedTickets",
      "properties": {
        "ticketId": {
          "description": "ID of a Ticket Type.",
          "type": "string"
        },
        "count": {
          "type": "integer",
          "format": "int32",
          "description": "Number of tickets ordered for this type."
        }
      },
      "description": "Number of ordered tickets by Ticket Type."
    },
    "Empty": {
      "id": "Empty",
      "properties": {},
      "type": "object",
      "description": "A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance: service Foo { rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); }"
    },
    "MaddenIngestionOfferFixedDenominations": {
      "type": "object",
      "id": "MaddenIngestionOfferFixedDenominations",
      "properties": {
        "amounts": {
          "description": "A list of all available discrete denominations (e.g., [100, 500, 1000]).",
          "items": {
            "$ref": "Money"
          },
          "type": "array"
        }
      }
    },
    "GeoCoordinates": {
      "description": "The Geo data of a location, including latitude, longitude, and address.",
      "type": "object",
      "id": "GeoCoordinates",
      "properties": {
        "latitude": {
          "format": "double",
          "type": "number",
          "description": "Latitude in degrees. (optional)"
        },
        "longitude": {
          "type": "number",
          "format": "double",
          "description": "Longitude in degrees. (optional)"
        },
        "address": {
          "description": "Postal address of the location, preferred.",
          "$ref": "PostalAddress"
        },
        "unstructuredAddress": {
          "description": "An unstructured address could also be provided as a fallback. E.g. \"1600 amphitheatre parkway mountain view, ca 94043\"",
          "type": "string"
        }
      }
    },
    "WaitlistRules": {
      "id": "WaitlistRules",
      "properties": {
        "minPartySize": {
          "description": "Required. Must be a positive integer for services providing waitlist functionality. If the service or merchant does not provide waitlist functionality, this must not be populated.",
          "type": "integer",
          "format": "int32"
        },
        "maxPartySize": {
          "type": "integer",
          "format": "int32",
          "description": "Required. Must be a positive integer for services providing waitlist functionality. If the service or merchant does not provide waitlist functionality, this must not be populated."
        },
        "supportsAdditionalRequest": {
          "description": "If true, the user will be able to send a free-form additional text request when joining the waitlist for this service.",
          "type": "boolean"
        },
        "aboveMaxPartySizeOptions": {
          "description": "Set options for parties larger than the set max_party_size. Leave empty if larger parties should not be given alternative options for joining a waitlist.",
          "items": {
            "$ref": "UnsupportedPartySizeOption"
          },
          "type": "array"
        }
      },
      "type": "object",
      "description": "Rules related to joining the waitlist."
    },
    "QuantitativeValue": {
      "type": "object",
      "id": "QuantitativeValue",
      "properties": {
        "value": {
          "format": "double",
          "type": "number",
          "description": "A singular value. For example: 5.6"
        },
        "valueRange": {
          "$ref": "RangeValue",
          "description": "A range of values that could also be open ended or bounded. Examples: * At least 5.5 * At most 5.5 * 5.5 to 6.5"
        }
      },
      "description": "Wrapper for a numerical value that could be a range or a fixed value. `QuantitativeValue` examples: * Singular value: `value: 10.5` * Bounded range: `value_range {min_value: 5.5, max_value 10.5}` * Lower bound: `value_range {min_value: 5.5}` * Upper bound: `value_range {max_value: 10.5}`"
    },
    "LineItem": {
      "id": "LineItem",
      "properties": {
        "serviceId": {
          "description": "ID of the merchant Service.",
          "type": "string"
        },
        "durationSec": {
          "description": "Duration of the appointment slot in seconds.",
          "type": "string",
          "format": "int64"
        },
        "tickets": {
          "type": "array",
          "description": "Number of tickets ordered by Ticket Type.",
          "items": {
            "$ref": "OrderedTickets"
          }
        },
        "startSec": {
          "format": "int64",
          "type": "string",
          "description": "Start time of the appointment slot in seconds of UTC time since Unix epoch."
        },
        "price": {
          "description": "The total price (excluding taxes) of this Line Item.",
          "$ref": "Price"
        },
        "status": {
          "description": "Status of the Line Item.",
          "enum": [
            "BOOKING_STATUS_UNSPECIFIED",
            "CONFIRMED",
            "PENDING_MERCHANT_CONFIRMATION",
            "PENDING_CLIENT_CONFIRMATION",
            "CANCELED",
            "NO_SHOW",
            "NO_SHOW_PENALIZED",
            "FAILED",
            "DECLINED_BY_MERCHANT"
          ],
          "enumDescriptions": [
            "Not specified.",
            "Booking has been confirmed",
            "Booking is awaiting confirmation by the merchant before it can transition into CONFIRMED status (this is NOT currently supported)",
            "Booking is awaiting confirmation by the client before it can transition into CONFIRMED status (this is NOT currently supported)",
            "Booking has been canceled on behalf of the user.",
            "Client did not show for the appointment",
            "Client did not show for the appointment in violation of the cancellation policy.",
            "Booking could not be completed due to a processing failure.",
            "Booking was asynchronously declined by the merchant."
          ],
          "type": "string"
        }
      },
      "type": "object",
      "description": "A single item in an order--the booking of a single service in a single time slot."
    },
    "ValidTimeException": {
      "description": "[START valid_time_exception_definition]",
      "type": "object",
      "id": "ValidTimeException",
      "properties": {
        "exceptionalPeriod": {
          "description": "The start and end timestamp that the offer is not valid for. These times must represent distinct days i.e. the start time must be 00:00 (beginning of the day) and the end time must be 00:00 (exclusive) on the day the exception period ends.",
          "$ref": "ValidityRange"
        },
        "timeOfDay": {
          "description": "[START_EXCLUDE silent] WARNING: no-op field. Specifies the valid time interval on a given day and which days are not available for the offer. Optional.",
          "items": {
            "$ref": "TimeOfDayWindow"
          },
          "type": "array"
        }
      }
    },
    "AdsAccountLink": {
      "type": "object",
      "id": "AdsAccountLink",
      "properties": {
        "name": {
          "description": "Identifier. Resource name of the AdsAccountLink. Format: `partners/{partner}/adsAccountLinks/{ads_account_link}`",
          "type": "string"
        },
        "itemIds": {
          "type": "array",
          "description": "Required. List of inventory item Ids to be linked with the Google Ads account.",
          "items": {
            "type": "string"
          }
        },
        "state": {
          "enumDescriptions": [
            "Unknown state.",
            "Account is linked between the Partner Center and the Ads Portal.",
            "Account is waiting for approval on either the Partner Center or the Ads Portal.",
            "Account link is deleted.",
            "Account link request is rejected by either the Partner Center or the Ads Portal."
          ],
          "description": "Output only. State of the Ads account link.",
          "enum": [
            "STATE_UNSPECIFIED",
            "LINKED",
            "PENDING",
            "DELETED",
            "REJECTED"
          ],
          "readOnly": true,
          "type": "string"
        }
      },
      "description": "AdsAccountLink is a link between an Ads account and a Partner Center account along with the inventory items."
    },
    "EconomicOperator": {
      "description": "Economic Operator information for the Aggregator.",
      "id": "EconomicOperator",
      "properties": {
        "text": {
          "description": "Required. Name, address, telephone number and email address of the economic operator, defined as the manufacturer, authorized representative, importer, distributor, fulfillment service provider or any other natural or legal person subject to obligations related to the manufacture of products, making them available, or putting them into service. Freeform string representation of the economic_operator. This information may be formatted using \" \" and \"\\n\".",
          "$ref": "Text"
        }
      },
      "type": "object"
    },
    "LocalizedString": {
      "description": "Instance of a string in one locale.",
      "id": "LocalizedString",
      "properties": {
        "locale": {
          "description": "IETF BCP 47 language code, such as \"en\", \"mas\", \"zh-Hant\", \"de-CH-1901\". See http://www.w3.org/International/articles/language-tags/.",
          "type": "string"
        },
        "value": {
          "description": "Message in the locale above (UTF-8).",
          "type": "string"
        }
      },
      "type": "object"
    },
    "NoShowFee": {
      "id": "NoShowFee",
      "properties": {
        "fee": {
          "$ref": "Price",
          "description": "The amount the user may be charged if they do not show up for their reservation."
        },
        "feeType": {
          "type": "string",
          "enumDescriptions": [
            "The price is for a fixed amount. This is the default value if the field is not set. Examples: $50 deposit to reserve a table; $20 no show fee for a yoga class",
            "The price specified is per person, and the total price is calculated according to the party size specified in Resources as price_micros * party_size. A PER_PERSON price must be accompanied by a party size in the availability resources. If it is not, a party size of one is used. Examples: $10 each for tickets to a museum"
          ],
          "description": "Defines how the fee is determined from the availability.",
          "enum": [
            "FIXED_RATE_DEFAULT",
            "PER_PERSON"
          ]
        }
      },
      "type": "object",
      "description": "A fee that a user may be charged if they have made a booking but do not show up."
    },
    "MaddenIngestionOfferAdditionalFee": {
      "type": "object",
      "id": "MaddenIngestionOfferAdditionalFee",
      "properties": {
        "name": {
          "description": "The name of the additional fee. Examples: convenience fee, handling fee etc. Required.",
          "type": "string"
        },
        "fee": {
          "$ref": "MaddenIngestionOfferFee"
        }
      },
      "description": "[START additional_fee_definition]"
    },
    "MaddenIngestionOfferPaymentInstrumentItem": {
      "id": "MaddenIngestionOfferPaymentInstrumentItem",
      "properties": {
        "name": {
          "description": "Name of the payment instrument item like the name of the credit card. For example: HDFC Infinia, American Express Platinum. Required.",
          "type": "string"
        },
        "type": {
          "description": "Type of the payment instrument. Required.",
          "enum": [
            "PAYMENT_INSTRUMENT_TYPE_UNSPECIFIED",
            "PAYMENT_INSTRUMENT_CREDIT_CARD",
            "PAYMENT_INSTRUMENT_DEBIT_CARD",
            "PAYMENT_INSTRUMENT_BANK_ACCOUNT",
            "PAYMENT_INSTRUMENT_UPI",
            "PAYMENT_INSTRUMENT_ONLINE_WALLET",
            "PAYMENT_INSTRUMENT_NETBANKING"
          ],
          "enumDescriptions": [
            "The UNSPECIFIED or default enum value should not be used in feeds.",
            "",
            "",
            "",
            "",
            "",
            ""
          ],
          "type": "string"
        }
      },
      "type": "object",
      "description": "[START payment_instrument_item_definition]"
    },
    "FoodOrderingMetadata": {
      "type": "object",
      "id": "FoodOrderingMetadata",
      "properties": {
        "advanceOrderDetails": {
          "description": "Details on advanced ordering support also known as order ahead where user can place an order for fulfillment at a later time than right now.",
          "$ref": "AdvanceOrderDetails"
        },
        "feeDetails": {
          "description": "Details of fees charged to the user on top of the item total. Repeated for different types of fees like service fee, delivery fee etc.",
          "items": {
            "$ref": "FoodOrderingMetadataFeeDetails"
          },
          "type": "array"
        },
        "fulfillmentLeadTimeDuration": {
          "description": "Fixed duration. For example: 30 mins.",
          "format": "google-duration",
          "type": "string"
        },
        "fulfillmentLeadTimeDurationRange": {
          "$ref": "DurationRange",
          "description": "A range of duration. Examples: * 30 mins to 45 mins * Greater than 30 mins * Less than 50 mins"
        }
      },
      "description": "Metadata for food ordering action links."
    },
    "DirectMerchantPayment": {
      "type": "object",
      "id": "DirectMerchantPayment",
      "properties": {
        "paymentMethods": {
          "type": "array",
          "description": "Users would be advised to pay only via the payment methods mentioned below.",
          "items": {
            "$ref": "Text"
          }
        }
      },
      "description": "Information about how the user can pay directly to the merchant instead of pre-paying for the service via RwG."
    },
    "PriceRange": {
      "description": "Wrapper for a range of monetary amount treated as unbounded unless both values are set. At least one of min_amount and max_amount is required.",
      "id": "PriceRange",
      "properties": {
        "maxPrice": {
          "$ref": "Price",
          "description": "Maximum amount. Should always be \u003e min_price."
        },
        "minPrice": {
          "$ref": "Price",
          "description": "Minimum amount."
        }
      },
      "type": "object"
    },
    "FoodOrderingServiceV1FoodOrderingService": {
      "id": "FoodOrderingServiceV1FoodOrderingService",
      "properties": {
        "parentEntityId": {
          "description": "The parent entity’s ID. Required.",
          "type": "string"
        },
        "leadTime": {
          "$ref": "FoodOrderingServiceV1ETA",
          "description": "The lead time given in the service entity will apply to all the service hours unless an overridden property is set in the service hours entity. Required."
        },
        "serviceType": {
          "enumDescriptions": [
            "",
            "",
            ""
          ],
          "description": "The type of the service. Required and cannot be SERVICE_TYPE_UNKNOWN.",
          "enum": [
            "SERVICE_TYPE_UNKNOWN",
            "DELIVERY",
            "TAKEOUT"
          ],
          "type": "string"
        },
        "serviceId": {
          "description": "Unique identifier of the provided service. Required.",
          "type": "string"
        },
        "disabled": {
          "description": "Indicates if the entity is disabled. Optional.",
          "type": "boolean"
        },
        "actionLinkId": {
          "description": "Parent action detail's link ID. Required.",
          "type": "string"
        }
      },
      "type": "object",
      "description": "[START fo_epa_service_definition]"
    },
    "PerOrderFee": {
      "description": "Fees that must be paid once per order, regardless of number of tickets.",
      "type": "object",
      "id": "PerOrderFee",
      "properties": {
        "deliveryFee": {
          "$ref": "Price",
          "description": "A fee that can vary by delivery method."
        },
        "processingFee": {
          "description": "A fee to process the user's payment method.",
          "$ref": "Price"
        }
      }
    },
    "Merchant": {
      "description": "Info about a merchant that is on the aggregator's platform.",
      "id": "Merchant",
      "properties": {
        "url": {
          "description": "The url of the merchant's public website.",
          "type": "string"
        },
        "taxRateBasisPoints": {
          "deprecated": true,
          "description": "The merchant's tax rate in basis points (one hundredth of one percent). For example, if the tax rate is 7.5%, this field should be set to 750. If this field is left unset or set to 0, the total price charged to a user for any service provided by this merchant is the exact price specified by Service.price. The service price is assumed to be exempt from or already inclusive of applicable taxes. Taxes will not be shown to the user as a separate line item. If this field is set to any nonzero value, the total price charged to a user for any service provided by this merchant will include the service price plus the tax assessed using the tax rate provided here. Fractions of the smallest currency unit (for example, fractions of one cent) will be rounded using nearest even rounding. Taxes will be shown to the user as a separate line item. This field is deprecated, please use tax_rate instead.",
          "format": "uint32",
          "type": "integer"
        },
        "economicOperator": {
          "$ref": "EconomicOperator",
          "description": "Optional. Economic Operator information associated to this specific merchant needed for regulatory compliance. (optional)"
        },
        "reservationLinkoutTemplate": {
          "description": "Optional. The linkout template that specifies how Google should generate the partner's URL to reserve a table on their platform. Note that currently only the first one will be used if multiple are provided. The URI template has support for fields which will be populated based on the user's reservation selections, all required fields are needed to build a reservation URL successfully: * (required) party_size, int: The size of the party for which the user is requesting a reservation. * (required) selected_date_time, ISO 8601 datetime (https://en.wikipedia.org/wiki/ISO_8601): The time the user is requesting a reservation for. * (optional) merchant_id, string: The ID of the Merchant the user is requesting a reservation with, not needed if template already includes a merchant identifier. * (optional) room_id, string: The id of the room the user is requesting a reservation for.",
          "items": {
            "$ref": "LinkoutTemplate"
          },
          "type": "array"
        },
        "name": {
          "description": "The merchant resource name, which has the format of `partners/{partner_id}/merchants/{merchant_id}`.",
          "type": "string"
        },
        "category": {
          "description": "The category of the business in aggregator's platform.",
          "type": "string"
        },
        "numBookings30d": {
          "description": "This field is deprecated.",
          "deprecated": true,
          "type": "string",
          "format": "int64"
        },
        "paymentRestrictions": {
          "description": "Restrictions to the payment methods this merchant accepts. We assume no restrictions exist if this field is not set. Deprecated since E2E payments is no longer supported.",
          "deprecated": true,
          "$ref": "PaymentRestrictions"
        },
        "tokenizationConfig": {
          "$ref": "TokenizationConfig",
          "deprecated": true,
          "description": "Configuration for a tokenized payment processor, if the merchant has support for it. Deprecated since E2E payments is no longer supported."
        },
        "matchingHints": {
          "$ref": "MerchantMatchingHints",
          "description": "Hints to help Google match a merchant to a place on Google Maps. Note: most partners do not need to set this field, as Google will match merchants to places on Google Maps using the information provided above. (optional)"
        },
        "taxRate": {
          "$ref": "TaxRate",
          "description": "The merchant's tax rate. If present this field overrides the deprecated tax_rate_basis_points field. An empty message (i.e. tax_rate { }) will reset the applied tax rate to zero. Deprecated since E2E payments is no longer supported.",
          "deprecated": true
        },
        "merchantName": {
          "description": "The merchant_name, telephone, url and geo are used to support matching partner inventory with merchants already present on Google Maps. This information will not be displayed. The name of the merchant.",
          "type": "string"
        },
        "paymentOption": {
          "type": "array",
          "description": "Payment options available for this merchant. Services under this merchant will be able to individually limit the payment options they allow. Deprecated since E2E payments is no longer supported.",
          "items": {
            "$ref": "PaymentOption"
          },
          "deprecated": true
        },
        "serviceAttribute": {
          "type": "array",
          "description": "Definitions for any service attributes used to describe the Services for this Merchant. (optional)",
          "items": {
            "$ref": "ServiceAttribute"
          }
        },
        "actionLink": {
          "description": "Optional. An action URL with associated language, list of countries restricted to, type, and optional platform that indicates which platform this action should be performed on,",
          "items": {
            "$ref": "ActionLink"
          },
          "type": "array"
        },
        "waitlistAdvisement": {
          "$ref": "Advisement",
          "description": "Optional. General advisements from a specific merchant for a user joining a waitlist through Reserve with Google. Individual text fields in the advisement should be limited to 100 bytes in length."
        },
        "paymentProcessorConfig": {
          "description": "Configuration for a tokenized payment processor, if the merchant has support for it.",
          "deprecated": true,
          "$ref": "PaymentProcessorConfig"
        },
        "geo": {
          "description": "The Geo info of the merchant, including latitude, longitude, and address.",
          "$ref": "GeoCoordinates"
        },
        "terms": {
          "$ref": "Terms",
          "description": "The specific merchant's Terms and Conditions displayed to the user when a service is being booked through Reserve with Google. In addition to these the aggregator partner's Terms and Conditions are always displayed to the user and must not be provided here."
        },
        "brandId": {
          "description": "An opaque string that identifies the consumer-facing brand to use when displaying partner attribution. This field allows partners with multiple consumer-facing brands to provide merchants for all brands within the same feed. A brand consists of consumer-facing properties like the name, logo, Terms of Service, and Privacy Policy. If there is only one consumer-facing partner brand, this field does not need to be set and can be ignored. If the partner... Does not have multiple consumer-facing brands? --\u003e Ignore this field Has Multiple Brands that are configured? If this field is set --\u003e Associated consumer-facing brand attribution is used If this field is unset or the empty string --\u003e Default consumer-facing brand attribution is used Careful Note: most partners do not need to set this field. If a partner wishes to use this field, they must contact us first to configure separate brands, including the default brand.",
          "type": "string"
        },
        "telephone": {
          "description": "The public telephone number of the merchant including its country and area codes, e.g. +14567891234.",
          "type": "string"
        }
      },
      "type": "object"
    },
    "Service": {
      "id": "Service",
      "properties": {
        "directMerchantPayment": {
          "description": "Optional. Additional information which needs to be added if the service requires the user to pay directly to the merchant. IMPORTANT NOTE: RwG would not be involved in this transaction. It is required if virtual_session is defined and the service is not free or prepayment_type is NOT set to REQUIRED.",
          "$ref": "DirectMerchantPayment"
        },
        "priceInterpretation": {
          "type": "string",
          "description": "Describes how the price is interpreted and displayed to the user. Can be used by any vertical except Dining and Things To Do to configure display of the service price.",
          "enum": [
            "PRICE_INTERPRETATION_UNSPECIFIED",
            "EXACT_AMOUNT",
            "STARTS_AT",
            "NOT_DISPLAYED"
          ],
          "enumDescriptions": [
            "Price interpretation unspecified, defaults to EXACT_AMOUNT.",
            "When the price should be interpreted as a specific value. Examples: $20 for a yoga class; $15 for a child haircut",
            "When the price of a service is variable but a minimum price is known and displayed to consumers. Consumers may make choices which increase the price. Note that any service that uses this PriceInterpretation must use PrepaymentType NOT_SUPPORTED. Examples: $30 for dog grooming, but additional consumer choices may increase the price",
            "When the price of a service is variable and no price information is displayed to consumers ahead of time. Note that any service that uses this PriceInterpretation must use PrepaymentType NOT_SUPPORTED and Price must be empty. Examples: A consultation for a home service"
          ]
        },
        "ticketingVerticalSpecificData": {
          "description": "Additional information unique to the event ticketing vertical. (optional)",
          "$ref": "TicketingVerticalSpecificData"
        },
        "intakeForm": {
          "description": "A form requesting additional information from the user when they book this service. (optional)",
          "$ref": "ServiceIntakeForm"
        },
        "actionLink": {
          "description": "An action link related to this service. If action link exists, type (see below) must be set in the Service.",
          "items": {
            "$ref": "ActionLink"
          },
          "type": "array"
        },
        "toursAndActivitiesContent": {
          "description": "Content fields specific to Tours and Activities.",
          "$ref": "ToursAndActivitiesContent"
        },
        "location": {
          "description": "Locations related to this service. IMPORTANT NOTES: If there are multiple visited locations related to this service, or the START_LOCATION is different from the VISITED_LOCATION, the START_LOCATION must be specified. Example: - A guided biking tour visiting three venues, the start venue needs to be specified. - A bus tour meeting at a hotel lobby and then head to the visited venue. The meeting location needs to be specified.",
          "items": {
            "$ref": "Location"
          },
          "type": "array"
        },
        "serviceAttributeValueId": {
          "description": "Service attribute values that apply to this service (optional). Each Service may have zero or more values for each service attribute defined in the corresponding Merchant. (optional)",
          "items": {
            "$ref": "ServiceAttributeValueId"
          },
          "type": "array"
        },
        "relatedMedia": {
          "description": "Photos related to this service. Google will crawl and store the media to ensure that they are displayed to end-users in the most efficient way. (optional)",
          "items": {
            "$ref": "RelatedMedia"
          },
          "type": "array"
        },
        "description": {
          "description": "The user-visible description of the service. Deprecated, use localized_description instead.",
          "type": "string"
        },
        "form": {
          "deprecated": true,
          "description": "Deprecated. Please use intake_form and per_ticket_intake_form.",
          "items": {
            "$ref": "ServiceIntakeForm"
          },
          "type": "array"
        },
        "serviceName": {
          "description": "The name of the service, e.g. \"Men's haircut\". Deprecated, use localized_service_name instead.",
          "type": "string"
        },
        "integrationType": {
          "enumDescriptions": [
            "Defaults to END_TO_END.",
            "Complete integration that allows end to end booking through Google.",
            "Booking server doesn’t need to support this service. Only merchants, services, and (optionally) availability data need to be sent."
          ],
          "description": "Depth of integration we support for this service. (optional) Irrelevant for partners with the starter integration. End to end will always be disabled for these partners.",
          "enum": [
            "INTEGRATION_TYPE_UNSPECIFIED",
            "INTEGRATION_TYPE_END_TO_END",
            "INTEGRATION_TYPE_INVENTORY_ONLY"
          ],
          "type": "string"
        },
        "prepaymentTerms": {
          "$ref": "PrepaymentTerms",
          "description": "Terms around when the prepayment is completed."
        },
        "requireCreditCard": {
          "type": "string",
          "enumDescriptions": [
            "The credit card requirement is not explicitly specified and the behaviour is identical to the one specified for CONDITIONAL.",
            "Google will require a credit card for the booking if any of the following conditions are met: * the availability has a price and the prepayment_type is REQUIRED * the no_show_fee is set * the deposit field is set.",
            "A credit card is always required in order to book this availability regardless of other field values."
          ],
          "description": "Indicates whether the user must provide a credit card in order to book this service. This field can be overridden at the availability level. (optional)",
          "enum": [
            "REQUIRE_CREDIT_CARD_UNSPECIFIED",
            "REQUIRE_CREDIT_CARD_CONDITIONAL",
            "REQUIRE_CREDIT_CARD_ALWAYS"
          ]
        },
        "localizedServiceName": {
          "$ref": "Text",
          "description": "The name of the service, e.g. \"Men's haircut\". Possibly in several locales."
        },
        "waitlistRules": {
          "$ref": "WaitlistRules",
          "description": "Rules to joining the waitlist."
        },
        "noShowFee": {
          "$ref": "NoShowFee",
          "description": "Defines a no show fee that may be charged to the user. Overrides the service no show fee if one was specified. Setting this to an empty NoShowFee message removes any service-level no show fee. (optional)"
        },
        "localizedDescription": {
          "$ref": "Text",
          "description": "The user-visible description of the service. This field supports both plain-text and HTML-like formatting. Unlike plain text sections, customized layouts can be created here using headings, paragraphs, lists and some phrase tags. Please read the following instructions and notes carefully to ensure you create the best user-experience. Supported HTML-like formatting tags: Heading tags: \u003ch1\u003e, \u003ch2\u003e, \u003ch3\u003e, \u003ch4\u003e, \u003ch5\u003e, \u003ch6\u003e Heading tags can be used to display titles and sub-titles. For example, \u003ch1\u003eItinerary\u003c/h1\u003e will display the inline text as the most important heading of the section. Note that any inner HTML tags, styles or attributes will be ignored. For example, \u003ch1 style=\"..\"\u003e will be treated the same as \u003ch1\u003e. Only pure text wil be preserved. Paragraph tag: \u003cp\u003e The paragraph tag can be used to highlight a detailed introduction or contents. Any inner tags, styles or attributes will be ignored, with a few exceptions: \u003cbr\u003e, \u003cstrong\u003e and \u003cem\u003e. Please see the phrase tag section below for more details. List tags: \u003cul\u003e, \u003col\u003e, \u003cli\u003e The \u003cul\u003e tag can be used with the \u003cli\u003e tag to display unordered lists, and the \u003col\u003e tag can be used with \u003cli\u003e to display ordered lists. This is a good way to display checklists, schedules, or any other lists that fit your use-cases. Example: To show a list of features of a cruise trip: \u003col\u003e \u003cli\u003eWonderful ocean view and chances to play with wildlife.\u003c/li\u003e \u003cli\u003eCarefully designed travel arrangements and services.\u003c/li\u003e \u003cli\u003eGuaranteed lowest price.\u003c/li\u003e \u003c/ol\u003e Note that only \u003cli\u003e children under \u003cul\u003e or \u003col\u003e tags will be converted. All other children will be dropped. Also, any inner tags, attributes and styles will be ignored; we only preserve pure text contents. Division tag: \u003cdiv\u003e All supported inner tags of the \u003cdiv\u003e tag will be parsed with the rules stated above, imply \u003cdiv\u003e tag itself does not mean any grouping or indenting here. Also, any inner attributes and styles will be ignored. Phrase tags: \u003cbr\u003e, \u003cstrong\u003e, \u003cem\u003e: Only the three tags mentioned above are supported. \u003cbr\u003e can be used to break lines in paragraphs, and \u003cstrong\u003e/\u003cem\u003e can be used to highlight important text. Any other phrase tags will be ignored. Unsupported tags: * \u003chtml\u003e, \u003cheader\u003e, and \u003cbody\u003e tags are not allowed. * Any other tags not mentioned above are not supported (for example \u003ctable\u003e, \u003ctd\u003e ...). Any URLs, anchors, and links will be stripped, and will never be displayed to end-users. If you want to use photos to create a rich user experience, please use the \"related_media\" field below to send your photo URLs. Important notes: * Try not to use other tags except for the supported ones mentioned above, because the contents within unsupported tags will be stripped, and may lead to an undesirable user experience. * Try avoid deep nested structures like more than 3 different heading levels or nested lists. Keeping the structure flat, simple, and straightforward, helps to create a better user experience. * If the currently supported layouts are not sufficient for your use cases, please reach out to the Reserve with Google team. * The recommended maximum size is 32,000 characters."
        },
        "name": {
          "description": "The service resource name, which has the format of `partners/{partner_id}/merchants/{merchant_id}/services/{service_id}`.",
          "type": "string"
        },
        "rating": {
          "$ref": "Rating",
          "description": "User rating for this service as an aggregate metric over all reviews."
        },
        "taxRate": {
          "$ref": "TaxRate",
          "description": "The service's tax rate. If present this field overrides any tax_rate set at the merchant level. An empty message (i.e. tax_rate { }) will reset the applied tax rate to zero."
        },
        "rules": {
          "$ref": "SchedulingRules",
          "description": "Rules to book/cancel an appointment."
        },
        "perTicketIntakeForm": {
          "$ref": "ServiceIntakeForm",
          "description": "A form requesting additional information from the user when they book this service. This form must be filled out once for each ticket the user is booking. (optional)"
        },
        "uriTemplate": {
          "description": "Optional. An optional template specifying how Google should generate URLs to external site.",
          "$ref": "UriTemplate"
        },
        "price": {
          "$ref": "Price",
          "description": "The price of the service."
        },
        "prepaymentType": {
          "type": "string",
          "enumDescriptions": [
            "By default we will assume that the prepayment is NOT_SUPPORTED.",
            "The user has to pay this service at the booking time.",
            "The user can choose to pre-pay this service at the booking time or later, but it is not required in order to book.",
            "The prepayment is not supported for this service."
          ],
          "description": "Whether a prepayment is required, optional or not supported.",
          "enum": [
            "PREPAYMENT_TYPE_UNSPECIFIED",
            "REQUIRED",
            "OPTIONAL",
            "NOT_SUPPORTED"
          ]
        },
        "homeServiceData": {
          "$ref": "HomeServiceData",
          "description": "Additional information unique to home service vertical. (optional)"
        },
        "deposit": {
          "$ref": "Deposit",
          "description": "Defines how a deposit may be charged to the user. Overrides the service deposit if one was specified. Setting this to an empty Deposit message removes any service-level deposit. (optional)"
        },
        "ticketType": {
          "description": "Types of tickets that can be booked/purchased for this service, if tickets are supported. (optional)",
          "items": {
            "$ref": "TicketType"
          },
          "type": "array"
        },
        "type": {
          "description": "The predefined type of this service. (optional)",
          "enum": [
            "SERVICE_TYPE_UNSPECIFIED",
            "SERVICE_TYPE_DINING_RESERVATION",
            "SERVICE_TYPE_FOOD_ORDERING",
            "SERVICE_TYPE_FOOD_DELIVERY",
            "SERVICE_TYPE_FOOD_TAKEOUT",
            "SERVICE_TYPE_EVENT_TICKET",
            "SERVICE_TYPE_TRIP_TOUR",
            "SERVICE_TYPE_APPOINTMENT",
            "SERVICE_TYPE_ONLINE_APPOINTMENT",
            "SERVICE_TYPE_SHOPPING"
          ],
          "enumDescriptions": [
            "Unused.",
            "Dining reservation.",
            "Food ordering, could be either food delivery or takeout or both.",
            "Food delivery.",
            "Food takeout.",
            "Event ticket.",
            "Trip tour.",
            "Service that provides appointments or classes. Recommended for (1) health and fitness, (2) spa and beauty, and (3) financial consults and evaluations services. Please see the supported service types: https://developers.google.com/maps-booking/guides/end-to-end-integration/overview",
            "Service that provides online appointment for a class or session which will be fully virtual. Must be set if enabling virtual service bookings.",
            "Service that allows users to shop from the given merchant. It could either be delivery or pickup."
          ],
          "type": "string"
        },
        "perOrderFee": {
          "$ref": "PerOrderFee",
          "description": "Order level fees for purchasing this service. (optional)"
        },
        "virtualSession": {
          "description": "Optional. Information about virtual session. It is required for enabling virtual services.",
          "$ref": "VirtualSession"
        },
        "paymentOptionId": {
          "type": "array",
          "description": "A list of ids referencing the payment options which can be used to pay for this service. The actual payment options are defined at the Merchant level, and can also be shared among multiple Merchants.",
          "items": {
            "type": "string"
          }
        }
      },
      "type": "object",
      "description": "Info about a service that is provided by the merchant, e.g. haircut."
    },
    "FoodOrderingServiceV1TimeOfDayRange": {
      "type": "object",
      "id": "FoodOrderingServiceV1TimeOfDayRange",
      "properties": {
        "openTime": {
          "$ref": "TimeOfDay",
          "description": "A Time indicating the beginning time of the day of the range (inclusive). Required. If not given, we assume 00:00:00."
        },
        "closeTime": {
          "description": "A Time indicating the ending time of the day of the range (exclusive). Required. If not given, we assume 23:59:59.",
          "$ref": "TimeOfDay"
        }
      },
      "description": "[START epa_time_of_range_definition] A closed-open time range."
    },
    "Resources": {
      "id": "Resources",
      "properties": {
        "roomName": {
          "description": "An optional name for the room the service is located in. This field will be displayed to users making a booking, and should be human readable, as opposed to an opaque identifier. (optional but required if room_id is present) In dining a room name should only be used for seating areas such as the bar or patio and should not be used for fixed price menus, special activities, or any other non-room value (such as reservation or dinner). It is strongly recommended that the default seating area not have a room associated with it.",
          "type": "string"
        },
        "staffName": {
          "description": "Optional name of a staff member providing the service. This field will be displayed to users making a booking, and should be human readable, as opposed to an opaque identifier. This field must be present if staff_id is present.",
          "type": "string"
        },
        "roomId": {
          "description": "An optional ID for the room the service is located in. This field identifies the room across all merchants, services, and availability records. It also needs to be stable over time to allow correlation with past bookings. This field must be present if room_name is present.",
          "type": "string"
        },
        "roomDescription": {
          "description": "Optional. Localized room description. If set, a default value must be provided. It is preferred to also provide common languages for the merchant's locale. (optional)",
          "$ref": "Text"
        },
        "staffId": {
          "description": "Optional ID for a staff member providing the service. This field identifies the staff member across all merchants, services, and availability records. It also needs to be stable over time to allow correlation with past bookings. This field must be present if staff_name is present.",
          "type": "string"
        },
        "partySize": {
          "type": "integer",
          "format": "int32",
          "description": "Applicable only for Dining: The party size which can be accommodated during this time slot. A restaurant can be associated with multiple Slots for the same time, each specifying a different party_size, if for instance 2, 3, or 4 people can be seated with a reservation."
        }
      },
      "type": "object",
      "description": "A resource is used to disambiguate availability slots from one another when different staff members, or rooms are part of the service. Multiple slots for the same service and time interval can co-exist when they have different resources."
    },
    "MerchantMatchingHints": {
      "type": "object",
      "id": "MerchantMatchingHints",
      "properties": {
        "placeId": {
          "description": "The Place ID for a place in the Google Places database and on Google Maps. See https://developers.google.com/places/web-service/place-id for more about Place IDs.",
          "type": "string"
        }
      },
      "description": "Hints used to help Google match a merchant to a place on Google Maps."
    },
    "Recurrence": {
      "description": "Recurrence messages are optional, but allow for a more compact representation of consistently repeating availability slots. They typically represent a day's working schedule. ScheduleException messages are then used to represent booked/unavailable time ranges within the work day. Requirements: 1. The expansion of availability slots or recurrences must NOT create identical slots. If the ids, start_time, duration, and resources match, slots are considered identical. 2. Do NOT mix the standard availability format and recurrence within the slots of a single service. Recurrence benefits merchants/services that offer appointments. The standard format is geared towards merchants/services with regularly scheduled classes. 3. Recurrences should not last for more than 24 hours.",
      "id": "Recurrence",
      "properties": {
        "repeatUntil": {
          "description": "The inclusive maximum UTC timestamp the availability repeats until.",
          "format": "google-datetime",
          "type": "string"
        },
        "repeatEvery": {
          "format": "google-duration",
          "type": "string",
          "description": "Defines the time between successive availability slots. Example: An availability with a duration of 20 min, a repeat_every of 30 min, a start_time of 9:00am, and a repeat_until of 11:00am will yield slots at 9-9:20am, 9:30-9:50am, 10-10:20am, 10:30-10:50am, 11-11:20am. (required)"
        }
      },
      "type": "object"
    },
    "DirectUrl": {
      "type": "object",
      "id": "DirectUrl",
      "properties": {
        "type": {
          "enumDescriptions": [
            "Not specified.",
            "End-to-end booking URL.",
            "End-to-end waitlist URL.",
            "Google Local Services URL."
          ],
          "description": "Type of this URL.",
          "enum": [
            "URL_TYPE_UNSPECIFIED",
            "BOOKING",
            "WAITLIST",
            "LOCAL_SERVICES"
          ],
          "type": "string"
        },
        "url": {
          "description": "URL that may surface this merchant.",
          "type": "string"
        }
      },
      "description": "URL that surfaces the merchant."
    },
    "TimeOfDayRange": {
      "id": "TimeOfDayRange",
      "properties": {
        "closeTime": {
          "$ref": "TimeOfDay",
          "description": "A Time indicating the ending time of the day of the range (exclusive). If not set, it means 23:59:59. Optional."
        },
        "openTime": {
          "description": "A Time indicating the beginning time of the day of the range (inclusive). If not set, it means 00:00:00. Optional.",
          "$ref": "TimeOfDay"
        }
      },
      "type": "object",
      "description": "[START time_range_definition] A closed-open time range."
    },
    "VirtualPlatformInfo": {
      "id": "VirtualPlatformInfo",
      "properties": {
        "otherPlatformName": {
          "description": "The name of the platform if the platform is set to OTHER. (Required if platform is set to OTHER)",
          "$ref": "Text"
        },
        "platform": {
          "type": "string",
          "enumDescriptions": [
            "Unused.",
            "The merchant is flexible in which video platform they use.",
            "Google Hangouts product.",
            "Google Meet product.",
            "Zoom Video Communications.",
            "Skype.",
            "Livestreaming in YouTube.",
            "Should be set if the video platform used is different from the ones mentioned here."
          ],
          "description": "Platform used for virtual session.",
          "enum": [
            "PLATFORM_UNSPECIFIED",
            "FLEXIBLE",
            "GOOGLE_HANGOUTS",
            "GOOGLE_MEET",
            "ZOOM",
            "SKYPE",
            "YOUTUBE",
            "OTHER"
          ]
        }
      },
      "type": "object",
      "description": "Information about platform which will be used for this virtual session."
    },
    "MaddenIngestionOfferMoneyRange": {
      "id": "MaddenIngestionOfferMoneyRange",
      "properties": {
        "minAmount": {
          "$ref": "Money"
        },
        "maxAmount": {
          "$ref": "Money"
        }
      },
      "type": "object",
      "description": "[START money_range_definition]"
    },
    "UriTemplate": {
      "description": "A template specifying how Google should generate URLs to external site.",
      "type": "object",
      "id": "UriTemplate",
      "properties": {
        "uriTemplate": {
          "description": "Optional. The uri template must follow the RFC6570, see https://datatracker.ietf.org/doc/html/rfc6570. Supports Level 2 templates. These parameters will be resolved to their values specified in their respective entities. Available parameters for Dining Reservation Linkout: 1) (required) {availability_slot_start_seconds} :: populated from start_sec field in availability feed 2) (required) {resources_party_size} :: populated from party_size field in availability feed 3) (optional) {availability_slot_duration_seconds} :: populated from duration_sec field in availability feed 4) (optional) {availability_slot_availability_tag} :: populated from availability_tag field in availability feed Example usage: http://example.com/book/restaurant?start={availability_slot_start_seconds} &num_guests={resources_party_size} With: * start_sec = 123456 * party_size = 2 https://example.com/book/restaurant?start=123456&num_guests=2",
          "type": "string"
        }
      }
    },
    "ServiceIntakeForm": {
      "type": "object",
      "id": "ServiceIntakeForm",
      "properties": {
        "field": {
          "description": "Fields that will be displayed to the user.",
          "items": {
            "$ref": "ServiceIntakeFormField"
          },
          "type": "array"
        },
        "firstTimeCustomers": {
          "type": "boolean",
          "description": "If true, this form will be shown to first time customers. Deprecated. This functionality is not supported for intake forms.",
          "deprecated": true
        },
        "returningCustomers": {
          "type": "boolean",
          "description": "If true, this form will be shown to repeat customers. Deprecated. This functionality is not supported for intake forms.",
          "deprecated": true
        }
      },
      "description": "Defines an intake form that customizes the service provided by a merchant."
    },
    "MaddenIngestionOfferOfferDetails": {
      "id": "MaddenIngestionOfferOfferDetails",
      "properties": {
        "convenienceFee": {
          "$ref": "MaddenIngestionOfferFee"
        },
        "bookingCost": {
          "$ref": "Money",
          "description": "The cost to book this offer. For example, $100 off the final bill when a table is reserved at the cost of $15."
        },
        "giftCardInfo": {
          "$ref": "MaddenIngestionOfferGiftCardInfo",
          "description": "Details specifically for gift card deals."
        },
        "discountValue": {
          "$ref": "Money",
          "description": "Fixed value of the discount."
        },
        "discountPercent": {
          "description": "Percentage of the bill that is discounted. [0, 100] For 1+1 or 50% off offers that are applicable to the whole meal (e.g. 1+1 buffet, 1+1 on entire bill, 1+1 on set menu), this value can be set to 50.",
          "type": "number",
          "format": "float"
        },
        "minSpendValue": {
          "description": "The minimum spend value to avail the discount. For example, 10% off when the total price is $100 or more.",
          "$ref": "Money"
        },
        "offerDiscountType": {
          "type": "string",
          "enumDescriptions": [
            "",
            "",
            "",
            ""
          ],
          "description": "The type of discount.",
          "enum": [
            "OFFER_DISCOUNT_TYPE_UNSPECIFIED",
            "OFFER_DISCOUNT_TYPE_INSTANT_DISCOUNT",
            "OFFER_DISCOUNT_TYPE_CASHBACK",
            "OFFER_DISCOUNT_TYPE_REWARD_POINT"
          ]
        },
        "offerDisplayText": {
          "description": "The offer text the offer provider wants to display to customers on the search results page. Required.",
          "type": "string"
        },
        "offerSummaryText": {
          "description": "[START_EXCLUDE silent] A short summary of the offer, applicable mostly for offers from Merchant posts. [END_EXCLUDE]",
          "type": "string"
        },
        "otherOfferDetailText": {
          "description": "Free-form text to describe the discount. For specific 1+1 offers (e.g. 1+1 drinks, +1 main course, 1+1 selected menu items), these details should be described here.",
          "type": "string"
        },
        "bookingCostUnit": {
          "type": "string",
          "enumDescriptions": [
            "The UNSPECIFIED or default enum value should not be used in feeds.",
            "",
            ""
          ],
          "description": "The unit of the booking cost. For example, per person, per transaction.",
          "enum": [
            "FEE_UNIT_UNSPECIFIED",
            "FEE_UNIT_PER_GUEST",
            "FEE_UNIT_PER_TRANSACTION"
          ]
        },
        "additionalFees": {
          "type": "array",
          "description": "Additional fees that are charged to the user. Examples: convenience, handling, delivery, packaging, service fee etc.",
          "items": {
            "$ref": "MaddenIngestionOfferAdditionalFee"
          }
        },
        "maxDiscountValue": {
          "$ref": "Money",
          "description": "The maximum discount that can be availed. For example, 10% off up to $100."
        },
        "bookingCostAdjustable": {
          "description": "Whether the booking cost is adjustable i.e. the booking cost is subtracted from the final bill. For example: 30% off dinner with reservation. Cost to reserve $15 and it will be applied to the final bill. Hence final bill: Total Spent - 30% - $15",
          "type": "boolean"
        }
      },
      "type": "object",
      "description": "[START offer_details_definition] Next tag: 15"
    },
    "Terms": {
      "id": "Terms",
      "properties": {
        "localizedText": {
          "description": "The localized text to be displayed to the user.",
          "$ref": "Text"
        },
        "text": {
          "description": "The text to be displayed to the user. Use localized_text below for new integrations.",
          "type": "string"
        },
        "url": {
          "description": "Optionally, the URL to the Terms and Conditions.",
          "type": "string"
        }
      },
      "type": "object",
      "description": "A set of rules and guidelines that are displayed to the user in order to make a booking through Reserve with Google."
    },
    "InvalidateResourceRequest": {
      "type": "object",
      "id": "InvalidateResourceRequest",
      "properties": {},
      "description": "Request to invalidate a resource."
    },
    "CallMerchant": {
      "type": "object",
      "id": "CallMerchant",
      "properties": {},
      "description": "Empty message to be used in UnsupportedPartySizeOption, setting this will display an option to users to call the business for a booking."
    },
    "ScheduleException": {
      "id": "ScheduleException",
      "properties": {
        "timeRange": {
          "$ref": "TimeRange",
          "description": "The time range of the exception. Any slots described by the recurrence which overlap this closed-open time range will be considered unavailable. Example: If the recurrence specifies a duration of 20 min, a repeat_every of 30 min, a start_time of 9:00am, and a repeat_until of 11:00am, then a ScheduleException with a time_range of 9:45am-11:00am would make unavailable the slots at 9:30-9:50am, 10-10:20am, and 10:30-10:50am. Note that because the time range is closed-open, the slot beginning at 11am slot would not be impacted."
        }
      },
      "type": "object",
      "description": "ScheduleException messages represent booked/unavailable time ranges within the workday, which are exceptions to the recurrence described above. As time slots are booked, the list of exceptions should be updated to reflect the newly unavailable time ranges. The recurrence itself shouldn't be modified."
    },
    "BatchReplaceServiceAvailabilityResponse": {
      "type": "object",
      "id": "BatchReplaceServiceAvailabilityResponse",
      "properties": {
        "extendedServiceAvailability": {
          "type": "array",
          "description": "The successfully updated extended service availability messages that were used to replace the existing availability slots.",
          "items": {
            "$ref": "ExtendedServiceAvailability"
          }
        }
      },
      "description": "The batch response to replace multiple Service's availability slots. Only successfully updated slots will be included in this message"
    },
    "FoodOrderingMetadataFeeDetails": {
      "description": "Fee details.",
      "type": "object",
      "id": "FoodOrderingMetadataFeeDetails",
      "properties": {
        "type": {
          "type": "string",
          "enumDescriptions": [
            "Fee type unspecified.",
            "For delivery fees.",
            "For service fees."
          ],
          "description": "Fee type. (required)",
          "enum": [
            "FEE_TYPE_UNSPECIFIED",
            "DELIVERY",
            "SERVICE"
          ]
        },
        "feeAmount": {
          "description": "Fee amount either in unit currency, a percentage of the cart value, or a combination of both. (required)",
          "$ref": "FeeAmount"
        }
      }
    },
    "DurationRange": {
      "description": "Wrapper for a range of duration that can be bounded or unbounded. At least one of min_duration and max_duration duration is required.",
      "id": "DurationRange",
      "properties": {
        "maxDuration": {
          "description": "Maximum duration.",
          "format": "google-duration",
          "type": "string"
        },
        "minDuration": {
          "format": "google-duration",
          "type": "string",
          "description": "Minimum duration."
        }
      },
      "type": "object"
    },
    "ExtendedServiceAvailability": {
      "type": "object",
      "id": "ExtendedServiceAvailability",
      "properties": {
        "serviceId": {
          "description": "This is a mandatory field required to specify which service the availability messages below belong to.",
          "type": "string"
        },
        "availability": {
          "type": "array",
          "description": "The new list of availability.",
          "items": {
            "$ref": "Availability"
          }
        },
        "endTimeRestrict": {
          "format": "google-datetime",
          "type": "string",
          "description": "Setting end_time_restrict while leaving start_time_restrict unset is interpreted to mean all time up to the end_time_restrict."
        },
        "merchantId": {
          "description": "This is a mandatory field required to specify which merchant the availability messages below belong to.",
          "type": "string"
        },
        "startTimeRestrict": {
          "format": "google-datetime",
          "type": "string",
          "description": "If provided, we will consider the Availability entities provided to be a complete snapshot from [start_time_restrict, end_time_restrict). That is, all existing availability will be deleted if the following condition holds true: ``` start_time_restrict \u003c= availability.start_sec && availability.start_sec \u003c end_time_restrict ``` If a duration message is set, the condition is further restricted: ``` availability.duration == duration_restrict ``` If a resources_restrict message is set, the condition is further restricted: ``` availability.resources.staff_id == resources_restrict.staff_id && availability.resources.room_id == resources_restrict.room_id ``` These fields are typically used to provide a complete update of availability in a given time range. Setting start_time_restrict while leaving end_time_restrict unset is interpreted to mean all time beginning at start_time_restrict."
        },
        "durationRestrict": {
          "type": "string",
          "format": "google-duration",
          "description": "Setting duration further restricts the scope of the update to just the availability with matching duration."
        },
        "resourcesRestrict": {
          "description": "Setting resources_restrict further restricts the scope of the update to just this set of resources. All id fields of the resources must match exactly.",
          "$ref": "Resources"
        }
      },
      "description": "A list of availability and who/when they should be applied to."
    },
    "ClientInformation": {
      "description": "Personal information about the person making a booking",
      "id": "ClientInformation",
      "properties": {
        "address": {
          "description": "Address of the client",
          "$ref": "PostalAddress"
        },
        "familyName": {
          "description": "Family name of the client",
          "type": "string"
        },
        "telephone": {
          "description": "Phone number of the client",
          "type": "string"
        },
        "givenName": {
          "description": "Given name of the client",
          "type": "string"
        },
        "email": {
          "description": "Email address of the client",
          "type": "string"
        }
      },
      "type": "object"
    },
    "FoodOrderingServiceV1AsapTimeWindow": {
      "type": "object",
      "id": "FoodOrderingServiceV1AsapTimeWindow",
      "properties": {
        "leadTime": {
          "description": "Indicates the lead time, specific to service_time, the service can be fulfilled. Optional.",
          "$ref": "FoodOrderingServiceV1ETA"
        },
        "timeWindows": {
          "description": "A time window the ASAP order can be placed and fulfilled. Required.",
          "$ref": "FoodOrderingServiceV1TimeOfDayWindow"
        }
      },
      "description": "The orderable and fulfillment time window for ASAP orders. [START epa_asap_time_window_definition]"
    },
    "FoodOrderingServiceV1GeoCircle": {
      "type": "object",
      "id": "FoodOrderingServiceV1GeoCircle",
      "properties": {
        "radius": {
          "description": "Radius for the circular area, in meters. Must be greater than 0. Required.",
          "type": "number",
          "format": "double"
        },
        "center": {
          "description": "Geographical center of the area. Required.",
          "$ref": "LatLng"
        }
      },
      "description": "[START epa_geo_circle_definition] Geographical circular area described by a point and radius."
    },
    "OrderOnlineMetadata": {
      "type": "object",
      "id": "OrderOnlineMetadata",
      "properties": {
        "fulfillmentOption": {
          "description": "Available fulfillment options for an order online action link.",
          "items": {
            "$ref": "FulfillmentOption"
          },
          "type": "array"
        }
      },
      "description": "Metadata for an order online action link."
    },
    "FeeAmount": {
      "id": "FeeAmount",
      "properties": {
        "amount": {
          "description": "Fixed amount. For example USD 3.5.",
          "$ref": "Money"
        },
        "amountUnknown": {
          "description": "Unknown amount.",
          "type": "boolean"
        },
        "amountRange": {
          "description": "Range of amount. Examples: * USD 3.5 to USD 5.5 * At least USD 3.5 * At most USD 5.5",
          "$ref": "MoneyRange"
        },
        "cartPercentage": {
          "$ref": "QuantitativeValue",
          "description": "Fee in terms of a percentage of the cart value. Supports a range (bounded and unbounded) or a fixed percentage. Value should be between 0 and 100. Examples: * Fixed 5.5% * At least 5.5% * At most 5.5% * 4.5% to 5.5%"
        }
      },
      "type": "object",
      "description": "`FeeAmount` examples: * Fixed fee: USD 0 (no fee), USD 1.5 * Range of fixed fee: USD 1.0 (minimum), USD 3.0 (maximum), USD 5.0-6.0 * Percentage of cart size: 15.5%, 10%-20%, 10% (minimum), 15% (maximum) * Compound of range and percentage: 25.5% & USD 2.5 (minimum), 25.5% & USD 4.5 (maximum), 10% & USD 1.5-2.5, 10.5%-20% & USD 2.5-3.5"
    },
    "ToursAndActivitiesContent": {
      "id": "ToursAndActivitiesContent",
      "properties": {
        "exclusions": {
          "description": "The user-visible list of exclusions.",
          "items": {
            "$ref": "Text"
          },
          "type": "array"
        },
        "inclusions": {
          "type": "array",
          "description": "The user-visible list of inclusions.",
          "items": {
            "$ref": "Text"
          }
        },
        "mustKnow": {
          "description": "The user-visible list of important notes, use for details such as age restrictions or other conditions that make this service unsuitable.",
          "items": {
            "$ref": "Text"
          },
          "type": "array"
        },
        "highlights": {
          "type": "array",
          "description": "The user-visible list of highlights.",
          "items": {
            "$ref": "Text"
          }
        }
      },
      "type": "object",
      "description": "Content fields specific to Tours and Activities. Each element in the repeated field should be independent to allow separate rendering (e.g. as a bullet point). Populating ToursAndActivitiesContent is strongly recommended for tours and activities, but not strictly required. All fields support both plain-text and HTML-like text for basic formatting. Supported HTML-like formatting tags: Phrase tags: , "
    },
    "MaddenIngestionOfferOfferRestrictions": {
      "id": "MaddenIngestionOfferOfferRestrictions",
      "properties": {
        "combinableOfferIds": {
          "description": "List of offer_ids that this offer can be combined with. Some offers may only be combined with certain specific other offer_ids (can be considered parent offers). If combinable_with_other_offers is true and this field is unset all offer ids will be combinable.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "exclusions": {
          "type": "array",
          "description": "List of conditions that would invalidate the offer (e.g., buffet, combo offers, and cocktails ).",
          "items": {
            "$ref": "MaddenIngestionOfferOfferCondition"
          }
        },
        "combinableOfferCategories": {
          "description": "List of offer types that this offer can be combined with. For example, this offer may be combinable with other Coupons. If combinable_with_other_offers is true and this field is unset all types will be combinable.",
          "items": {
            "type": "string",
            "enumDescriptions": [
              "The UNSPECIFIED or default enum value should not be used in feeds.",
              "",
              "",
              "",
              "",
              ""
            ],
            "enum": [
              "OFFER_CATEGORY_UNSPECIFIED",
              "OFFER_CATEGORY_BASE_OFFER",
              "OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER",
              "OFFER_CATEGORY_ADD_ON_COUPON_OFFER",
              "OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER",
              "OFFER_CATEGORY_ADD_ON_FEE_REDUCTION_OFFER"
            ]
          },
          "type": "array"
        },
        "minGuest": {
          "description": "The minimum number of people required to avail the offer.",
          "format": "int32",
          "type": "integer"
        },
        "combinableWithOtherOffers": {
          "description": "Whether this offer can be combined with other offers. When true, partners can specify what offers this offer can be combined with. If both combinable_offer_categories & combinable_offer_ids are set then any offer matching one of the conditions above will be combinable.",
          "type": "boolean"
        },
        "inclusions": {
          "description": "List of conditions that must be met for the offer to be valid (e.g., non-alcoholic drinks, food).",
          "items": {
            "$ref": "MaddenIngestionOfferOfferCondition"
          },
          "type": "array"
        },
        "specialConditions": {
          "type": "array",
          "description": "Special conditions for this offer that must be shown to the user. Examples: \"Only valid for payment in [area]\", \"Excludes online payments\", \"Gift Voucher CAN be used during the Sale.\"",
          "items": {
            "type": "string"
          }
        },
        "foodOfferRestrictions": {
          "description": "Restrictions specific to food offers.",
          "$ref": "MaddenIngestionOfferFoodOfferRestrictions"
        },
        "maxRedemptionCount": {
          "type": "string",
          "format": "int64",
          "description": "Restrictions specific to amount of times this offer can be used. The value of 0 would specify there are no limits. For example a value of 3 would mean the user can utilize this offer 3 times."
        },
        "maxTotalDiscountValue": {
          "description": "The maximum discount that can be availed across multiple transactions of this offer.",
          "$ref": "Money"
        }
      },
      "type": "object",
      "description": "[START offer_restrictions_definition] Next tag: 11"
    },
    "FoodOrderingServiceV1Locality": {
      "type": "object",
      "id": "FoodOrderingServiceV1Locality",
      "properties": {
        "countryCode": {
          "type": "string"
        },
        "postalCode": {
          "description": "Postal code in the country's local format in string.",
          "type": "string"
        }
      },
      "description": "[START epa_geolocation_locality] Geolocation of interests."
    },
    "FoodOrderingServiceV1TimeOfDayWindow": {
      "type": "object",
      "id": "FoodOrderingServiceV1TimeOfDayWindow",
      "properties": {
        "timeWindows": {
          "$ref": "FoodOrderingServiceV1TimeOfDayRange",
          "description": "The time window the order can be placed/fulfilled. Required."
        },
        "dayOfWeek": {
          "type": "array",
          "description": "The list of days in a week the windows are applied. Required. If not given, we assume 7 days a week.",
          "items": {
            "enumDescriptions": [
              "The day of the week is unspecified.",
              "Monday",
              "Tuesday",
              "Wednesday",
              "Thursday",
              "Friday",
              "Saturday",
              "Sunday"
            ],
            "enum": [
              "DAY_OF_WEEK_UNSPECIFIED",
              "MONDAY",
              "TUESDAY",
              "WEDNESDAY",
              "THURSDAY",
              "FRIDAY",
              "SATURDAY",
              "SUNDAY"
            ],
            "type": "string"
          }
        }
      },
      "description": "[START epa_time_of_day_window_definition] The TimeWindow object is a composite entity that describes a list of windows the user's order can be either placed or fulfilled."
    },
    "TimeOfDay": {
      "type": "object",
      "id": "TimeOfDay",
      "properties": {
        "minutes": {
          "description": "Minutes of an hour. Must be greater than or equal to 0 and less than or equal to 59.",
          "format": "int32",
          "type": "integer"
        },
        "nanos": {
          "description": "Fractions of seconds, in nanoseconds. Must be greater than or equal to 0 and less than or equal to 999,999,999.",
          "format": "int32",
          "type": "integer"
        },
        "hours": {
          "format": "int32",
          "type": "integer",
          "description": "Hours of a day in 24 hour format. Must be greater than or equal to 0 and typically must be less than or equal to 23. An API may choose to allow the value \"24:00:00\" for scenarios like business closing time."
        },
        "seconds": {
          "type": "integer",
          "format": "int32",
          "description": "Seconds of a minute. Must be greater than or equal to 0 and typically must be less than or equal to 59. An API may allow the value 60 if it allows leap-seconds."
        }
      },
      "description": "Represents a time of day. The date and time zone are either not significant or are specified elsewhere. An API may choose to allow leap seconds. Related types are google.type.Date and `google.protobuf.Timestamp`."
    },
    "Entity": {
      "description": "Represents an entity related to the event.",
      "id": "Entity",
      "properties": {
        "name": {
          "description": "Name of the entity. (required)",
          "type": "string"
        },
        "url": {
          "description": "Url of the webpage that unambiguously describes the entity. This is the webpage on the partner's website for the entity if any; for other public URLs of the entity, use relevant_url in public_identification_data. (optional)",
          "type": "string"
        },
        "publicIdentificationData": {
          "description": "Public references of the entity. (optional)",
          "$ref": "PublicIdentificationData"
        },
        "entityType": {
          "type": "string",
          "enumDescriptions": [
            "Not specified. Do not use.",
            "The entity represents the artist or group performing at a concert or a show. Only applicable when event category is CONCERT or THEATRE.",
            "The entity represents the sports team or player at the event. Only applicable when event category is SPORTS.",
            "The entity represents the tour that this event belongs to. Only applicable when event category is CONCERT.",
            "The entity represents a sports tournament that this event belongs to. Only applicable when event category is SPORTS.",
            "The entity represents the type of play (e.g., musical, comedy, ballet, etc.) performed at the event. Only applicable when event category is THEATRE."
          ],
          "description": "The type of the entity. (optional)",
          "enum": [
            "ENTITY_TYPE_UNSPECIFIED",
            "ENTITY_TYPE_PERFORMER",
            "ENTITY_TYPE_PLAYER",
            "ENTITY_TYPE_CONCERT_TOUR",
            "ENTITY_TYPE_SPORTS_SERIES",
            "ENTITY_TYPE_PLAY"
          ]
        },
        "entityRole": {
          "enumDescriptions": [
            "Not specified.",
            "The entity represents a headliner or leading performer at the event.",
            "The entity represents a supporting performer at the event.",
            "The entity represents the home team at the (sports) event.",
            "The entity represents the away team at the (sports) event."
          ],
          "description": "The role of the entity in the event. (optional)",
          "enum": [
            "ENTITY_ROLE_UNSPECIFIED",
            "ENTITY_ROLE_HEADLINER",
            "ENTITY_ROLE_SUPPORTER",
            "ENTITY_ROLE_HOME_TEAM",
            "ENTITY_ROLE_AWAY_TEAM"
          ],
          "type": "string"
        },
        "id": {
          "description": "Unique identifier of the entity in the partner's database. (optional)",
          "type": "string"
        }
      },
      "type": "object"
    },
    "PostalAddress": {
      "description": "Address of a customer or a business.",
      "type": "object",
      "id": "PostalAddress",
      "properties": {
        "streetAddress": {
          "description": "The street address, e.g. \"1600 Amphitheatre Pkwy\". (required)",
          "type": "string"
        },
        "addressCountry": {
          "description": "The country, specified using its ISO 3166-1 alpha-2 country code, e.g. \"US\" (required)",
          "type": "string"
        },
        "addressRegion": {
          "description": "The region, e.g. \"CA\". This field is only required in countries where region is commonly a part of the address. (optional)",
          "type": "string"
        },
        "addressLocality": {
          "description": "The locality, e.g. \"Mountain View\". (required)",
          "type": "string"
        },
        "postalCode": {
          "description": "The postal code, e.g. \"94043\". (required)",
          "type": "string"
        }
      }
    },
    "MoneyRange": {
      "type": "object",
      "id": "MoneyRange",
      "properties": {
        "minAmount": {
          "description": "Minimum amount.",
          "$ref": "Money"
        },
        "maxAmount": {
          "$ref": "Money",
          "description": "Maximum amount."
        }
      },
      "description": "Wrapper for a range of monetary amount that could be bounded or unbounded. At least one of min_amount and max_amount is required."
    },
    "PerTicketFee": {
      "id": "PerTicketFee",
      "properties": {
        "serviceCharge": {
          "description": "An extra charge assessed for a service.",
          "$ref": "Price"
        },
        "taxes": {
          "$ref": "Price",
          "description": "Per ticket taxes."
        },
        "facilityFee": {
          "description": "A fee that goes to the venue/facility.",
          "$ref": "Price"
        }
      },
      "type": "object",
      "description": "Fees that must be paid for each ticket the user purchases."
    },
    "PublicIdentificationData": {
      "description": "Identifiers, webpages, or any other public sources that reference an entity.",
      "type": "object",
      "id": "PublicIdentificationData",
      "properties": {
        "relevantUrl": {
          "description": "Public URL of any webpage that is dedicated to only the topic. This could include official websites, discogs, social media platforms, wikipedia or imdb pages, e.g. https://www.discogs.com/artist/1124645-Taylor-Swift, https://www.wikidata.org/wiki/Q19320959, https://twitter.com/acmilan. (optional)",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "musicbrainzId": {
          "description": "The 36-character musicbrainz identifier of the artist or other music entities, if applicable. See https://musicbrainz.org/doc/MusicBrainz_Identifier. (optional)",
          "type": "string"
        }
      }
    },
    "MatchedProvider": {
      "description": "Local services provider.",
      "id": "MatchedProvider",
      "properties": {
        "customerId": {
          "type": "string",
          "format": "int64",
          "description": "Google local services external customer ID."
        },
        "categories": {
          "type": "array",
          "description": "Local service categories (verticals). E.g. \"plumber\" and \"carpet_cleaning\".",
          "items": {
            "type": "string"
          }
        }
      },
      "type": "object"
    },
    "MaddenIngestionOfferGiftCardInfo": {
      "description": "[START gift_card_info_definition]",
      "type": "object",
      "id": "MaddenIngestionOfferGiftCardInfo",
      "properties": {
        "fixedDenominations": {
          "description": "Used when the gift card is available in specific, fixed amounts.",
          "$ref": "MaddenIngestionOfferFixedDenominations"
        },
        "customRange": {
          "$ref": "MaddenIngestionOfferMoneyRange",
          "description": "Used when the brand allows users to choose a custom (flexible) face value within a defined range."
        }
      }
    },
    "CreditCardRestrictions": {
      "type": "object",
      "id": "CreditCardRestrictions",
      "properties": {
        "creditCardType": {
          "description": "A list of supported credit cards. No credit cards are supported if empty.",
          "items": {
            "type": "string",
            "enumDescriptions": [
              "Unused.",
              "A Visa credit card.",
              "A Mastercard credit card.",
              "An American Express credit card.",
              "A Discover credit card.",
              "A JCB credit card."
            ],
            "enum": [
              "CREDIT_CARD_TYPE_UNSPECIFIED",
              "VISA",
              "MASTERCARD",
              "AMERICAN_EXPRESS",
              "DISCOVER",
              "JCB"
            ]
          },
          "type": "array"
        }
      },
      "description": "Restrictions to the credit card types this merchant accepts."
    },
    "Availability": {
      "type": "object",
      "id": "Availability",
      "properties": {
        "schedulingRuleOverrides": {
          "$ref": "SchedulingRuleOverrides",
          "description": "Availability scheduling rules. If fields are populated, they will override any corresponding scheduling rules on the service-level SchedulingRules."
        },
        "resources": {
          "description": "Optional resources used to disambiguate this availability slot from others when different staff members, or rooms are part of the service. E.g. the same Yoga class with two 2 instructors: ``` availability { resources { staff_id: \"1\" staff_name: \"Amy\" } spots_total: 10 spots_open: 7 } availability { resources { staff_id: \"2\" staff_name: \"John\" } spots_total: 5 spots_open: 2 } ```",
          "$ref": "Resources"
        },
        "startTime": {
          "description": "Start time of the appointment slot.",
          "type": "string",
          "format": "google-datetime"
        },
        "duration": {
          "format": "google-duration",
          "type": "string",
          "description": "Duration of the appointment slot"
        },
        "spotsOpen": {
          "description": "Number of open spots.",
          "format": "int64",
          "type": "string"
        },
        "prepayment": {
          "description": "Optional. Optional prepayment information for this availability.",
          "$ref": "Prepayment"
        },
        "ticketTypeId": {
          "type": "array",
          "description": "Indicates a list of supported ticket types for this availability slot. If unset, all ticket types in the parent service are available for this slot. Note that the values of this field must be defined in the parent service. Examples: * Service with four ticket types: TicketType {ticket_type_id: \"adult_1\" short_description: \"Adult weekdays\"} TicketType {ticket_type_id: \"adult_2\" short_description: \"Adult weekends\"} TicketType {ticket_type_id: \"youth_1\" short_description: \"Youth weekdays\"} TicketType {ticket_type_id: \"youth_2\" short_description: \"Youth weekends\"} To represent the inventory during the weekdays: `availability {ticket_type_id: \"adult_1\" ticket_type_id: \"youth_1\"...}`. To represent the inventory during the holidays: `availability {ticket_type_id: \"adult_2\" ticket_type_id: \"youth_2\"...}`. * Service with three ticket types: TicketType {ticket_type_id: \"adult\" short_description: \"Adult\"} TicketType {ticket_type_id: \"youth\" short_description: \"Youth\"} TicketType {ticket_type_id: \"senior\" short_description: \"Senior\"} To indicate that all three ticket types are available for this time slot, use either `availability {ticket_type_id: \"adult\" ticket_type_id: \"youth\" ticket_type_id: \"senior\" ...}` or `availability {...}' (do not set ticket_type_id in this slot). (optional)",
          "items": {
            "type": "string"
          }
        },
        "requireCreditCard": {
          "description": "Indicates whether the user must provide a credit card in order to book this availability slot. If the value is not set, it is inherited from the service level if it's set there. (optional)",
          "enum": [
            "REQUIRE_CREDIT_CARD_UNSPECIFIED",
            "REQUIRE_CREDIT_CARD_CONDITIONAL",
            "REQUIRE_CREDIT_CARD_ALWAYS"
          ],
          "enumDescriptions": [
            "The credit card requirement is not explicitly specified and the behaviour is identical to the one specified for CONDITIONAL.",
            "Google will require a credit card for the booking if any of the following conditions are met: * the availability has a price and the prepayment_type is REQUIRED * the no_show_fee is set * the deposit field is set.",
            "A credit card is always required in order to book this availability regardless of other field values."
          ],
          "type": "string"
        },
        "noShowFee": {
          "description": "Optional no show fee for this availability. Overrides the service no show fee if one was specified.",
          "$ref": "NoShowFee"
        },
        "confirmationMode": {
          "description": "The confirmation mode that will be used when booking this availability. Attempts to create bookings for availabilities with a confirmation mode of CONFIRMATION_MODE_SYNCHRONOUS must be immediatlely confirmed or denied. Attempts to create bookings for availabilities with confirmation mode of CONFIRMATION_MODE_ASYNCHRONOUS must be either immediately denied or created with status PENDING.",
          "enum": [
            "CONFIRMATION_MODE_UNSPECIFIED",
            "CONFIRMATION_MODE_SYNCHRONOUS",
            "CONFIRMATION_MODE_ASYNCHRONOUS"
          ],
          "enumDescriptions": [
            "The confirmation mode was not specified. Synchronous confirmation will be assumed.",
            "Bookings for this availability will be confirmed synchronously.",
            "Bookings for this availability will be confirmed asynchronously."
          ],
          "type": "string"
        },
        "deposit": {
          "description": "Optional deposit for this availability. Overrides the service deposit if one was specified.",
          "$ref": "Deposit"
        },
        "durationRequirement": {
          "description": "The requirement to show the slots duration and/or endtime. This field will be ignored if the slot is unavailable. Not used in the Things-To-Do vertical. (optional)",
          "enum": [
            "DURATION_REQUIREMENT_UNSPECIFIED",
            "DO_NOT_SHOW_DURATION",
            "MUST_SHOW_DURATION"
          ],
          "enumDescriptions": [
            "The handling of the end time is not specified. This is the default.",
            "The end time is not shown to the user.",
            "The end time has to be shown to the user before an appointment can be made."
          ],
          "type": "string"
        },
        "availabilityTag": {
          "description": "An optional opaque string to identify this availability slot. If set, it will be included in the requests that book/update/cancel appointments.",
          "type": "string"
        },
        "recurrence": {
          "description": "The recurrence information for the availability, representing more than one start time. A recurrence should contain appointments for one working day.",
          "$ref": "Recurrence"
        },
        "paymentOptionId": {
          "type": "array",
          "description": "A list of ids referencing the payment options which can be used to pay for this slot. The actual payment options are defined at the Merchant level, and can also be shared among multiple Merchants. This field overrides any payment_option_ids specified in the service message. Similarly payment_option_ids specified here do NOT have to be present in the service message, though must be defined at the Merchant level.",
          "items": {
            "type": "string"
          }
        },
        "scheduleException": {
          "type": "array",
          "description": "Times when this service cannot be scheduled. To limit the number of schedule_exception messages, consider joining adjacent exceptions.",
          "items": {
            "$ref": "ScheduleException"
          }
        },
        "spotsTotal": {
          "type": "string",
          "format": "int64",
          "description": "Number of total spots and open spots of this availability. Examples: * Yoga class of 10 spots with 3 booked: `availability {spots_total: 10, spots_open: 7 ...}` * Chair massage session which is already fully booked: `availability {spots_total: 1, spots_open: 0 ...}` Note: If sending requests using the availability compression format defined below, these two fields will be inferred. * A Recurrence implies `spots_total=1` and `spots_open=1`. * A ScheduleException implies `spots_total=1` and `spots_open=0`."
        },
        "linkoutRequiredReason": {
          "type": "string",
          "description": "Optional. The reason a linkout is required for this slot. If set, the Merchant resource for this slot must have a valid LinkoutTemplate. (optional)",
          "enum": [
            "LINKOUT_REQUIRED_REASON_UNSPECIFIED",
            "PAYMENT_REQUIRED"
          ],
          "enumDescriptions": [
            "Default value: Do not use, equates to unknown.",
            "Slot requires payment in the partner platform to be booked."
          ]
        }
      },
      "description": "An availability slot of the merchant's service, indicating time and number of spots."
    },
    "FoodOrderingServiceV1ETA": {
      "description": "[START epa_eta_definition] Lead time range [min, max). At least one of min or max needs to be provided. A fixed value can be provided by setting both min and max to the same value.",
      "id": "FoodOrderingServiceV1ETA",
      "properties": {
        "minLeadTimeDuration": {
          "type": "string",
          "format": "google-duration",
          "description": "Indicates a range of ETA duration."
        },
        "maxLeadTimeDuration": {
          "format": "google-duration",
          "type": "string"
        }
      },
      "type": "object"
    },
    "NoFee": {
      "description": "No fee required for the fulfillment method associated with the action link.",
      "id": "NoFee",
      "properties": {},
      "type": "object"
    },
    "AvailableDay": {
      "type": "object",
      "id": "AvailableDay",
      "properties": {
        "lastOrderingTime": {
          "format": "google-datetime",
          "type": "string",
          "description": "Required. Unix timestamp. The last time a user could order, and receive items by `fulfillment_date`. In other words, after last_ordering_time, fulfillment_date will no longer be shown as available. For example, if the fulfillment_date is 2020-08-10: - a last_ordering_time value of 2020-08-10 18:00 means that, in order to receive their order on 2020-08-10, a customer must make that order by 6pm that same day. - a last_ordering_time value of 2020-08-08 20:00 means that, in order to receive their order on 2020-08-10, a customer must make that order by 8pm two days prior."
        },
        "fulfillmentDate": {
          "$ref": "Date",
          "description": "Required. An available date for a fulfillment method. Assumed to be in merchant's timezone."
        }
      },
      "description": "Day level availability."
    },
    "FixedFee": {
      "description": "The fixed fee required for the fulfillment method associated with the action link.",
      "type": "object",
      "id": "FixedFee",
      "properties": {
        "amount": {
          "description": "Required. The amount of the fixed fee for the fulfillment method.",
          "$ref": "Price"
        }
      }
    },
    "Price": {
      "id": "Price",
      "properties": {
        "pricingOptionTag": {
          "description": "An optional and opaque string that identifies the pricing option that is associated with the extended price.",
          "type": "string"
        },
        "priceMicros": {
          "description": "The price in micro-units of the currency. Fractions of smallest currency unit will be rounded using nearest even rounding. (e.g. For USD 2.5 cents rounded to 2 cents, 3.5 cents rounded to 4 cents, 0.5 cents rounded to 0 cents, 2.51 cents rounded to 3 cents).",
          "format": "int64",
          "type": "string"
        },
        "currencyCode": {
          "description": "The currency of the price that is defined in ISO 4217.",
          "type": "string"
        }
      },
      "type": "object",
      "description": "The price of a service or a fee."
    },
    "FoodOrderingServiceV1Fee": {
      "description": "[START epa_fee_definition]",
      "type": "object",
      "id": "FoodOrderingServiceV1Fee",
      "properties": {
        "feeId": {
          "description": "Unique identifier to the Fee entity. Required.",
          "type": "string"
        },
        "fixedAmount": {
          "$ref": "Money",
          "description": "A fixed amount of fees to be collected."
        },
        "areaIds": {
          "description": "Service area can be provided to further restrict eligibility of the fee. Optional.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "rangeAmount": {
          "$ref": "FoodOrderingServiceV1MoneyRange",
          "description": "A range of fees that could be collected. Will mirror madden.ingestion.MoneyRange for the starting point."
        },
        "cartPercentage": {
          "$ref": "FoodOrderingServiceV1PercentageBasedFee",
          "description": "Fees in terms of amount percentage. Will mirror madden.ingestion.QuantitativeValue for the starter."
        },
        "serviceIds": {
          "description": "Service association needs to be provided. Required.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "feeType": {
          "enumDescriptions": [
            "",
            "",
            ""
          ],
          "description": "Indicates the nature of the service, e.g. delivery fee/service fee. Required.",
          "enum": [
            "FEE_TYPE_UNKNOWN",
            "DELIVERY",
            "SERVICE"
          ],
          "type": "string"
        }
      }
    },
    "EventCreator": {
      "type": "object",
      "id": "EventCreator",
      "properties": {
        "name": {
          "description": "Optional. Name of the event creator. No character restriction.",
          "type": "string"
        }
      },
      "description": "Information about the creator of the event. Only relevant for platforms that include user-generated content events."
    },
    "RangeValue": {
      "description": "Range of values such that `min_value` \u003c `max_value`. Requires at least one of `min_value` and `max_value`.",
      "id": "RangeValue",
      "properties": {
        "minValue": {
          "description": "Minimum value.",
          "type": "number",
          "format": "double"
        },
        "maxValue": {
          "description": "Maximum value.",
          "format": "double",
          "type": "number"
        }
      },
      "type": "object"
    },
    "Rating": {
      "type": "object",
      "id": "Rating",
      "properties": {
        "numberOfRatings": {
          "description": "Number of ratings used in calculating the value (required).",
          "format": "uint64",
          "type": "string"
        },
        "value": {
          "type": "number",
          "format": "double",
          "description": "Average rating value (required when number_of_ratings \u003e 0). The value must be in the range of [1, 5] and can be omitted if and only if the number_of_ratings is zero."
        }
      },
      "description": "Defines Rating for an entity."
    },
    "TokenizationConfig": {
      "description": "A configuration for payment-processor tokenization, set up on a per-Merchant basis.",
      "id": "TokenizationConfig",
      "properties": {
        "tokenizationParameter": {
          "description": "A tokenization configuration will typically have one tokenization_parameter whose key is \"gateway\" and whose value is the name of the processor. The rest of the parameters are dependent on the processor. See Google Pay's documentation for further information. Braintree example: tokenization_parameter { key: \"gateway\" value: \"braintree\" } tokenization_parameter { key: \"braintree:apiVersion\" value: \"v1\" } tokenization_parameter { key: \"braintree:sdkVersion\" value: \"2.30.0\" } tokenization_parameter { key: \"braintree:merchantId\" value: \"abcdef\" } tokenization_parameter { key: \"braintree:clientKey\" value: \"production_xxx_yyy\" } Stripe example: tokenization_parameter { key: \"gateway\" value: \"stripe\" } tokenization_parameter { key: \"stripe:version\" value: \"2018-02-28\" } tokenization_parameter { key: \"stripe:publishableKey\" value: \"pk_1234\" } Adyen example: tokenization_parameter { key: \"gateway\" value: \"adyen\" } tokenization_parameter { key: \"gatewayMerchantId\" value: \"yourId\" }",
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        "billingInformationFormat": {
          "type": "string",
          "enumDescriptions": [
            "Not specified. Defaults to MIN.",
            "name, country code, and postal code (Google Pay default setting).",
            "name, street address, locality, region, country code, and postal code."
          ],
          "description": "Include in the payment token the user's billing information as entered into Google Pay with their FOP (see above). Leaving the field empty is equivalent to specifying MIN.",
          "enum": [
            "BILLING_INFORMATION_FORMAT_UNSPECIFIED",
            "MIN",
            "FULL"
          ]
        }
      },
      "type": "object"
    },
    "ReplaceServiceAvailabilityRequest": {
      "description": "The request to replace a Service's availability.",
      "type": "object",
      "id": "ReplaceServiceAvailabilityRequest",
      "properties": {
        "serviceAvailability": {
          "$ref": "ServiceAvailability",
          "description": "The service availability that is used to replace the existing ones."
        }
      }
    },
    "EventMetadata": {
      "type": "object",
      "id": "EventMetadata",
      "properties": {
        "surface": {
          "description": "Predetermined event surface associated with an action link. This is only used for Events vertical.",
          "enum": [
            "SURFACE_UNSPECIFIED",
            "SURFACE_SEARCH",
            "SURFACE_YOUTUBE",
            "SURFACE_ADS"
          ],
          "enumDescriptions": [
            "The surface is unspecified.",
            "The action link is booking a event ticket in Search.",
            "The action link is booking a event ticket in YouTube.",
            "The action link is clicking on an ad for the event."
          ],
          "type": "string"
        }
      },
      "description": "Additional information about action link which is unique to the events vertical."
    },
    "TicketType": {
      "description": "TicketType is used to differentiate among tickets with different prices and/or availabilities due to different user types, different service attributes, or different options/add-ons. A ticket is the minimal bookable unit to a service, e.g. a spot on a rafting trip, an admission to a museum, a full day double kayak rental.",
      "id": "TicketType",
      "properties": {
        "ticketTypeId": {
          "description": "The ticket id is used to differentiate among different ticket types of the same service, and is only expected to be unique within a service.",
          "type": "string"
        },
        "optionDescription": {
          "description": "Description of any additional option which this ticket type represents, if any. Deprecated, use localized_option_description instead.",
          "type": "string"
        },
        "priceDisplayType": {
          "description": "Optional. Predetermined price display type of a single ticket of this type.",
          "enum": [
            "PRICE_DISPLAY_TYPE_UNSPECIFIED",
            "PRICE_DISPLAY_TYPE_BASE",
            "PRICE_DISPLAY_TYPE_ALL_IN"
          ],
          "enumDescriptions": [
            "The price display type is unspecified. Google will determine which format to show.",
            "The price shown on the landing page is the base price.",
            "The price shown on the landing page includes all fees and taxes."
          ],
          "type": "string"
        },
        "price": {
          "description": "The price of a single ticket of this type, exclusive of any taxes. The tax rate of Service is applied to its tickets.",
          "$ref": "Price"
        },
        "localizedShortDescription": {
          "$ref": "Text",
          "description": "A short description to this TicketType with i18n support. This can be user visible, e.g., “adult”, \"child\", “veteran”, “Row J”, etc. Required, each ticket type should have a description to be user visible. Separate values could be supplied for each locale."
        },
        "shortDescription": {
          "description": "A short description to this TicketType. This can be user visible, e.g., “adult”, \"child\", “veteran”, “Row J”, etc. Required, each ticket type should have a description to be user visible. Deprecated, use localized_short_description instead.",
          "type": "string"
        },
        "localizedOptionDescription": {
          "$ref": "Text",
          "description": "Description of any additional option which this ticket type represents, if any. Separate values could be supplied for each locale. Additional options are useful when the ticket type represents multiple dimensions. Example 1: an admission ticket with different types 'adult', 'child' and language as an additional option, the expected TicketType list would be: - { ticket_type_id: \"ticket_type_1\" localized_short_description { value: \"adult\" } localized_option_description { value: \"english\" } } - { ticket_type_id: \"ticket_type_2\" localized_short_description { value: \"adult\" } localized_option_description { value: \"spanish\" } } - { ticket_type_id: \"ticket_type_3\" localized_short_description { value: \"child\" } localized_option_description { value: \"english\" } } - { ticket_type_id: \"ticket_type_4\" localized_short_description { value: \"child\" } localized_option_description { value: \"spanish\" } } Example 2: an multi-hour kayak rental with optional dry bag add-on, the short_description could be \"3 hours\" and the option_description could be either \"with dry bag\" or \"without dry bag\": - { ticket_type_id: \"ticket_type_1\" localized_short_description { value: \"2 hours\" } localized_option_description { value: \"english\" } } - { ticket_type_id: \"ticket_type_2\" localized_short_description { value: \"2 hours\" } localized_option_description { value: \"spanish\" } } - { ticket_type_id: \"ticket_type_3\" localized_short_description { value: \"3 hours\" } localized_option_description { value: \"english\" } } - { ticket_type_id: \"ticket_type_4\" localized_short_description { value: \"3 hours\" } localized_option_description { value: \"spanish\" } } Optional, but if any ticket type within the service has this field set, we expect all other ticket types to have this field set as well (a default option_description could be used). E.g. [{ticket_type_1, adult, english}, {ticket_type_1, adult, ''}] is not a valid list. Only two HTML formatting tags are supported: "
        },
        "perTicketFee": {
          "description": "Additional fees for purchasing this ticket. (optional)",
          "$ref": "PerTicketFee"
        },
        "inventoryType": {
          "enumDescriptions": [
            "The inventory type is unspecified.",
            "Primary inventory.",
            "Verified resale inventory.",
            "Resale inventory.",
            "Aggregator inventory. Aggregator (e.g. www.bandsintown.com) means the partner provides events and tickets information. But the tickets are not sold by the partner directly. The actual tickets seller can be primary, verified resale or resale. Now we only differentiate top level partner inventory type and ignore the actual tickets seller inventory type within an aggregator."
          ],
          "description": "Optional. Predetermined inventory type of a single ticket of this type.",
          "enum": [
            "INVENTORY_TYPE_UNSPECIFIED",
            "INVENTORY_TYPE_PRIMARY",
            "INVENTORY_TYPE_VERIFIED_RESALE",
            "INVENTORY_TYPE_RESALE",
            "INVENTORY_TYPE_AGGREGATOR"
          ],
          "type": "string"
        }
      },
      "type": "object"
    },
    "GenericDeleteRecord": {
      "description": "Record to be deleted of the feed type mentioned in url request.",
      "id": "GenericDeleteRecord",
      "properties": {
        "dataRecord": {
          "type": "string",
          "format": "byte",
          "description": "For non-proto based feeds."
        },
        "protoRecord": {
          "description": "For proto-based feeds.",
          "type": "object",
          "additionalProperties": {
            "type": "any",
            "description": "Properties of the object. Contains field @type with type URL."
          }
        },
        "deleteTime": {
          "format": "google-datetime",
          "type": "string",
          "description": "Required. This timestamp is used to determine the order in which a delete will be applied to the inventory."
        }
      },
      "type": "object"
    },
    "LatLng": {
      "description": "An object that represents a latitude/longitude pair. This is expressed as a pair of doubles to represent degrees latitude and degrees longitude. Unless specified otherwise, this object must conform to the WGS84 standard. Values must be within normalized ranges.",
      "type": "object",
      "id": "LatLng",
      "properties": {
        "latitude": {
          "description": "The latitude in degrees. It must be in the range [-90.0, +90.0].",
          "type": "number",
          "format": "double"
        },
        "longitude": {
          "format": "double",
          "type": "number",
          "description": "The longitude in degrees. It must be in the range [-180.0, +180.0]."
        }
      }
    },
    "BatchPushGenericRecordRequest": {
      "description": "The batch request to insert and/or update records of feed type specified in the request url.",
      "id": "BatchPushGenericRecordRequest",
      "properties": {
        "records": {
          "type": "array",
          "description": "Records to be inserted and/or updated. Maximum of 1000 records are allowed in one api call.",
          "items": {
            "$ref": "GenericRecord"
          }
        }
      },
      "type": "object"
    },
    "BookingStatus": {
      "id": "BookingStatus",
      "properties": {
        "hasValidFutureInventory": {
          "description": "True if the merchant has inventory in the next 30 day. Doesn't guarantee the merchant is actually served.",
          "type": "boolean"
        }
      },
      "type": "object",
      "description": "Status related to end-to-end booking integration."
    },
    "Money": {
      "description": "Represents an amount of money with its currency type.",
      "id": "Money",
      "properties": {
        "units": {
          "description": "The whole units of the amount. For example if `currencyCode` is `\"USD\"`, then 1 unit is one US dollar.",
          "type": "string",
          "format": "int64"
        },
        "nanos": {
          "description": "Number of nano (10^-9) units of the amount. The value must be between -999,999,999 and +999,999,999 inclusive. If `units` is positive, `nanos` must be positive or zero. If `units` is zero, `nanos` can be positive, zero, or negative. If `units` is negative, `nanos` must be negative or zero. For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.",
          "format": "int32",
          "type": "integer"
        },
        "currencyCode": {
          "description": "The three-letter currency code defined in ISO 4217.",
          "type": "string"
        }
      },
      "type": "object"
    },
    "PaymentRestrictions": {
      "id": "PaymentRestrictions",
      "properties": {
        "creditCardRestrictions": {
          "description": "Restrictions to the credit cards this merchant accepts. We assume all credit cards are accepted if this field is not set. Note that the list of cards supported by CreditCardType will grow over time, meaning that leaving this empty subjects a configuration to future changes.",
          "$ref": "CreditCardRestrictions"
        }
      },
      "type": "object",
      "description": "Restrictions to the payment methods this merchant accepts."
    },
    "PrepaymentTerms": {
      "type": "object",
      "id": "PrepaymentTerms",
      "properties": {
        "chargeTimeBeforeStartTimeSec": {
          "description": "Time in seconds before the service start time that the user is charged for payment. This field should only be set when ChargeTiming is CHARGE_LATER.",
          "type": "string",
          "format": "int64"
        },
        "chargeTiming": {
          "type": "string",
          "enumDescriptions": [
            "Unused.",
            "Customer will be charged immediately.",
            "Customer will be charged later."
          ],
          "description": "When the charge will occur relative to the purchase time.",
          "enum": [
            "CHARGE_TIMING_UNSPECIFIED",
            "CHARGE_NOW",
            "CHARGE_LATER"
          ]
        }
      },
      "description": "Specific information around when prepayment is completed."
    },
    "SchedulingRuleOverrides": {
      "description": "Availability level scheduling rules.",
      "type": "object",
      "id": "SchedulingRuleOverrides",
      "properties": {
        "lastOnlineCancellableSec": {
          "type": "string",
          "format": "int64",
          "description": "If set, the last time (in seconds since the Unix epoch) that this specific appointment slot can be cancelled through Reserve with Google. This field will override any service-level cancellation rules. (optional)"
        },
        "firstBookableSec": {
          "type": "string",
          "format": "int64",
          "description": "The first time (in seconds) that this slot is able to be booked. This timestamp must be before the start_sec of the slot, or last_bookable_sec if specified."
        },
        "lastBookableSec": {
          "format": "int64",
          "type": "string",
          "description": "The last time (in seconds) that this slot is able to be booked. This timestamp must be before the start_sec of the slot to be respected (if users should be able to book after the start time, use service level SchedulingRules.min_booking_before_end_time). If present, will override anything specified in the min_booking_buffer of the corresponding Service's SchedulingRules."
        }
      }
    },
    "FoodOrderingServiceV1ServiceHours": {
      "id": "FoodOrderingServiceV1ServiceHours",
      "properties": {
        "hoursId": {
          "description": "Unique identifier of the provided advance service hours. Required.",
          "type": "string"
        },
        "orderableTime": {
          "description": "When advance ordering services, this is the time windows the orders can be placed. Required when advance_hour is given. Invalid when asap_hour is given.",
          "items": {
            "$ref": "FoodOrderingServiceV1TimeOfDayWindow"
          },
          "type": "array"
        },
        "advanceHours": {
          "type": "array",
          "items": {
            "$ref": "FoodOrderingServiceV1AdvanceTimeWindow"
          }
        },
        "serviceIds": {
          "type": "array",
          "description": "The unique identifier of the Service entity correlated to this ServiceHours entity. Required.",
          "items": {
            "type": "string"
          }
        },
        "asapHours": {
          "description": "The hours the orders can be fulfilled. For ASAP services, this is also orderable time. One of the fields (asap_hours/advance_hours) is required to be set.",
          "items": {
            "$ref": "FoodOrderingServiceV1AsapTimeWindow"
          },
          "type": "array"
        },
        "specialHour": {
          "description": "Indicates if the service hours are for special occasions (e.g. Thanksgiving/...) Optional",
          "type": "boolean"
        },
        "validityRange": {
          "$ref": "FoodOrderingServiceV1ValidityRange",
          "description": "A timestamp window indicating the validity of the special hours. Optional. Required if it's special hours."
        }
      },
      "type": "object",
      "description": "[START epa_service_hours_definition] Service hours entity for ASAP/Advance orders."
    },
    "MaddenIngestionOfferOfferCondition": {
      "description": "[START offer_condition_definition]",
      "type": "object",
      "id": "MaddenIngestionOfferOfferCondition",
      "properties": {
        "description": {
          "type": "string"
        }
      }
    },
    "MerchantStatus": {
      "id": "MerchantStatus",
      "properties": {
        "localServicesMatch": {
          "description": "Local services match of this merchant. Empty if it is not a local service merchant or is not matched to any providers.",
          "$ref": "LocalServicesMatchInfo"
        },
        "name": {
          "description": "The merchant status resource name, which has the format of `partners/{partner_id}/merchants/{merchant_id}/status`",
          "type": "string"
        },
        "inputGeoInfo": {
          "description": "Partners provided Geo info of the merchant.",
          "$ref": "GeoCoordinates"
        },
        "geoMatch": {
          "description": "Matched Geo place of this merchant. Empty if the merchant is not Geo matched.",
          "$ref": "PlaceInfo"
        },
        "directUrls": {
          "description": "A list of URLs to demonstrate the content of the current merchant inventory. Note that it doesn't mean the inventory is actually being served and the URL may be different from the public visible ones.",
          "items": {
            "$ref": "DirectUrl"
          },
          "type": "array"
        },
        "processingStatus": {
          "type": "string",
          "description": "Merchant processing status.",
          "enum": [
            "PROCESSING_STATUS_UNSPECIFIED",
            "IN_PROGRESS",
            "COMPLETED"
          ],
          "enumDescriptions": [
            "Status unspecified.",
            "The merchant has been received by Madden, but is still being processed. Merchants in this status will not have other status populated.",
            "Other statuses of the merchant have been computed."
          ]
        },
        "merchantName": {
          "description": "Name of the merchant provided by partners.",
          "type": "string"
        },
        "bookingStatus": {
          "$ref": "BookingStatus",
          "description": "Status related to end-to-end booking integration."
        },
        "waitlistStatus": {
          "$ref": "WaitlistStatus",
          "description": "Status related to waitlist integration."
        }
      },
      "type": "object",
      "description": "Status of a merchant in the Reserve with Google platform."
    },
    "FoodOrderingServiceV1ServiceData": {
      "description": "[START epa_service_feed_entity_definition] Service feed entity data.",
      "type": "object",
      "id": "FoodOrderingServiceV1ServiceData",
      "properties": {
        "service": {
          "$ref": "FoodOrderingServiceV1FoodOrderingService"
        },
        "serviceHours": {
          "$ref": "FoodOrderingServiceV1ServiceHours"
        },
        "serviceArea": {
          "$ref": "FoodOrderingServiceV1ServiceArea"
        },
        "fee": {
          "$ref": "FoodOrderingServiceV1Fee"
        }
      }
    },
    "FoodOrderingServiceV1DurationInterval": {
      "description": "[START epa_duration_interval_definition] A closed-open duration range.",
      "id": "FoodOrderingServiceV1DurationInterval",
      "properties": {
        "minOffset": {
          "description": "The minimum duration (inclusive). Required.",
          "format": "google-duration",
          "type": "string"
        },
        "maxOffset": {
          "description": "The maximum duration (exclusive). Required.",
          "format": "google-duration",
          "type": "string"
        }
      },
      "type": "object"
    },
    "MaddenIngestionOfferPaymentInstrument": {
      "type": "object",
      "id": "MaddenIngestionOfferPaymentInstrument",
      "properties": {
        "providerName": {
          "description": "Name of the payment instrument provider. Could be a banking partner, name of a bank, etc. For example: American Express, HDFC, ICICI.",
          "type": "string"
        },
        "items": {
          "type": "array",
          "description": "List of payment instruments that can be used to avail the offer. Required.",
          "items": {
            "$ref": "MaddenIngestionOfferPaymentInstrumentItem"
          }
        }
      },
      "description": "[START payment_instrument_definition]"
    },
    "FoodOrderingServiceV1ServiceArea": {
      "description": "[START epa_service_area_definition]",
      "type": "object",
      "id": "FoodOrderingServiceV1ServiceArea",
      "properties": {
        "areaId": {
          "description": "Unique identifier. Required.",
          "type": "string"
        },
        "serviceIds": {
          "description": "Identifier to the parent service entity. Required.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "locality": {
          "$ref": "FoodOrderingServiceV1Locality"
        },
        "excludedArea": {
          "description": "Sets to true if the assigned area is excluded from serving. Optional.",
          "type": "boolean"
        },
        "circle": {
          "$ref": "FoodOrderingServiceV1GeoCircle"
        },
        "polygon": {
          "$ref": "FoodOrderingServiceV1Polygon"
        }
      }
    },
    "MaddenIngestionOfferTerms": {
      "description": "[START terms_definition]",
      "type": "object",
      "id": "MaddenIngestionOfferTerms",
      "properties": {
        "additionalTermsAndConditions": {
          "type": "array",
          "description": "Terms and conditions in addition to the primary T&C from the partner.",
          "items": {
            "type": "string"
          }
        },
        "url": {
          "description": "URL to the partner's terms and conditions.",
          "type": "string"
        },
        "termsAndConditions": {
          "description": "Primary T&C text provided by the partner.",
          "type": "string"
        },
        "restrictedToCertainUsers": {
          "description": "Whether the offer is restricted to certain users.",
          "type": "boolean"
        }
      }
    },
    "ValidityRange": {
      "type": "object",
      "id": "ValidityRange",
      "properties": {
        "validFromTime": {
          "type": "string",
          "format": "google-datetime",
          "description": "The beginning time of the range (inclusive). Required."
        },
        "validThroughTime": {
          "type": "string",
          "format": "google-datetime",
          "description": "The ending time of the range (exclusive). If not set, it means that this period is never ending. [START_EXCLUDE silent] It actually sets it to 1 year from now at every ingestion. [END_EXCLUDE] Optional."
        }
      },
      "description": "[START validity_range_definition] A closed-open timestamp range."
    },
    "ValidityPeriod": {
      "description": "[START validity_period_definition]",
      "id": "ValidityPeriod",
      "properties": {
        "validPeriod": {
          "$ref": "ValidityRange",
          "description": "The start and end timestamp that the offer is valid for. These times must represent distinct days i.e. the start time must be 00:00 (beginning of the day) and the end time must be 00:00 (exclusive) on the day the validity period ends."
        },
        "timeOfDay": {
          "description": "Specifies the valid time interval on a given day and which days are available for the offer. For timeframes crossing midnight (e.g., 10 PM to 2 AM), use separate windows for each day: one ending at 11:59:59 PM and another starting at 12:00 AM the next day. For example: Monday: 10AM to 5PM Tuesday: 10AM to 2PM Tuesday: 5PM to 7PM Wed, Thur, Fri, Sat, Sun: 3PM to 7PM If none set, it means the offer is available for all time within `valid_period`. [START_EXCLUDE silent] Solution: https://screenshot.googleplex.com/9dpuuvZm9dLE74g [END_EXCLUDE]",
          "items": {
            "$ref": "TimeOfDayWindow"
          },
          "type": "array"
        },
        "timeExceptions": {
          "description": "Specifies exceptions to the above valid_period and valid_time_of_week",
          "items": {
            "$ref": "ValidTimeException"
          },
          "type": "array"
        },
        "validityDurationInDays": {
          "description": "The duration (in days) the voucher/coupon is valid for, once purchased.",
          "format": "int32",
          "type": "integer"
        },
        "validityScope": {
          "enumDescriptions": [
            "",
            "",
            ""
          ],
          "description": "Specifies the scope of the validity period.",
          "enum": [
            "VALIDITY_SCOPE_UNSPECIFIED",
            "VALIDITY_SCOPE_CLAIM",
            "VALIDITY_SCOPE_REDEEM"
          ],
          "type": "string"
        },
        "dateExceptions": {
          "description": "Specifies exceptions in days to the above valid_period and time_of_day",
          "items": {
            "$ref": "Date"
          },
          "type": "array"
        }
      },
      "type": "object"
    },
    "TimeRange": {
      "id": "TimeRange",
      "properties": {
        "startTime": {
          "description": "The lower bound of the time range.",
          "type": "string",
          "format": "google-datetime"
        },
        "endTime": {
          "description": "The upper bound of the time range.",
          "type": "string",
          "format": "google-datetime"
        }
      },
      "type": "object",
      "description": "A closed-open time range, i.e. [start_time, end_time)."
    },
    "FeeDetails": {
      "id": "FeeDetails",
      "properties": {
        "baseFee": {
          "description": "The base fee associated with the fulfillment method.",
          "$ref": "MinimumFee"
        },
        "noFee": {
          "description": "No fee for the fulfillment method.",
          "$ref": "NoFee"
        },
        "fixedFee": {
          "$ref": "FixedFee",
          "description": "The fixed fee associated with the fulfillment method."
        }
      },
      "type": "object",
      "description": "Fee details for the fulfillment method associated with the action link."
    },
    "TimeOfDayWindow": {
      "id": "TimeOfDayWindow",
      "properties": {
        "timeWindows": {
          "$ref": "TimeOfDayRange",
          "description": "The time window the order can be placed/fulfilled. Required."
        },
        "dayOfWeek": {
          "description": "The list of days in a week the windows are applied. If none set, it means that it applies for all days of the week. Optional.",
          "items": {
            "enum": [
              "DAY_OF_WEEK_UNSPECIFIED",
              "MONDAY",
              "TUESDAY",
              "WEDNESDAY",
              "THURSDAY",
              "FRIDAY",
              "SATURDAY",
              "SUNDAY"
            ],
            "enumDescriptions": [
              "The day of the week is unspecified.",
              "Monday",
              "Tuesday",
              "Wednesday",
              "Thursday",
              "Friday",
              "Saturday",
              "Sunday"
            ],
            "type": "string"
          },
          "type": "array"
        },
        "dayOfMonth": {
          "type": "array",
          "description": "The days in a month the windows are applied. If none set, it means that it applies for all days of the month. Optional.",
          "items": {
            "$ref": "DayOfMonthRange"
          }
        }
      },
      "type": "object",
      "description": "The TimeWindow object is a composite entity that describes a list of windows the user's order can be either placed or fulfilled. [START time_window_definition]"
    },
    "Value": {
      "description": "Represents a possible value for a particular service attribute.",
      "type": "object",
      "id": "Value",
      "properties": {
        "valueId": {
          "description": "An identifier that uniquely identifies this value among others for this service attribute, e.g. \"personal\".",
          "type": "string"
        },
        "valueName": {
          "description": "A user-visible name for the value, e.g. \"Personal\".",
          "type": "string"
        }
      }
    },
    "GenericRecord": {
      "description": "Record of the feed type mentioned in url request.",
      "type": "object",
      "id": "GenericRecord",
      "properties": {
        "generationTimestamp": {
          "type": "string",
          "format": "google-datetime",
          "description": "Required. This timestamp is used to to ensure correct ordering of inventory updates."
        },
        "dataRecord": {
          "description": "For non-proto based feeds.",
          "format": "byte",
          "type": "string"
        },
        "protoRecord": {
          "type": "object",
          "additionalProperties": {
            "type": "any",
            "description": "Properties of the object. Contains field @type with type URL."
          },
          "description": "For proto-based feeds."
        }
      }
    },
    "MaddenIngestionOfferFee": {
      "description": "[START fee_definition] Next ID: 5",
      "id": "MaddenIngestionOfferFee",
      "properties": {
        "unit": {
          "type": "string",
          "enumDescriptions": [
            "The UNSPECIFIED or default enum value should not be used in feeds.",
            "",
            ""
          ],
          "enum": [
            "FEE_UNIT_UNSPECIFIED",
            "FEE_UNIT_PER_GUEST",
            "FEE_UNIT_PER_TRANSACTION"
          ]
        },
        "amount": {
          "$ref": "Money"
        },
        "type": {
          "type": "string",
          "enumDescriptions": [
            "The UNSPECIFIED or default enum value should not be used in feeds.",
            "",
            ""
          ],
          "enum": [
            "FEE_TYPE_UNSPECIFIED",
            "FEE_TYPE_FIXED",
            "FEE_TYPE_VARIABLE"
          ]
        },
        "amountRange": {
          "$ref": "MaddenIngestionOfferMoneyRange"
        }
      },
      "type": "object"
    },
    "MaddenIngestionOfferCoupon": {
      "type": "object",
      "id": "MaddenIngestionOfferCoupon",
      "properties": {
        "text": {
          "description": "The coupon text the offer provider wants to display to users.",
          "type": "string"
        },
        "code": {
          "description": "Coupon code required to redeem the offer. Required.",
          "type": "string"
        }
      },
      "description": "[START coupon_definition]"
    },
    "PaymentOption": {
      "description": "A payment option, which can be used to pay for services provided by a merchant. Payment options can be shared among multiple merchants (e.g. merchants belonging to the same chain).",
      "id": "PaymentOption",
      "properties": {
        "name": {
          "description": "The name of the payment option. This can be user visible.",
          "type": "string"
        },
        "userRestriction": {
          "$ref": "UserPurchaseRestriction",
          "description": "Restricts the users eligible to purchase this payment option. Can be used to restrict a promotional payment option to a subset of users. If not set, all users are eligible."
        },
        "paymentOptionId": {
          "description": "This ID is used to identify this payment option. This ID is global to the whole aggregator, and re-using a value across multiple merchants will allow a user to pay with the corresponding payment option across those merchants. When re-using an ID accoss multiple merchants, updating any value for a payment option under one merchant will also update any other payment option with the same ID, under a different merchant. As such, it's a best practice to have all payment options sharing the same ID, always be updated to identical values, to avoid any possibility of underministic behavior.",
          "type": "string"
        },
        "validDuration": {
          "description": "Duration of the payment option validity (e.g. 30 day membership).",
          "type": "string",
          "format": "google-duration"
        },
        "taxRate": {
          "description": "The tax rate for this payment option. If present this field overrides the tax_rate field present in the Merchant or Service. An empty message (i.e. tax_rate { }) will reset the applied tax rate to zero.",
          "$ref": "TaxRate"
        },
        "validInterval": {
          "$ref": "TimeRange",
          "description": "The payment option can be used within this interval (e.g. special price for January 2017). If present, this overrides valid_duration and activation_type."
        },
        "description": {
          "description": "A description of the payment option. This can be user visible.",
          "type": "string"
        },
        "paymentOptionType": {
          "type": "string",
          "description": "The type of this payment option. Single-use for drop-ins, multi-use for packs, and unlimited for memberships.",
          "enum": [
            "PAYMENT_OPTION_TYPE_UNSPECIFIED",
            "PAYMENT_OPTION_SINGLE_USE",
            "PAYMENT_OPTION_MULTI_USE",
            "PAYMENT_OPTION_UNLIMITED"
          ],
          "enumDescriptions": [
            "Unused.",
            "Payment option can only be used once.",
            "Payment option can be used if its session count \u003e 0.",
            "Payment option can be used within its valid time range - session count is inapplicable."
          ]
        },
        "purchaseInterval": {
          "$ref": "TimeRange",
          "description": "The payment option can be purchased within this interval."
        },
        "price": {
          "$ref": "Price",
          "description": "The price of the payment option."
        },
        "sessionCount": {
          "description": "How many sessions this payment option can be used for. Valid only for multi-session / packs, where the value should be \u003e 1.",
          "format": "int64",
          "type": "string"
        },
        "activationType": {
          "enumDescriptions": [
            "Unused.",
            "Validity starts at the time of purchase.",
            "Validity starts when the payment option is used for the first time."
          ],
          "description": "Defines how the validity start date is determined for this payment option.",
          "enum": [
            "ACTIVATION_TYPE_UNSPECIFIED",
            "ACTIVATION_ON_PURCHASE",
            "ACTIVATION_ON_FIRST_USE"
          ],
          "type": "string"
        }
      },
      "type": "object"
    },
    "TaxRate": {
      "type": "object",
      "id": "TaxRate",
      "properties": {
        "microPercent": {
          "description": "A tax rate in millionths of one percent, effectively giving 6 decimals of precision. For example, if the tax rate is 7.253%, this field should be set to 7253000. If this field is left unset or set to 0, the total price charged to a user for any service provided by this merchant is the exact price specified by Service.price. The service price is assumed to be exempt from or already inclusive of applicable taxes. Taxes will not be shown to the user as a separate line item. If this field is set to any nonzero value, the total price charged to a user for any service provided by this merchant will include the service price plus the tax assessed using the tax rate provided here. Fractions of the smallest currency unit (for example, fractions of one cent) will be rounded using nearest even rounding. Taxes will be shown to the user as a separate line item.",
          "type": "integer",
          "format": "int32"
        }
      },
      "description": "A tax rate applied when charging the user for a service, and which can be set on either a per merchant, or per service basis."
    },
    "Date": {
      "description": "Represents a whole or partial calendar date, such as a birthday. The time of day and time zone are either specified elsewhere or are insignificant. The date is relative to the Gregorian Calendar. This can represent one of the following: * A full date, with non-zero year, month, and day values. * A month and day, with a zero year (for example, an anniversary). * A year on its own, with a zero month and a zero day. * A year and month, with a zero day (for example, a credit card expiration date). Related types: * google.type.TimeOfDay * google.type.DateTime * google.protobuf.Timestamp",
      "type": "object",
      "id": "Date",
      "properties": {
        "month": {
          "type": "integer",
          "format": "int32",
          "description": "Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day."
        },
        "year": {
          "format": "int32",
          "type": "integer",
          "description": "Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year."
        },
        "day": {
          "type": "integer",
          "format": "int32",
          "description": "Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 to specify a year by itself or a year and month where the day isn't significant."
        }
      }
    },
    "FoodOrderingServiceV1AdvanceTimeWindow": {
      "description": "[START advance_time_window_definition] The fulfillment time window for advance orders.",
      "id": "FoodOrderingServiceV1AdvanceTimeWindow",
      "properties": {
        "timeWindows": {
          "description": "A time window the advance order can be fulfilled. Required.",
          "$ref": "FoodOrderingServiceV1TimeOfDayWindow"
        },
        "advanceBookingInterval": {
          "description": "a window that an advance order can be placed. For example, an advance order must be placed at least 60 minutes ahead and not exceeding 2 days, the interval would be [PT60M, P2D). Optional.",
          "$ref": "FoodOrderingServiceV1DurationInterval"
        }
      },
      "type": "object"
    },
    "MaddenIngestionOfferOfferProvider": {
      "description": "[START_EXCLUDE silent] The entity providing or funding the offer. This may be a brand, a mall owner, or an aggregator, and can be different from the merchants listed in entity_ids. This is exclusively used for aggregators onboarded on Google Wallet.",
      "type": "object",
      "id": "MaddenIngestionOfferOfferProvider",
      "properties": {
        "name": {
          "description": "The name of the entity.",
          "type": "string"
        },
        "logoUrl": {
          "description": "The URL of the logo for the entity.",
          "type": "string"
        }
      }
    },
    "Booking": {
      "type": "object",
      "id": "Booking",
      "properties": {
        "clientInformation": {
          "$ref": "ClientInformation",
          "description": "Personal information of the client making the appointment"
        },
        "paymentInformation": {
          "$ref": "PaymentInformation",
          "description": "Information about payment transactions that relate to the booking."
        },
        "status": {
          "type": "string",
          "enumDescriptions": [
            "Not specified.",
            "Booking has been confirmed",
            "Booking is awaiting confirmation by the merchant before it can transition into CONFIRMED status (this is NOT currently supported)",
            "Booking is awaiting confirmation by the client before it can transition into CONFIRMED status (this is NOT currently supported)",
            "Booking has been canceled on behalf of the user.",
            "Client did not show for the appointment",
            "Client did not show for the appointment in violation of the cancellation policy.",
            "Booking could not be completed due to a processing failure.",
            "Booking was asynchronously declined by the merchant."
          ],
          "description": "Status of the booking",
          "enum": [
            "BOOKING_STATUS_UNSPECIFIED",
            "CONFIRMED",
            "PENDING_MERCHANT_CONFIRMATION",
            "PENDING_CLIENT_CONFIRMATION",
            "CANCELED",
            "NO_SHOW",
            "NO_SHOW_PENALIZED",
            "FAILED",
            "DECLINED_BY_MERCHANT"
          ]
        },
        "name": {
          "description": "Resource name of the booking: `partners/{partner ID}/bookings/{booking ID}`",
          "type": "string"
        },
        "startTime": {
          "type": "string",
          "format": "google-datetime",
          "description": "Start time of the appointment slot"
        },
        "duration": {
          "type": "string",
          "format": "google-duration",
          "description": "Duration of the appointment slot"
        },
        "serviceId": {
          "description": "ID of the merchant service",
          "type": "string"
        },
        "partySize": {
          "format": "int64",
          "type": "string",
          "description": "Party size of the booking"
        },
        "merchantId": {
          "description": "ID of the merchant for the slot",
          "type": "string"
        }
      },
      "description": "A booking for an inventory slot"
    },
    "ServiceAttributeValueId": {
      "type": "object",
      "id": "ServiceAttributeValueId",
      "properties": {
        "attributeId": {
          "description": "ID of an attribute as defined in Merchant.service_attribute, e.g. \"service-type\".",
          "type": "string"
        },
        "valueId": {
          "description": "ID of the value for this attribute, e.g. \"haircut\". Must match a value_id in the service attribute definition.",
          "type": "string"
        }
      },
      "description": "Identifies a particular value of a service attribute to be applied to a Service."
    },
    "TicketingVerticalSpecificData": {
      "id": "TicketingVerticalSpecificData",
      "properties": {
        "eventOrganizer": {
          "$ref": "Text",
          "description": "Optional. Organizer who hosts the event."
        },
        "entity": {
          "type": "array",
          "description": "A list of entities related to the event. (optional)",
          "items": {
            "$ref": "Entity"
          }
        },
        "eventOrganizerType": {
          "enumDescriptions": [
            "Not specified.",
            "For organizer who is a person.",
            "For organizer who is an organization."
          ],
          "description": "Optional. The type of the organizer.",
          "enum": [
            "ORGANIZER_TYPE_UNSPECIFIED",
            "PERSON",
            "ORGANIZATION"
          ],
          "type": "string"
        },
        "eventSourceUrl": {
          "type": "array",
          "description": "Required. URL of the pages where the event information or descriptions can be found.",
          "items": {
            "type": "string"
          }
        },
        "eventState": {
          "enumDescriptions": [
            "Not specified.",
            "The event is scheduled.",
            "The event is rescheduled.",
            "The event is cancelled.",
            "The event is postponed."
          ],
          "description": "Optional. State of the event.",
          "enum": [
            "EVENT_STATE_UNSPECIFIED",
            "SCHEDULED",
            "RESCHEDULED",
            "CANCELLED",
            "POSTPONED"
          ],
          "type": "string"
        },
        "eventAttendanceMode": {
          "enumDescriptions": [
            "Not specified.",
            "For virtual events.",
            "For physical events.",
            "For events that are both physical and virtual."
          ],
          "description": "Required. The type of the event attendance.",
          "enum": [
            "ATTENDANCE_MODE_UNSPECIFIED",
            "ONLINE",
            "PHYSICAL",
            "PHYSICAL_ONLINE_MIXED"
          ],
          "type": "string"
        },
        "eventUrl": {
          "description": "The URL of the event on the partner's website. (optional)",
          "type": "string"
        },
        "eventVirtualLocationUrl": {
          "type": "array",
          "description": "Optional. URL where the event can be watched.",
          "items": {
            "type": "string"
          }
        },
        "brandName": {
          "description": "Optional. The localized brand name.",
          "$ref": "Text"
        },
        "eventCategory": {
          "enumDescriptions": [
            "Not specified. Do not use.",
            "Concerts.",
            "Sports events.",
            "Theatre events.",
            "Exhibits.",
            "Workshops and Classes."
          ],
          "description": "The category of the event. Set only when event falls into one of the predefined categories. (optional)",
          "enum": [
            "EVENT_CATEGORY_UNSPECIFIED",
            "EVENT_CATEGORY_CONCERT",
            "EVENT_CATEGORY_SPORTS",
            "EVENT_CATEGORY_THEATRE",
            "EVENT_CATEGORY_EXHIBITS",
            "EVENT_CATEGORY_WORKSHOPS_AND_CLASSES"
          ],
          "type": "string"
        },
        "eventOrganizerUrl": {
          "description": "Optional. URL of the organizer who hosts the event.",
          "type": "string"
        },
        "eventCreator": {
          "description": "Optional. Information about the creator of the event.",
          "$ref": "EventCreator"
        }
      },
      "type": "object",
      "description": "Additional information unique to the event ticketing vertical."
    },
    "FoodOrderingServiceV1ValidityRange": {
      "description": "[START epa_validty_range_definition] A closed-open timestamp range.",
      "id": "FoodOrderingServiceV1ValidityRange",
      "properties": {
        "validFromTime": {
          "type": "string",
          "format": "google-datetime",
          "description": "The beginning time of the range (inclusive). Optional."
        },
        "validThroughTime": {
          "format": "google-datetime",
          "type": "string",
          "description": "The ending time of the range (exclusive). Optional."
        }
      },
      "type": "object"
    },
    "SchedulingRules": {
      "type": "object",
      "id": "SchedulingRules",
      "properties": {
        "minAdvanceOnlineCanceling": {
          "description": "The minimum advance notice in seconds required to cancel a booked appointment online. (optional)",
          "format": "int64",
          "type": "string"
        },
        "admissionPolicy": {
          "type": "string",
          "enumDescriptions": [
            "Unused.",
            "Customers are required to be present at the start time of the availability slot, and the service is expected to finish at the end time of the slot. Examples of TIME_STRICT use cases: * A tour that starts at 9am that requires all attendees to arrive at the start time, and returns at around 12pm. * A haircut reservation at 3pm on Saturday that will take approximately 30 minutes. * A fitness class from 6pm to 8pm.",
            "Customers can arrive at any time between the start and end time of the availability slot to use this booking. Examples of TIME_FLEXIBLE use cases: * A museum ticket that can be used during any time on the purchase date. * An afternoon admission to an amusement park that can be used from 12pm to 9pm.",
            "Customers need to arrive at the merchant at the start time of the availability slot but can leave any time they want. For example, in the museum admission scenario, a timed entry ticket for 10am requires the user to be at the museum at 10am. The start time of availability slots for this service represents the designated entry time. The end time, however, is used solely as a key to identify the availability slot for booking."
          ],
          "description": "The admission policy that applies to this service. If unset, defaults to TIME_STRICT. (optional)",
          "enum": [
            "ADMISSION_POLICY_UNSPECIFIED",
            "TIME_STRICT",
            "TIME_FLEXIBLE",
            "TIMED_ENTRY_WITH_FLEXIBLE_DURATION"
          ]
        },
        "minBookingBufferBeforeEndTime": {
          "description": "The duration (in seconds) from when the last booking can be made to when the availability slot ends. If this field is set, the \"admission_policy\" field must be set to TIME_FLEXIBLE to indicate that users can use the purchased tickets after slots start.",
          "type": "string",
          "format": "int64"
        },
        "lateCancellationFee": {
          "deprecated": true,
          "description": "The fee for canceling within the minimum advance notice period.",
          "$ref": "Price"
        },
        "minAdvanceBooking": {
          "format": "int64",
          "type": "string",
          "description": "The duration (in seconds) from when the last booking can be made to when the availability slot starts."
        },
        "noshowFee": {
          "description": "The fee for no-show without canceling.",
          "deprecated": true,
          "$ref": "Price"
        },
        "cancellationPolicy": {
          "description": "Scheduling rules cancellation policy. (required for Things-to-do)",
          "$ref": "CancellationPolicy"
        }
      },
      "description": "The scheduling rules for a service."
    },
    "Deposit": {
      "description": "A deposit that the user may be charged or have a hold on their credit card for.",
      "type": "object",
      "id": "Deposit",
      "properties": {
        "deposit": {
          "description": "Deposit amount.",
          "$ref": "Price"
        },
        "minAdvanceCancellationSec": {
          "description": "Minimum advance cancellation for the deposit.",
          "type": "string",
          "format": "int64"
        },
        "depositType": {
          "type": "string",
          "enumDescriptions": [
            "The price is for a fixed amount. This is the default value if the field is not set. Examples: $50 deposit to reserve a table; $20 no show fee for a yoga class",
            "The price specified is per person, and the total price is calculated according to the party size specified in Resources as price_micros * party_size. A PER_PERSON price must be accompanied by a party size in the availability resources. If it is not, a party size of one is used. Examples: $10 each for tickets to a museum"
          ],
          "description": "Defines how the deposit is determined from the availability.",
          "enum": [
            "FIXED_RATE_DEFAULT",
            "PER_PERSON"
          ]
        }
      }
    },
    "PaymentProcessorConfig": {
      "id": "PaymentProcessorConfig",
      "properties": {
        "version": {
          "description": "The API version number sent to the payment processor along with payment requests.",
          "type": "string"
        },
        "processor": {
          "description": "Defines the payment processor partner this configuration applies to.",
          "enum": [
            "PROCESSOR_UNSPECIFIED",
            "PROCESSOR_STRIPE",
            "PROCESSOR_BRAINTREE"
          ],
          "enumDescriptions": [
            "Unused",
            "A configuration for payments with Stripe.",
            "A configuration for payments with Braintree."
          ],
          "type": "string"
        },
        "publicKey": {
          "description": "The key used to identify this merchant with the payment processor. For Stripe, refer to: https://stripe.com/docs/dashboard#api-keys For Braintree, refer to: https://articles.braintreepayments.com/control-panel/important-gateway-credentials",
          "type": "string"
        }
      },
      "type": "object",
      "description": "A configuration for a payment processor, setup on a per Merchant basis."
    },
    "PlaceInfo": {
      "description": "Information of a matched place.",
      "type": "object",
      "id": "PlaceInfo",
      "properties": {
        "formattedAddress": {
          "description": "Formatted address in local language.",
          "type": "string"
        },
        "placeId": {
          "description": "Google Place ID of this place. Can be used to construct Google Maps URL or fetch more details of the place. See https://developers.google.com/places/web-service/place-id for example usage.",
          "type": "string"
        },
        "name": {
          "description": "Name of the place.",
          "type": "string"
        }
      }
    },
    "MaddenIngestionOfferOffer": {
      "id": "MaddenIngestionOfferOffer",
      "properties": {
        "coupon": {
          "description": "Details of a coupon. Required for offer_category: OFFER_CATEGORY_ADD_ON_COUPON_OFFER.",
          "$ref": "MaddenIngestionOfferCoupon"
        },
        "addOnOfferApplicableToAllEntities": {
          "description": "If true, this offer is applicable to all entities under the aggregator. Only applicable for add on offers.",
          "type": "boolean"
        },
        "brandId": {
          "description": "Required for Gift Card deals to identify the brand offering the deal.",
          "type": "string"
        },
        "entityIds": {
          "description": "List of merchants who are participating in this offer.",
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        "terms": {
          "description": "Terms and conditions of the offer. Required.",
          "$ref": "MaddenIngestionOfferTerms"
        },
        "timeZone": {
          "description": "Timezone of the offer. Valid values are listed in google3/i18n/identifiers/timezones.cc. Example: Asia/Kolkata Required when offer_social_media_platform is any value except OFFER_SOCIAL_MEDIA_PLATFORM_UNSPECIFIED",
          "type": "string"
        },
        "bannerImageUrl": {
          "description": "The banner image URL. Unlike the image_url usually rendered alongside the offer title, the banner image is rendered in a full-width of mobile screens or card-like view.",
          "type": "string"
        },
        "offerId": {
          "description": "Unique ID of the offer. Required.",
          "type": "string"
        },
        "offerModes": {
          "description": "The methods the offer can be availed - walk in, reservation, online, etc. Required.",
          "items": {
            "type": "string",
            "enumDescriptions": [
              "Use for fulfillment methods not covered by other specific modes.",
              "The offer is available for on-site visits without a prior reservation.",
              "The offer applies when a user makes a reservation that does not require an upfront fee.",
              "The offer applies when a user makes a reservation that requires an upfront payment.",
              "The offer is valid for orders placed through a website or digital platform.",
              "[START_EXCLUDE silent]",
              "[END_EXCLUDE] Indicates a gift card purchase is the primary step required to acquire the deal."
            ],
            "enum": [
              "OFFER_MODE_OTHER",
              "OFFER_MODE_WALK_IN",
              "OFFER_MODE_FREE_RESERVATION",
              "OFFER_MODE_PAID_RESERVATION",
              "OFFER_MODE_ONLINE_ORDER",
              "OFFER_MODE_APP",
              "OFFER_MODE_GIFT_CARD_PURCHASE"
            ]
          },
          "type": "array"
        },
        "offerDetails": {
          "description": "Details of the offer such as the discount, booking cost, etc. Required.",
          "$ref": "MaddenIngestionOfferOfferDetails"
        },
        "actionType": {
          "type": "string",
          "enumDescriptions": [
            "",
            "The offer is applicable for food delivery services.",
            "The offer is applicable for food takeout or pickup orders.",
            "[START_EXCLUDE silent]",
            "[END_EXCLUDE] The offer is for on-site dining at a restaurant.",
            "[START_EXCLUDE silent]",
            "[END_EXCLUDE] The offer is applicable for offline, in-store shopping purchases."
          ],
          "description": "The service that is providing the offer. An offer_id can belong to only one action_type. If an offer can be shared across multiple service types then duplicate offers with unique Ids are expected to be created for each service type. Required.",
          "enum": [
            "ACTION_TYPE_UNSPECIFIED",
            "ACTION_TYPE_FOOD_DELIVERY",
            "ACTION_TYPE_FOOD_TAKEOUT",
            "ACTION_TYPE_FOOD_ORDERING",
            "ACTION_TYPE_DINING",
            "ACTION_TYPE_APPOINTMENT",
            "ACTION_TYPE_SHOPPING_IN_STORE"
          ]
        },
        "offerProvider": {
          "$ref": "MaddenIngestionOfferOfferProvider",
          "description": "The entity providing or funding the offer. [END_EXCLUDE]"
        },
        "offerPostTime": {
          "description": "Epoch time when the offer was posted on social media not when it was extracted or ingested. Must be a valid timestamp when offer_social_media_platform is any value except OFFER_SOCIAL_MEDIA_PLATFORM_UNSPECIFIED. The timestamp is expected to be in UTC.",
          "format": "google-datetime",
          "type": "string"
        },
        "imageUrl": {
          "description": "URL to the merchant’s offer image.",
          "type": "string"
        },
        "merchantHandle": {
          "description": "Initially it will be used to store merchant's social media handle Later can be extended to GBP merchant handle Required when offer_social_media_platform is any value except OFFER_SOCIAL_MEDIA_PLATFORM_UNSPECIFIED",
          "type": "string"
        },
        "availabilityLevel": {
          "type": "string",
          "enumDescriptions": [
            "",
            "Indicates that the offer is running low on availability. Users are encouraged to redeem it before it runs out of stock. We may add MEDIUM and HIGH later."
          ],
          "description": "The availability level of the offer.",
          "enum": [
            "AVAILABILITY_LEVEL_UNSPECIFIED",
            "AVAILABILITY_LEVEL_LOW"
          ]
        },
        "offerRestrictions": {
          "description": "Describes how the offer is restricted i.e. whether a subscription/payment instrument is required, whether this offer can be combined with other offers (and what types), etc. Required.",
          "$ref": "MaddenIngestionOfferOfferRestrictions"
        },
        "currencyCode": {
          "description": "[START_EXCLUDE silent] The currency code in which the offer is provided. Valid values are listed in google3/i18n/identifiers/currencycode.cc. Example: INR Required when offer_social_media_platform is any value except OFFER_SOCIAL_MEDIA_PLATFORM_UNSPECIFIED",
          "type": "string"
        },
        "tags": {
          "type": "array",
          "description": "Special tags associated with the offer. This is used to identify special offers like \"Festive\", \"Top Rated\", \"Most booked\", etc.",
          "items": {
            "type": "string",
            "enum": [
              "OFFER_TAG_UNSPECIFIED",
              "OFFER_TAG_NEW_YEAR_SPECIAL",
              "OFFER_TAG_VALENTINES_SPECIAL"
            ],
            "enumDescriptions": [
              "The UNSPECIFIED or default enum value should not be used in feeds.",
              "",
              ""
            ]
          }
        },
        "offerSocialMediaPlatform": {
          "enumDescriptions": [
            "",
            "",
            "",
            ""
          ],
          "description": "[START_EXCLUDE silent] The social media platform on which the offer is posted. Applicable only for Merchant posts from Social Media. [END_EXCLUDE]",
          "enum": [
            "OFFER_SOCIAL_MEDIA_PLATFORM_UNSPECIFIED",
            "OFFER_SOCIAL_MEDIA_PLATFORM_FACEBOOK",
            "OFFER_SOCIAL_MEDIA_PLATFORM_INSTAGRAM",
            "OFFER_SOCIAL_MEDIA_PLATFORM_TWITTER_X"
          ],
          "type": "string"
        },
        "validityPeriods": {
          "type": "array",
          "description": "The validity period of the offer. Describes what time period the offer is valid for including start and end times, days of the week, etc. Required.",
          "items": {
            "$ref": "ValidityPeriod"
          }
        },
        "subscription": {
          "description": "Details of a subscription. Required for offer_category: OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER.",
          "$ref": "MaddenIngestionOfferSubscription"
        },
        "offerCategory": {
          "enumDescriptions": [
            "The UNSPECIFIED or default enum value should not be used in feeds.",
            "",
            "",
            "",
            "",
            ""
          ],
          "description": "The category of the offer. Required.",
          "enum": [
            "OFFER_CATEGORY_UNSPECIFIED",
            "OFFER_CATEGORY_BASE_OFFER",
            "OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER",
            "OFFER_CATEGORY_ADD_ON_COUPON_OFFER",
            "OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER",
            "OFFER_CATEGORY_ADD_ON_FEE_REDUCTION_OFFER"
          ],
          "type": "string"
        },
        "collapsedImageUrl": {
          "description": "The collapsed thumbnail image url for the offer. [END_EXCLUDE]",
          "type": "string"
        },
        "offerUrl": {
          "description": "URL to the merchant's offer page. Required for offer_category: OFFER_CATEGORY_BASE_OFFER.",
          "type": "string"
        },
        "paymentInstrument": {
          "$ref": "MaddenIngestionOfferPaymentInstrument",
          "description": "Details of a payment instrument. Required for offer_category: OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER."
        },
        "offerSource": {
          "enumDescriptions": [
            "",
            "",
            "[START_EXCLUDE silent]",
            "[END_EXCLUDE]"
          ],
          "description": "An offer can be provided by the aggregator, an individual merchant, or even a third party as an add on. Required.",
          "enum": [
            "OFFER_SOURCE_UNSPECIFIED",
            "OFFER_SOURCE_AGGREGATOR",
            "OFFER_SOURCE_MERCHANT",
            "OFFER_SOURCE_THIRD_PARTY"
          ],
          "type": "string"
        },
        "sourceAssignedPriority": {
          "description": "Non-negative integer ([1-100], where 1 represents the highest priority) indicating the priority level of the offer assigned by the source. When multiple offers are available for the same merchant, this will be a signal for ranking offers. 0 would represent that the priority is not set.",
          "format": "int32",
          "type": "integer"
        }
      },
      "type": "object",
      "description": "LINT.IfChange(offer_definition) [START offer_definition] Next tag: 29"
    },
    "FoodOrderingServiceV1PercentageBasedFee": {
      "type": "object",
      "id": "FoodOrderingServiceV1PercentageBasedFee",
      "properties": {
        "range": {
          "$ref": "FoodOrderingServiceV1MoneyRange",
          "description": "Optional, overall range of possible values of the PercentageBasedFee."
        },
        "baseValue": {
          "description": "Optional, base fee not including the variable percentage based fee.",
          "$ref": "Money"
        },
        "percentageOfCartValue": {
          "type": "number",
          "format": "double",
          "description": "Optional, percentage representing an additional variable fee based on the cart subtotal. E.g. 15.0 represents a fee of 15% of the cart."
        }
      },
      "description": "[START epa_percentage_based_fee] Variable fee which changes based on the price of the order."
    },
    "Advisement": {
      "type": "object",
      "id": "Advisement",
      "properties": {
        "text": {
          "$ref": "Text",
          "description": "Custom message to be displayed to the user when booking through Reserve with Google."
        }
      },
      "description": "Advisements that are displayed to the user when booking through Reserve with Google."
    },
    "PaymentInformation": {
      "id": "PaymentInformation",
      "properties": {
        "paymentTransactionId": {
          "description": "Unique identifier for a payment transaction associated with the booking. Empty if not applicable.",
          "type": "string"
        },
        "prepaymentStatus": {
          "description": "Prepayment status of the booking. If the prepayment_status is PREPAYMENT_PROVIDED or PREPAYMENT_REFUNDED, then payment_transaction_id contains the associated unique transaction id.",
          "enum": [
            "PREPAYMENT_STATUS_UNSPECIFIED",
            "PREPAYMENT_PROVIDED",
            "PREPAYMENT_NOT_PROVIDED",
            "PREPAYMENT_REFUNDED"
          ],
          "enumDescriptions": [
            "Not specified, defaults to PREPAYMENT_NOT_PROVIDED.",
            "The fee for the booking has been paid in advance.",
            "The fee for the booking has not been paid in advance.",
            "The fee was previously PREPAYMENT_PROVIDED but has now been refunded."
          ],
          "type": "string"
        }
      },
      "type": "object",
      "description": "Payment details that relate to a booking"
    },
    "ServiceAttribute": {
      "description": "Service attributes are partner-defined categories that describe the Services for a Merchant. For example, a bank may define an \"Account Type\" service attribute with possible values of \"Personal\" and \"Business\", while a hair salon may define a \"Service Type\" service attribute with possible values of \"Haircut\", \"Color\", and \"Style\".",
      "type": "object",
      "id": "ServiceAttribute",
      "properties": {
        "attributeName": {
          "description": "A user-visible name for this attribute, e.g. \"Account Type\".",
          "type": "string"
        },
        "attributeId": {
          "description": "An identifier that uniquely identifies this service attribute among others for the same merchant, e.g. \"account-type\".",
          "type": "string"
        },
        "value": {
          "description": "All possible values for this service attribute.",
          "items": {
            "$ref": "Value"
          },
          "type": "array"
        }
      }
    },
    "FoodOrderingServiceV1Polygon": {
      "description": "[START epa_geolocation_polygon] Represents a polygon shaped region.",
      "type": "object",
      "id": "FoodOrderingServiceV1Polygon",
      "properties": {
        "loops": {
          "description": "List of S2Loops which defines a polygon. A point is considered in the polygon if it is contained in odd number of loops.",
          "items": {
            "$ref": "FoodOrderingServiceV1Loop"
          },
          "type": "array"
        }
      }
    },
    "Attribution": {
      "description": "Attribution information for this media.",
      "type": "object",
      "id": "Attribution",
      "properties": {
        "localizedText": {
          "$ref": "Text",
          "description": "The text to give credit to the photographer or agency supporting i18n. This text will be displayed together with the source media. Note that only plain text is supported for this field, any HTML components will be stripped (hyperlink based attribution is not supported)."
        },
        "text": {
          "type": "string",
          "description": "Deprecated, prefer to use localized_text.",
          "deprecated": true
        }
      }
    },
    "FoodOrderingServiceV1Loop": {
      "description": "[START epa_geolocation_loop_definition] Represents a loop of geo coordinates. This should be a valid S2Loop.",
      "type": "object",
      "id": "FoodOrderingServiceV1Loop",
      "properties": {
        "point": {
          "type": "array",
          "description": "Points making the boundary of loop.",
          "items": {
            "$ref": "LatLng"
          }
        }
      }
    },
    "ListMerchantStatusesResponse": {
      "id": "ListMerchantStatusesResponse",
      "properties": {
        "merchantStatuses": {
          "type": "array",
          "description": "List of merchant statuses that satisfy the filter conditions.",
          "items": {
            "$ref": "MerchantStatus"
          }
        },
        "nextPageToken": {
          "description": "Token to retrieve the next page of results. There are no more results in the list if empty.",
          "type": "string"
        }
      },
      "type": "object",
      "description": "The response to list MerchantStatus."
    },
    "ServiceAvailability": {
      "description": "A list of availability and who/when they should be applied to.",
      "type": "object",
      "id": "ServiceAvailability",
      "properties": {
        "availability": {
          "description": "The new list of availability.",
          "items": {
            "$ref": "Availability"
          },
          "type": "array"
        },
        "name": {
          "description": "The resource name of the service to apply this to. In the format of `partners/{partner_id}/merchants/{merchant_id}/services/{service_id}`",
          "type": "string"
        },
        "endTimeRestrict": {
          "type": "string",
          "format": "google-datetime",
          "description": "Setting end_time_restrict while leaving start_time_restrict unset is interpreted to mean all time up to the end_time_restrict."
        },
        "startTimeRestrict": {
          "description": "If provided, we will consider the Availability entities provided to be a complete snapshot from [start_time_restrict, end_time_restrict). That is, all existing availability will be deleted if the following condition holds true: ``` start_time_restrict \u003c= availability.start_sec && availability.start_sec \u003c end_time_restrict ``` If a duration message is set, the condition is further restricted: ``` availability.duration == duration_restrict ``` If a resources_restrict message is set, the condition is further restricted: ``` availability.resources.staff_id == resources_restrict.staff_id && availability.resources.room_id == resources_restrict.room_id ``` These fields are typically used to provide a complete update of availability in a given time range. Setting start_time_restrict while leaving end_time_restrict unset is interpreted to mean all time beginning at start_time_restrict.",
          "format": "google-datetime",
          "type": "string"
        },
        "durationRestrict": {
          "type": "string",
          "format": "google-duration",
          "description": "Setting duration further restricts the scope of the update to just the availability with matching duration."
        },
        "resourcesRestrict": {
          "description": "Setting resources_restrict further restricts the scope of the update to just this set of resources. All id fields of the resources must match exactly.",
          "$ref": "Resources"
        }
      }
    },
    "MinimumFee": {
      "description": "The minimum fee required for the fulfillment method associated with the action link.",
      "type": "object",
      "id": "MinimumFee",
      "properties": {
        "baseFeeAmount": {
          "$ref": "Price",
          "description": "Required. The base fee amount for the fulfillment method."
        }
      }
    },
    "MaddenIngestionOfferSubscription": {
      "description": "[START subscription_definition]",
      "type": "object",
      "id": "MaddenIngestionOfferSubscription",
      "properties": {
        "termsAndConditionsUrl": {
          "description": "URL to the partner's terms and conditions relevant to this subscription.",
          "type": "string"
        },
        "subscriptionAutoAdded": {
          "description": "Whether the subscription is auto added when a user avails this offer",
          "type": "boolean"
        },
        "subscriptionDuration": {
          "type": "string",
          "format": "google-duration",
          "description": "How long the subscription is valid for at the subscription_cost. Required."
        },
        "name": {
          "description": "The name of the subscription. Required.",
          "type": "string"
        },
        "cost": {
          "description": "The cost of the subscription. Required.",
          "$ref": "Money"
        }
      }
    },
    "ServiceIntakeFormField": {
      "description": "Defines a field that is included in a ServiceIntakeForm.",
      "id": "ServiceIntakeFormField",
      "properties": {
        "value": {
          "type": "array",
          "description": "Set if and only if the field type is LOCATION_SEARCH. Please use the \"location_id\" in the \"location\" field to specify the location value.",
          "items": {
            "type": "string"
          }
        },
        "id": {
          "description": "A string from an aggregator partner which uniquely identifies a form field. This id should be the same as the id in the corresponding form field answer and must be unique across both the service level and per ticket intake forms. (required)",
          "type": "string"
        },
        "label": {
          "description": "The text shown to the user for this field. Deprecated, please use `localized_label` instead.",
          "type": "string"
        },
        "hint": {
          "$ref": "Text",
          "description": "The hint text for input, which shows up as a text placeholder. This is only applicable when the field type is SHORT_ANSWER or PARAGRAPH. (optional)"
        },
        "additionalOption": {
          "type": "array",
          "description": "Additional options provided in addition to the provided values. Only applicable when the field type is LOCATION_SEARCH. E.g. in addition to the provided location list, another available option can be \"I will contact supplier later\". (optional)",
          "items": {
            "$ref": "Text"
          }
        },
        "allowCustomAnswer": {
          "description": "Indicates whether a custom value is allowed in additional to predefined answers. This is only applicable when the field type is LOCATION_SEARCH. (optional)",
          "type": "boolean"
        },
        "type": {
          "type": "string",
          "description": "The type of this field.",
          "enum": [
            "FIELD_TYPE_UNSPECIFIED",
            "SHORT_ANSWER",
            "PARAGRAPH",
            "MULTIPLE_CHOICE",
            "CHECKBOXES",
            "DROPDOWN",
            "BOOLEAN",
            "LOCATION_SEARCH"
          ],
          "enumDescriptions": [
            "Fields of unspecified or unknown type will be ignored.",
            "A one-line input field for text.",
            "A multi-line input field for text.",
            "A set of radio buttons that requires one choice from many options.",
            "One or more enumerated items with checkboxes.",
            "A selection from a dropdown.",
            "A yes/no button.",
            "A search box that supports finding matched location given user input from provided location list."
          ]
        },
        "isRequired": {
          "description": "Indicates whether an answer to this field is required by a user.",
          "type": "boolean"
        },
        "ticketTypeRestrict": {
          "type": "array",
          "description": "If this question should only be shown when the user books certain ticket types, this field should be set as the set of applicable ticket type ids. Leave the field empty if the question is always applicable.",
          "items": {
            "type": "string"
          }
        },
        "localizedLabel": {
          "description": "The text shown to the user for this field. The field can be supplied in multiple locales. (required)",
          "$ref": "Text"
        },
        "choiceText": {
          "description": "Set if and only if the field type is MULTIPLE_CHOICE, CHECKBOXES, or DROPDOWN. Used to enumerate possible choices.",
          "items": {
            "$ref": "Text"
          },
          "type": "array"
        }
      },
      "type": "object"
    },
    "ListStatusResponse": {
      "description": "The request to retrieve the Status for multiple feeds uploaded by the aggregator's platform.",
      "type": "object",
      "id": "ListStatusResponse",
      "properties": {
        "nextPageToken": {
          "description": "Token to retrieve the next page of results. There are no more results in the list if empty.",
          "type": "string"
        },
        "status": {
          "type": "array",
          "description": "Reverse chronological list of statuses for uploaded feeds. The maximum number of items returned is based on the page_size field in the request.",
          "items": {
            "$ref": "FeedStatus"
          }
        }
      }
    },
    "Text": {
      "description": "A possibly-localized text payload. Some Text fields may contain marked-up content.",
      "id": "Text",
      "properties": {
        "value": {
          "description": "Text value in an unknown locale. Required if and only if `localized_value` is empty. The locale for this value may depend on the partner or service provider -- it should not be assumed to be any specific language.",
          "type": "string"
        },
        "localizedValue": {
          "type": "array",
          "description": "Per-locale text values. Optional.",
          "items": {
            "$ref": "LocalizedString"
          }
        }
      },
      "type": "object"
    },
    "FeedStatus": {
      "id": "FeedStatus",
      "properties": {
        "name": {
          "description": "The feed resource name, which has the format of - `partners/{partner_id}/feeds/merchants/{file_name}` - `partners/{partner_id}/feeds/services/{file_name}` - `partners/{partner_id}/feeds/availability/{file_name}`",
          "type": "string"
        },
        "errorDetails": {
          "description": "Human readable string providing more details if we failed to process this feed.",
          "type": "string"
        },
        "statistics": {
          "$ref": "FeedStatistics",
          "description": "Statistics specific to this feed."
        },
        "state": {
          "enumDescriptions": [
            "Default value. Unused.",
            "The feed is still being processed.",
            "The feed has been successfully processed.",
            "We encountered an error while processing the feed."
          ],
          "description": "The processing state of this feed.",
          "enum": [
            "STATE_UNSPECIFIED",
            "IN_PROGRESS",
            "SUCCESS",
            "FAILURE"
          ],
          "type": "string"
        }
      },
      "type": "object",
      "description": "Status of a feed uploaded by the aggregator's platform."
    },
    "Order": {
      "description": "An order for service appointments with a merchant.",
      "type": "object",
      "id": "Order",
      "properties": {
        "item": {
          "description": "Line items in this order.",
          "items": {
            "$ref": "LineItem"
          },
          "type": "array"
        },
        "merchantId": {
          "description": "ID of the merchant that all services in this order belong to.",
          "type": "string"
        },
        "name": {
          "description": "Resource name of the order: `partners/{partner ID}/orders/{order ID}`",
          "type": "string"
        },
        "clientInformation": {
          "description": "Personal information of the client making the order.",
          "$ref": "ClientInformation"
        },
        "paymentInformation": {
          "$ref": "PaymentInformation",
          "description": "Information about payment transactions that relate to the order."
        }
      }
    },
    "RelatedMedia": {
      "description": "Photos related to this service. Google will crawl these media to ensure that they are displayed correctly to end-users. (optional)",
      "id": "RelatedMedia",
      "properties": {
        "caption": {
          "type": "string",
          "description": "Deprecated, prefer to use localized_caption.",
          "deprecated": true
        },
        "attribution": {
          "$ref": "Attribution",
          "description": "Attribution information about the source of the media. Note that if the attribution is required to display with the media to give credit to photographer or agency, this field must be set. (optional)"
        },
        "url": {
          "description": "URL of this media source. Google will crawl the media hosted at this URL.",
          "type": "string"
        },
        "type": {
          "type": "string",
          "description": "Type of this media source.",
          "enum": [
            "TYPE_UNSPECIFIED",
            "PHOTO"
          ],
          "enumDescriptions": [
            "Unused.",
            "Indicates the media provided by the url is a photo."
          ]
        },
        "localizedCaption": {
          "description": "Caption of the media that supports i18n, only plain text is supported. Any HTML components will be stripped. (optional)",
          "$ref": "Text"
        }
      },
      "type": "object"
    },
    "BatchDeleteGenericRecordsRequest": {
      "type": "object",
      "id": "BatchDeleteGenericRecordsRequest",
      "properties": {
        "records": {
          "type": "array",
          "description": "Records to be deleted. Maximum of 1000 records are allowed in one api call.",
          "items": {
            "$ref": "GenericDeleteRecord"
          }
        }
      },
      "description": "The batch request to delete records of specified feed type."
    },
    "LocalServicesMatchInfo": {
      "id": "LocalServicesMatchInfo",
      "properties": {
        "matchedProviders": {
          "description": "Matched service providers. A merchant can be matched to multiple service providers.",
          "items": {
            "$ref": "MatchedProvider"
          },
          "type": "array"
        }
      },
      "type": "object",
      "description": "Information of the Google local services match (only set for local services merchant)."
    },
    "DayOfMonthRange": {
      "description": "[START day_of_month_range_definition] A range of days of the month that applies to all months of the year.",
      "id": "DayOfMonthRange",
      "properties": {
        "validFromDay": {
          "description": "The beginning day of the range (inclusive). Required.",
          "type": "integer",
          "format": "int32"
        },
        "validThroughDay": {
          "description": "The end day of the range (inclusive). If not set, it means that this range represents a single day (valid_from_day). Optional.",
          "format": "int32",
          "type": "integer"
        }
      },
      "type": "object"
    },
    "CancellationPolicy": {
      "description": "Cancellation policy for a service.",
      "id": "CancellationPolicy",
      "properties": {
        "refundCondition": {
          "type": "array",
          "description": "Zero or more refund conditions applicable to the policy.",
          "items": {
            "$ref": "RefundCondition"
          }
        }
      },
      "type": "object"
    },
    "BatchReplaceServiceAvailabilityRequest": {
      "description": "The batch request to replace multiple Service's availability slots.",
      "type": "object",
      "id": "BatchReplaceServiceAvailabilityRequest",
      "properties": {
        "extendedServiceAvailability": {
          "description": "The extended service availability that is used to replace the existing availability slots.",
          "items": {
            "$ref": "ExtendedServiceAvailability"
          },
          "type": "array"
        }
      }
    },
    "Prepayment": {
      "description": "A payment the user may be charged as part of their reservation.",
      "id": "Prepayment",
      "properties": {
        "priceInfo": {
          "$ref": "PriceInfo",
          "description": "Container for price details."
        }
      },
      "type": "object"
    },
    "ActionLink": {
      "id": "ActionLink",
      "properties": {
        "restrictedCountry": {
          "type": "array",
          "description": "ISO 3166-1 alpha-2 country code. Leave empty for unrestricted visibility.",
          "items": {
            "type": "string"
          }
        },
        "platform": {
          "description": "The platform that this action should be performed on. If this field is unset, ACTION_PLATFORM_WEB_APPLICATION will be used as fallback.",
          "enum": [
            "ACTION_PLATFORM_UNSPECIFIED",
            "ACTION_PLATFORM_WEB_APPLICATION",
            "ACTION_PLATFORM_MOBILE_WEB",
            "ACTION_PLATFORM_ANDROID",
            "ACTION_PLATFORM_IOS"
          ],
          "enumDescriptions": [
            "The platform is unspecified.",
            "The action platform is web in general.",
            "The action platform is web on mobile devices.",
            "The action platform is Android OS.",
            "The action platform is iOS."
          ],
          "type": "string"
        },
        "eventMetadata": {
          "$ref": "EventMetadata",
          "description": "Additional information about action link which is unique to the events vertical."
        },
        "language": {
          "description": "The BCP-47 language tag identifying the language in which the content from this URI is available.",
          "type": "string"
        },
        "actionLinkType": {
          "type": "string",
          "description": "Predetermined type of action.",
          "enum": [
            "ACTION_LINK_TYPE_UNSPECIFIED",
            "ACTION_LINK_TYPE_BOOK_APPOINTMENT",
            "ACTION_LINK_TYPE_BOOK_ONLINE_APPOINTMENT",
            "ACTION_LINK_TYPE_ORDER_FOOD",
            "ACTION_LINK_TYPE_ORDER_FOOD_DELIVERY",
            "ACTION_LINK_TYPE_ORDER_FOOD_TAKEOUT",
            "ACTION_LINK_TYPE_MAKE_DINING_RESERVATION",
            "ACTION_LINK_TYPE_SHOP_ONLINE"
          ],
          "enumDescriptions": [
            "The action link type is unspecified.",
            "The action link type is booking an appointment.",
            "The action link type is booking an online appointment.",
            "The action link type is ordering food for delivery or takeout or both.",
            "The action link type is ordering food for delivery.",
            "The action link type is ordering food for takeout.",
            "The action link type is making a dining reservation.",
            "The action link type is ordering for shopping, could be deliver or pickup or both."
          ]
        },
        "orderOnlineMetadata": {
          "description": "Metadata for the order online link. Supports action with ActionLinkType of ACTION_LINK_TYPE_SHOP_ONLINE.",
          "$ref": "OrderOnlineMetadata"
        },
        "url": {
          "description": "The entry point URL for this action link.",
          "type": "string"
        },
        "foodOrderingMetadata": {
          "description": "Metadata for Food Ordering links. Supports action type: * `ACTION_LINK_TYPE_ORDER_FOOD_DELIVERY` * `ACTION_LINK_TYPE_ORDER_FOOD_TAKEOUT` Does NOT support `ACTION_LINK_TYPE_ORDER_FOOD`.",
          "$ref": "FoodOrderingMetadata"
        }
      },
      "type": "object",
      "description": "An action URL with associated language, list of countries restricted to, and optional platform that indicates which platform this action should be performed on."
    },
    "VirtualSession": {
      "description": "Information about virtual/online session. E.g. Online yoga class, virtual cooking class etc.",
      "id": "VirtualSession",
      "properties": {
        "isSessionPrerecorded": {
          "description": "Required. Set this as true if the virtual session is not live and is pre-recorded.",
          "type": "boolean"
        },
        "sessionInstructions": {
          "description": "Instructions on how this virtual class is set up. If the partner does not include the video URL with the booking, then this text must include when the video URL will be shared with the user. Eg. “Zoom url will be mailed 30 minutes prior to the class”. (Recommended)",
          "$ref": "Text"
        },
        "sessionRequirements": {
          "description": "Requirements for the given virtual session. Eg. yoga mat, cooking utensils etc. (Recommended)",
          "$ref": "Text"
        },
        "virtualPlatformInfo": {
          "$ref": "VirtualPlatformInfo",
          "description": "Information about the virtual platform used in this session. (Required to enable virtual services)"
        }
      },
      "type": "object"
    },
    "PriceInfo": {
      "description": "Container for price details.",
      "type": "object",
      "id": "PriceInfo",
      "properties": {
        "price": {
          "description": "The price of a service or a fee.",
          "$ref": "Price"
        },
        "priceType": {
          "type": "string",
          "enumDescriptions": [
            "The price is for a fixed amount. This is the default value if the field is not set. Examples: $50 deposit to reserve a table; $20 no show fee for a yoga class",
            "The price specified is per person, and the total price is calculated according to the party size specified in Resources as price_micros * party_size. A PER_PERSON price must be accompanied by a party size in the availability resources. If it is not, a party size of one is used. Examples: $10 each for tickets to a museum"
          ],
          "description": "Defines how price or price range is applied (per person or fixed)",
          "enum": [
            "FIXED_RATE_DEFAULT",
            "PER_PERSON"
          ]
        },
        "priceRange": {
          "description": "The upper and/or lower bound of a service or a fee.",
          "$ref": "PriceRange"
        }
      }
    }
  },
  "protocol": "rest",
  "id": "mapsbooking:v1alpha",
  "version": "v1alpha",
  "icons": {
    "x16": "http://www.google.com/images/icons/product/search-16.gif",
    "x32": "http://www.google.com/images/icons/product/search-32.gif"
  },
  "fullyEncodeReservedExpansion": true,
  "rootUrl": "https://mapsbooking.googleapis.com/",
  "servicePath": "",
  "description": "Scheduling aggregators call this API to notify us of appointment updates, and update their inventories including merchants, services, and availability.",
  "basePath": "",
  "documentationLink": "https://developers.google.com",
  "parameters": {
    "alt": {
      "description": "Data format for response.",
      "enum": [
        "json",
        "media",
        "proto"
      ],
      "enumDescriptions": [
        "Responses with Content-Type of application/json",
        "Media download with context-dependent Content-Type",
        "Responses with Content-Type of application/x-protobuf"
      ],
      "type": "string",
      "default": "json",
      "location": "query"
    },
    "fields": {
      "description": "Selector specifying which fields to include in a partial response.",
      "location": "query",
      "type": "string"
    },
    "uploadType": {
      "type": "string",
      "location": "query",
      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\")."
    },
    "key": {
      "type": "string",
      "location": "query",
      "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token."
    },
    "quotaUser": {
      "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
      "location": "query",
      "type": "string"
    },
    "prettyPrint": {
      "type": "boolean",
      "default": "true",
      "description": "Returns response with indentations and line breaks.",
      "location": "query"
    },
    "access_token": {
      "type": "string",
      "description": "OAuth access token.",
      "location": "query"
    },
    "oauth_token": {
      "type": "string",
      "description": "OAuth 2.0 token for the current user.",
      "location": "query"
    },
    "upload_protocol": {
      "location": "query",
      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
      "type": "string"
    },
    "callback": {
      "type": "string",
      "location": "query",
      "description": "JSONP"
    },
    "$.xgafv": {
      "location": "query",
      "type": "string",
      "enumDescriptions": [
        "v1 error format",
        "v2 error format"
      ],
      "description": "V1 error format.",
      "enum": [
        "1",
        "2"
      ]
    }
  }
}
