{
  "canonicalName": "Google Maps Booking API",
  "ownerDomain": "google.com",
  "servicePath": "",
  "batchPath": "batch",
  "parameters": {
    "oauth_token": {
      "type": "string",
      "description": "OAuth 2.0 token for the current user.",
      "location": "query"
    },
    "upload_protocol": {
      "type": "string",
      "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
      "location": "query"
    },
    "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"
    },
    "access_token": {
      "type": "string",
      "description": "OAuth access token.",
      "location": "query"
    },
    "alt": {
      "description": "Data format for response.",
      "type": "string",
      "enumDescriptions": [
        "Responses with Content-Type of application/json",
        "Media download with context-dependent Content-Type",
        "Responses with Content-Type of application/x-protobuf"
      ],
      "default": "json",
      "enum": [
        "json",
        "media",
        "proto"
      ],
      "location": "query"
    },
    "prettyPrint": {
      "description": "Returns response with indentations and line breaks.",
      "default": "true",
      "location": "query",
      "type": "boolean"
    },
    "key": {
      "type": "string",
      "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.",
      "location": "query"
    },
    "callback": {
      "type": "string",
      "description": "JSONP",
      "location": "query"
    },
    "$.xgafv": {
      "enum": [
        "1",
        "2"
      ],
      "location": "query",
      "description": "V1 error format.",
      "type": "string",
      "enumDescriptions": [
        "v1 error format",
        "v2 error format"
      ]
    },
    "fields": {
      "description": "Selector specifying which fields to include in a partial response.",
      "location": "query",
      "type": "string"
    },
    "uploadType": {
      "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
      "location": "query",
      "type": "string"
    }
  },
  "ownerName": "Google",
  "schemas": {
    "FoodOrderingServiceV1ServiceHours": {
      "id": "FoodOrderingServiceV1ServiceHours",
      "type": "object",
      "properties": {
        "specialHour": {
          "description": "Indicates if the service hours are for special occasions (e.g. Thanksgiving/...) Optional",
          "type": "boolean"
        },
        "hoursId": {
          "type": "string",
          "description": "Unique identifier of the provided advance service hours. Required."
        },
        "serviceIds": {
          "description": "The unique identifier of the Service entity correlated to this ServiceHours entity. Required.",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "orderableTime": {
          "items": {
            "$ref": "FoodOrderingServiceV1TimeOfDayWindow"
          },
          "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.",
          "type": "array"
        },
        "asapHours": {
          "type": "array",
          "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"
          }
        },
        "advanceHours": {
          "type": "array",
          "items": {
            "$ref": "FoodOrderingServiceV1AdvanceTimeWindow"
          }
        },
        "validityRange": {
          "description": "A timestamp window indicating the validity of the special hours. Optional. Required if it's special hours.",
          "$ref": "FoodOrderingServiceV1ValidityRange"
        }
      },
      "description": "[START epa_service_hours_definition] Service hours entity for ASAP/Advance orders."
    },
    "FoodOrderingServiceV1ServiceArea": {
      "type": "object",
      "properties": {
        "serviceIds": {
          "type": "array",
          "description": "Identifier to the parent service entity. Required.",
          "items": {
            "type": "string"
          }
        },
        "circle": {
          "$ref": "FoodOrderingServiceV1GeoCircle"
        },
        "excludedArea": {
          "type": "boolean",
          "description": "Sets to true if the assigned area is excluded from serving. Optional."
        },
        "polygon": {
          "$ref": "FoodOrderingServiceV1Polygon"
        },
        "areaId": {
          "description": "Unique identifier. Required.",
          "type": "string"
        },
        "locality": {
          "$ref": "FoodOrderingServiceV1Locality"
        }
      },
      "description": "[START epa_service_area_definition]",
      "id": "FoodOrderingServiceV1ServiceArea"
    },
    "ServiceAttributeValueId": {
      "type": "object",
      "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.",
      "id": "ServiceAttributeValueId"
    },
    "PlaceInfo": {
      "description": "Information of a matched place.",
      "type": "object",
      "properties": {
        "name": {
          "description": "Name of the place.",
          "type": "string"
        },
        "formattedAddress": {
          "type": "string",
          "description": "Formatted address in local language."
        },
        "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"
        }
      },
      "id": "PlaceInfo"
    },
    "SchedulingRules": {
      "type": "object",
      "properties": {
        "minAdvanceOnlineCanceling": {
          "type": "string",
          "description": "The minimum advance notice in seconds required to cancel a booked appointment online. (optional)",
          "format": "int64"
        },
        "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.",
          "format": "int64",
          "type": "string"
        },
        "minAdvanceBooking": {
          "description": "The duration (in seconds) from when the last booking can be made to when the availability slot starts.",
          "format": "int64",
          "type": "string"
        },
        "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"
        },
        "lateCancellationFee": {
          "$ref": "Price",
          "description": "The fee for canceling within the minimum advance notice period.",
          "deprecated": true
        },
        "admissionPolicy": {
          "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"
          ],
          "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 scheduling rules for a service.",
      "id": "SchedulingRules"
    },
    "ClientInformation": {
      "id": "ClientInformation",
      "type": "object",
      "properties": {
        "address": {
          "description": "Address of the client",
          "$ref": "PostalAddress"
        },
        "email": {
          "type": "string",
          "description": "Email address of the client"
        },
        "telephone": {
          "description": "Phone number of the client",
          "type": "string"
        },
        "givenName": {
          "description": "Given name of the client",
          "type": "string"
        },
        "familyName": {
          "description": "Family name of the client",
          "type": "string"
        }
      },
      "description": "Personal information about the person making a booking"
    },
    "Booking": {
      "description": "A booking for an inventory slot",
      "type": "object",
      "properties": {
        "startTime": {
          "description": "Start time of the appointment slot",
          "format": "google-datetime",
          "type": "string"
        },
        "status": {
          "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"
          ],
          "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."
          ]
        },
        "name": {
          "description": "Resource name of the booking: `partners/{partner ID}/bookings/{booking ID}`",
          "type": "string"
        },
        "clientInformation": {
          "description": "Personal information of the client making the appointment",
          "$ref": "ClientInformation"
        },
        "serviceId": {
          "description": "ID of the merchant service",
          "type": "string"
        },
        "paymentInformation": {
          "description": "Information about payment transactions that relate to the booking.",
          "$ref": "PaymentInformation"
        },
        "duration": {
          "type": "string",
          "description": "Duration of the appointment slot",
          "format": "google-duration"
        },
        "partySize": {
          "description": "Party size of the booking",
          "format": "int64",
          "type": "string"
        },
        "merchantId": {
          "description": "ID of the merchant for the slot",
          "type": "string"
        }
      },
      "id": "Booking"
    },
    "ListMerchantStatusesResponse": {
      "description": "The response to list MerchantStatus.",
      "type": "object",
      "properties": {
        "merchantStatuses": {
          "items": {
            "$ref": "MerchantStatus"
          },
          "description": "List of merchant statuses that satisfy the filter conditions.",
          "type": "array"
        },
        "nextPageToken": {
          "type": "string",
          "description": "Token to retrieve the next page of results. There are no more results in the list if empty."
        }
      },
      "id": "ListMerchantStatusesResponse"
    },
    "MaddenIngestionOfferPaymentInstrument": {
      "type": "object",
      "properties": {
        "providerName": {
          "type": "string",
          "description": "Name of the payment instrument provider. Could be a banking partner, name of a bank, etc. For example: American Express, HDFC, ICICI."
        },
        "items": {
          "items": {
            "$ref": "MaddenIngestionOfferPaymentInstrumentItem"
          },
          "description": "List of payment instruments that can be used to avail the offer. Required.",
          "type": "array"
        }
      },
      "description": "[START payment_instrument_definition]",
      "id": "MaddenIngestionOfferPaymentInstrument"
    },
    "Text": {
      "description": "A possibly-localized text payload. Some Text fields may contain marked-up content.",
      "type": "object",
      "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": {
          "items": {
            "$ref": "LocalizedString"
          },
          "type": "array",
          "description": "Per-locale text values. Optional."
        }
      },
      "id": "Text"
    },
    "DayOfMonthRange": {
      "id": "DayOfMonthRange",
      "type": "object",
      "properties": {
        "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"
        },
        "validFromDay": {
          "type": "integer",
          "description": "The beginning day of the range (inclusive). Required.",
          "format": "int32"
        }
      },
      "description": "[START day_of_month_range_definition] A range of days of the month that applies to all months of the year."
    },
    "PerTicketFee": {
      "id": "PerTicketFee",
      "type": "object",
      "properties": {
        "taxes": {
          "description": "Per ticket taxes.",
          "$ref": "Price"
        },
        "serviceCharge": {
          "description": "An extra charge assessed for a service.",
          "$ref": "Price"
        },
        "facilityFee": {
          "description": "A fee that goes to the venue/facility.",
          "$ref": "Price"
        }
      },
      "description": "Fees that must be paid for each ticket the user purchases."
    },
    "MaddenIngestionOfferOfferCondition": {
      "type": "object",
      "properties": {
        "description": {
          "type": "string"
        }
      },
      "description": "[START offer_condition_definition]",
      "id": "MaddenIngestionOfferOfferCondition"
    },
    "EventMetadata": {
      "description": "Additional information about action link which is unique to the events vertical.",
      "type": "object",
      "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"
          ],
          "type": "string",
          "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."
          ]
        }
      },
      "id": "EventMetadata"
    },
    "CancellationPolicy": {
      "description": "Cancellation policy for a service.",
      "type": "object",
      "properties": {
        "refundCondition": {
          "type": "array",
          "description": "Zero or more refund conditions applicable to the policy.",
          "items": {
            "$ref": "RefundCondition"
          }
        }
      },
      "id": "CancellationPolicy"
    },
    "FulfillmentOption": {
      "type": "object",
      "properties": {
        "fulfillmentType": {
          "type": "string",
          "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"
          ]
        },
        "feeDetails": {
          "description": "Required. Fee details for the fulfillment method.",
          "$ref": "FeeDetails"
        },
        "minimumOrder": {
          "description": "Required. Minimum order for the fulfillment method associated with the action link.",
          "$ref": "Price"
        },
        "availableDay": {
          "items": {
            "$ref": "AvailableDay"
          },
          "description": "Required. A list of days on which there is availability for this fulfillment method (preferably at least 2).",
          "type": "array"
        }
      },
      "description": "The fulfillment option for an order online action link.",
      "id": "FulfillmentOption"
    },
    "MerchantMatchingHints": {
      "id": "MerchantMatchingHints",
      "type": "object",
      "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."
    },
    "PaymentInformation": {
      "id": "PaymentInformation",
      "type": "object",
      "properties": {
        "prepaymentStatus": {
          "type": "string",
          "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."
          ],
          "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"
          ]
        },
        "paymentTransactionId": {
          "type": "string",
          "description": "Unique identifier for a payment transaction associated with the booking. Empty if not applicable."
        }
      },
      "description": "Payment details that relate to a booking"
    },
    "TimeOfDayWindow": {
      "type": "object",
      "properties": {
        "timeWindows": {
          "description": "The time window the order can be placed/fulfilled. Required.",
          "$ref": "TimeOfDayRange"
        },
        "dayOfMonth": {
          "items": {
            "$ref": "DayOfMonthRange"
          },
          "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.",
          "type": "array"
        },
        "dayOfWeek": {
          "items": {
            "enum": [
              "DAY_OF_WEEK_UNSPECIFIED",
              "MONDAY",
              "TUESDAY",
              "WEDNESDAY",
              "THURSDAY",
              "FRIDAY",
              "SATURDAY",
              "SUNDAY"
            ],
            "type": "string",
            "enumDescriptions": [
              "The day of the week is unspecified.",
              "Monday",
              "Tuesday",
              "Wednesday",
              "Thursday",
              "Friday",
              "Saturday",
              "Sunday"
            ]
          },
          "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.",
          "type": "array"
        }
      },
      "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]",
      "id": "TimeOfDayWindow"
    },
    "TimeOfDayRange": {
      "type": "object",
      "properties": {
        "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"
        },
        "closeTime": {
          "description": "A Time indicating the ending time of the day of the range (exclusive). If not set, it means 23:59:59. Optional.",
          "$ref": "TimeOfDay"
        }
      },
      "description": "[START time_range_definition] A closed-open time range.",
      "id": "TimeOfDayRange"
    },
    "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",
      "properties": {
        "logoUrl": {
          "description": "The URL of the logo for the entity.",
          "type": "string"
        },
        "name": {
          "type": "string",
          "description": "The name of the entity."
        }
      },
      "id": "MaddenIngestionOfferOfferProvider"
    },
    "Resources": {
      "type": "object",
      "properties": {
        "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"
        },
        "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"
        },
        "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"
        },
        "roomId": {
          "type": "string",
          "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."
        },
        "partySize": {
          "type": "integer",
          "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.",
          "format": "int32"
        }
      },
      "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.",
      "id": "Resources"
    },
    "PaymentOption": {
      "type": "object",
      "properties": {
        "purchaseInterval": {
          "description": "The payment option can be purchased within this interval.",
          "$ref": "TimeRange"
        },
        "paymentOptionId": {
          "type": "string",
          "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."
        },
        "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": {
          "type": "string",
          "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"
          ]
        },
        "name": {
          "description": "The name of the payment option. This can be user visible.",
          "type": "string"
        },
        "description": {
          "description": "A description of the payment option. This can be user visible.",
          "type": "string"
        },
        "price": {
          "description": "The price of the payment option.",
          "$ref": "Price"
        },
        "validInterval": {
          "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.",
          "$ref": "TimeRange"
        },
        "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"
        },
        "validDuration": {
          "description": "Duration of the payment option validity (e.g. 30 day membership).",
          "format": "google-duration",
          "type": "string"
        },
        "userRestriction": {
          "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.",
          "$ref": "UserPurchaseRestriction"
        },
        "paymentOptionType": {
          "type": "string",
          "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."
          ],
          "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"
          ]
        }
      },
      "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"
    },
    "FeedStatus": {
      "description": "Status of a feed uploaded by the aggregator's platform.",
      "type": "object",
      "properties": {
        "errorDetails": {
          "type": "string",
          "description": "Human readable string providing more details if we failed to process this feed."
        },
        "state": {
          "type": "string",
          "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"
          ]
        },
        "statistics": {
          "description": "Statistics specific to this feed.",
          "$ref": "FeedStatistics"
        },
        "name": {
          "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}`"
        }
      },
      "id": "FeedStatus"
    },
    "MaddenIngestionOfferFee": {
      "id": "MaddenIngestionOfferFee",
      "type": "object",
      "properties": {
        "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"
        },
        "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"
          ]
        }
      },
      "description": "[START fee_definition] Next ID: 5"
    },
    "ListStatusResponse": {
      "id": "ListStatusResponse",
      "description": "The request to retrieve the Status for multiple feeds uploaded by the aggregator's platform.",
      "type": "object",
      "properties": {
        "status": {
          "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.",
          "type": "array",
          "items": {
            "$ref": "FeedStatus"
          }
        },
        "nextPageToken": {
          "description": "Token to retrieve the next page of results. There are no more results in the list if empty.",
          "type": "string"
        }
      }
    },
    "MaddenIngestionOfferSubscription": {
      "type": "object",
      "properties": {
        "termsAndConditionsUrl": {
          "type": "string",
          "description": "URL to the partner's terms and conditions relevant to this subscription."
        },
        "subscriptionDuration": {
          "description": "How long the subscription is valid for at the subscription_cost. Required.",
          "format": "google-duration",
          "type": "string"
        },
        "name": {
          "description": "The name of the subscription. Required.",
          "type": "string"
        },
        "subscriptionAutoAdded": {
          "description": "Whether the subscription is auto added when a user avails this offer",
          "type": "boolean"
        },
        "cost": {
          "description": "The cost of the subscription. Required.",
          "$ref": "Money"
        }
      },
      "description": "[START subscription_definition]",
      "id": "MaddenIngestionOfferSubscription"
    },
    "BatchReplaceServiceAvailabilityRequest": {
      "description": "The batch request to replace multiple Service's availability slots.",
      "type": "object",
      "properties": {
        "extendedServiceAvailability": {
          "type": "array",
          "description": "The extended service availability that is used to replace the existing availability slots.",
          "items": {
            "$ref": "ExtendedServiceAvailability"
          }
        }
      },
      "id": "BatchReplaceServiceAvailabilityRequest"
    },
    "FeeAmount": {
      "id": "FeeAmount",
      "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",
      "type": "object",
      "properties": {
        "cartPercentage": {
          "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%",
          "$ref": "QuantitativeValue"
        },
        "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"
        },
        "amountUnknown": {
          "type": "boolean",
          "description": "Unknown amount."
        },
        "amount": {
          "description": "Fixed amount. For example USD 3.5.",
          "$ref": "Money"
        }
      }
    },
    "InvalidateResourceRequest": {
      "id": "InvalidateResourceRequest",
      "description": "Request to invalidate a resource.",
      "type": "object",
      "properties": {}
    },
    "MaddenIngestionOfferOfferRestrictions": {
      "type": "object",
      "properties": {
        "inclusions": {
          "items": {
            "$ref": "MaddenIngestionOfferOfferCondition"
          },
          "description": "List of conditions that must be met for the offer to be valid (e.g., non-alcoholic drinks, food).",
          "type": "array"
        },
        "maxRedemptionCount": {
          "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.",
          "format": "int64",
          "type": "string"
        },
        "specialConditions": {
          "items": {
            "type": "string"
          },
          "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.\""
        },
        "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.",
          "type": "array",
          "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"
            ]
          }
        },
        "maxTotalDiscountValue": {
          "description": "The maximum discount that can be availed across multiple transactions of this offer.",
          "$ref": "Money"
        },
        "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"
        },
        "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.",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "minGuest": {
          "description": "The minimum number of people required to avail the offer.",
          "format": "int32",
          "type": "integer"
        },
        "exclusions": {
          "type": "array",
          "description": "List of conditions that would invalidate the offer (e.g., buffet, combo offers, and cocktails ).",
          "items": {
            "$ref": "MaddenIngestionOfferOfferCondition"
          }
        },
        "foodOfferRestrictions": {
          "description": "Restrictions specific to food offers.",
          "$ref": "MaddenIngestionOfferFoodOfferRestrictions"
        }
      },
      "description": "[START offer_restrictions_definition] Next tag: 11",
      "id": "MaddenIngestionOfferOfferRestrictions"
    },
    "ServiceIntakeForm": {
      "id": "ServiceIntakeForm",
      "description": "Defines an intake form that customizes the service provided by a merchant.",
      "type": "object",
      "properties": {
        "field": {
          "type": "array",
          "description": "Fields that will be displayed to the user.",
          "items": {
            "$ref": "ServiceIntakeFormField"
          }
        },
        "returningCustomers": {
          "description": "If true, this form will be shown to repeat customers. Deprecated. This functionality is not supported for intake forms.",
          "deprecated": true,
          "type": "boolean"
        },
        "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
        }
      }
    },
    "FoodOrderingServiceV1Loop": {
      "id": "FoodOrderingServiceV1Loop",
      "description": "[START epa_geolocation_loop_definition] Represents a loop of geo coordinates. This should be a valid S2Loop.",
      "type": "object",
      "properties": {
        "point": {
          "description": "Points making the boundary of loop.",
          "type": "array",
          "items": {
            "$ref": "LatLng"
          }
        }
      }
    },
    "ScheduleException": {
      "id": "ScheduleException",
      "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.",
      "type": "object",
      "properties": {
        "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.",
          "$ref": "TimeRange"
        }
      }
    },
    "DirectUrl": {
      "description": "URL that surfaces the merchant.",
      "type": "object",
      "properties": {
        "type": {
          "description": "Type of this URL.",
          "enum": [
            "URL_TYPE_UNSPECIFIED",
            "BOOKING",
            "WAITLIST",
            "LOCAL_SERVICES"
          ],
          "type": "string",
          "enumDescriptions": [
            "Not specified.",
            "End-to-end booking URL.",
            "End-to-end waitlist URL.",
            "Google Local Services URL."
          ]
        },
        "url": {
          "type": "string",
          "description": "URL that may surface this merchant."
        }
      },
      "id": "DirectUrl"
    },
    "BookingStatus": {
      "id": "BookingStatus",
      "type": "object",
      "properties": {
        "hasValidFutureInventory": {
          "description": "True if the merchant has inventory in the next 30 day. Doesn't guarantee the merchant is actually served.",
          "type": "boolean"
        }
      },
      "description": "Status related to end-to-end booking integration."
    },
    "Value": {
      "id": "Value",
      "type": "object",
      "properties": {
        "valueId": {
          "type": "string",
          "description": "An identifier that uniquely identifies this value among others for this service attribute, e.g. \"personal\"."
        },
        "valueName": {
          "description": "A user-visible name for the value, e.g. \"Personal\".",
          "type": "string"
        }
      },
      "description": "Represents a possible value for a particular service attribute."
    },
    "Entity": {
      "id": "Entity",
      "description": "Represents an entity related to the event.",
      "type": "object",
      "properties": {
        "name": {
          "description": "Name of the entity. (required)",
          "type": "string"
        },
        "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"
          ]
        },
        "id": {
          "description": "Unique identifier of the entity in the partner's database. (optional)",
          "type": "string"
        },
        "url": {
          "type": "string",
          "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)"
        },
        "entityRole": {
          "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",
          "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."
          ]
        },
        "publicIdentificationData": {
          "description": "Public references of the entity. (optional)",
          "$ref": "PublicIdentificationData"
        }
      }
    },
    "FoodOrderingServiceV1MoneyRange": {
      "id": "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.",
      "type": "object",
      "properties": {
        "minAmount": {
          "description": "Minimum amount.",
          "$ref": "Money"
        },
        "maxAmount": {
          "description": "Maximum amount.",
          "$ref": "Money"
        }
      }
    },
    "MaddenIngestionOfferTerms": {
      "description": "[START terms_definition]",
      "type": "object",
      "properties": {
        "url": {
          "type": "string",
          "description": "URL to the partner's terms and conditions."
        },
        "termsAndConditions": {
          "type": "string",
          "description": "Primary T&C text provided by the partner."
        },
        "additionalTermsAndConditions": {
          "description": "Terms and conditions in addition to the primary T&C from the partner.",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "restrictedToCertainUsers": {
          "description": "Whether the offer is restricted to certain users.",
          "type": "boolean"
        }
      },
      "id": "MaddenIngestionOfferTerms"
    },
    "Money": {
      "id": "Money",
      "description": "Represents an amount of money with its currency type.",
      "type": "object",
      "properties": {
        "units": {
          "type": "string",
          "description": "The whole units of the amount. For example if `currencyCode` is `\"USD\"`, then 1 unit is one US dollar.",
          "format": "int64"
        },
        "currencyCode": {
          "description": "The three-letter currency code defined in ISO 4217.",
          "type": "string"
        },
        "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"
        }
      }
    },
    "PriceRange": {
      "id": "PriceRange",
      "type": "object",
      "properties": {
        "minPrice": {
          "description": "Minimum amount.",
          "$ref": "Price"
        },
        "maxPrice": {
          "description": "Maximum amount. Should always be \u003e min_price.",
          "$ref": "Price"
        }
      },
      "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."
    },
    "ServiceAttribute": {
      "type": "object",
      "properties": {
        "attributeId": {
          "type": "string",
          "description": "An identifier that uniquely identifies this service attribute among others for the same merchant, e.g. \"account-type\"."
        },
        "attributeName": {
          "description": "A user-visible name for this attribute, e.g. \"Account Type\".",
          "type": "string"
        },
        "value": {
          "items": {
            "$ref": "Value"
          },
          "description": "All possible values for this service attribute.",
          "type": "array"
        }
      },
      "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\".",
      "id": "ServiceAttribute"
    },
    "MoneyRange": {
      "type": "object",
      "properties": {
        "minAmount": {
          "description": "Minimum amount.",
          "$ref": "Money"
        },
        "maxAmount": {
          "description": "Maximum amount.",
          "$ref": "Money"
        }
      },
      "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.",
      "id": "MoneyRange"
    },
    "RelatedMedia": {
      "description": "Photos related to this service. Google will crawl these media to ensure that they are displayed correctly to end-users. (optional)",
      "type": "object",
      "properties": {
        "localizedCaption": {
          "description": "Caption of the media that supports i18n, only plain text is supported. Any HTML components will be stripped. (optional)",
          "$ref": "Text"
        },
        "url": {
          "type": "string",
          "description": "URL of this media source. Google will crawl the media hosted at this URL."
        },
        "caption": {
          "type": "string",
          "description": "Deprecated, prefer to use localized_caption.",
          "deprecated": true
        },
        "type": {
          "description": "Type of this media source.",
          "enum": [
            "TYPE_UNSPECIFIED",
            "PHOTO"
          ],
          "type": "string",
          "enumDescriptions": [
            "Unused.",
            "Indicates the media provided by the url is a photo."
          ]
        },
        "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)",
          "$ref": "Attribution"
        }
      },
      "id": "RelatedMedia"
    },
    "EconomicOperator": {
      "description": "Economic Operator information for the Aggregator.",
      "type": "object",
      "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"
        }
      },
      "id": "EconomicOperator"
    },
    "TimeRange": {
      "description": "A closed-open time range, i.e. [start_time, end_time).",
      "type": "object",
      "properties": {
        "startTime": {
          "description": "The lower bound of the time range.",
          "format": "google-datetime",
          "type": "string"
        },
        "endTime": {
          "description": "The upper bound of the time range.",
          "format": "google-datetime",
          "type": "string"
        }
      },
      "id": "TimeRange"
    },
    "Empty": {
      "id": "Empty",
      "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); }",
      "type": "object",
      "properties": {}
    },
    "OrderedTickets": {
      "id": "OrderedTickets",
      "description": "Number of ordered tickets by Ticket Type.",
      "type": "object",
      "properties": {
        "ticketId": {
          "description": "ID of a Ticket Type.",
          "type": "string"
        },
        "count": {
          "type": "integer",
          "description": "Number of tickets ordered for this type.",
          "format": "int32"
        }
      }
    },
    "Attribution": {
      "type": "object",
      "properties": {
        "localizedText": {
          "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).",
          "$ref": "Text"
        },
        "text": {
          "type": "string",
          "description": "Deprecated, prefer to use localized_text.",
          "deprecated": true
        }
      },
      "description": "Attribution information for this media.",
      "id": "Attribution"
    },
    "FoodOrderingServiceV1Polygon": {
      "type": "object",
      "properties": {
        "loops": {
          "type": "array",
          "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"
          }
        }
      },
      "description": "[START epa_geolocation_polygon] Represents a polygon shaped region.",
      "id": "FoodOrderingServiceV1Polygon"
    },
    "Advisement": {
      "description": "Advisements that are displayed to the user when booking through Reserve with Google.",
      "type": "object",
      "properties": {
        "text": {
          "description": "Custom message to be displayed to the user when booking through Reserve with Google.",
          "$ref": "Text"
        }
      },
      "id": "Advisement"
    },
    "CallMerchant": {
      "type": "object",
      "properties": {},
      "description": "Empty message to be used in UnsupportedPartySizeOption, setting this will display an option to users to call the business for a booking.",
      "id": "CallMerchant"
    },
    "LineItem": {
      "id": "LineItem",
      "description": "A single item in an order--the booking of a single service in a single time slot.",
      "type": "object",
      "properties": {
        "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"
          ],
          "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."
          ]
        },
        "price": {
          "description": "The total price (excluding taxes) of this Line Item.",
          "$ref": "Price"
        },
        "durationSec": {
          "type": "string",
          "description": "Duration of the appointment slot in seconds.",
          "format": "int64"
        },
        "serviceId": {
          "description": "ID of the merchant Service.",
          "type": "string"
        },
        "startSec": {
          "description": "Start time of the appointment slot in seconds of UTC time since Unix epoch.",
          "format": "int64",
          "type": "string"
        },
        "tickets": {
          "type": "array",
          "description": "Number of tickets ordered by Ticket Type.",
          "items": {
            "$ref": "OrderedTickets"
          }
        }
      }
    },
    "Date": {
      "type": "object",
      "properties": {
        "month": {
          "type": "integer",
          "description": "Month of a year. Must be from 1 to 12, or 0 to specify a year without a month and day.",
          "format": "int32"
        },
        "day": {
          "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.",
          "format": "int32",
          "type": "integer"
        },
        "year": {
          "type": "integer",
          "description": "Year of the date. Must be from 1 to 9999, or 0 to specify a date without a year.",
          "format": "int32"
        }
      },
      "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",
      "id": "Date"
    },
    "GeoCoordinates": {
      "description": "The Geo data of a location, including latitude, longitude, and address.",
      "type": "object",
      "properties": {
        "address": {
          "description": "Postal address of the location, preferred.",
          "$ref": "PostalAddress"
        },
        "latitude": {
          "description": "Latitude in degrees. (optional)",
          "format": "double",
          "type": "number"
        },
        "longitude": {
          "description": "Longitude in degrees. (optional)",
          "format": "double",
          "type": "number"
        },
        "unstructuredAddress": {
          "type": "string",
          "description": "An unstructured address could also be provided as a fallback. E.g. \"1600 amphitheatre parkway mountain view, ca 94043\""
        }
      },
      "id": "GeoCoordinates"
    },
    "OrderOnlineMetadata": {
      "type": "object",
      "properties": {
        "fulfillmentOption": {
          "items": {
            "$ref": "FulfillmentOption"
          },
          "description": "Available fulfillment options for an order online action link.",
          "type": "array"
        }
      },
      "description": "Metadata for an order online action link.",
      "id": "OrderOnlineMetadata"
    },
    "TaxRate": {
      "id": "TaxRate",
      "type": "object",
      "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.",
          "format": "int32",
          "type": "integer"
        }
      },
      "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."
    },
    "MaddenIngestionOfferAdditionalFee": {
      "id": "MaddenIngestionOfferAdditionalFee",
      "description": "[START additional_fee_definition]",
      "type": "object",
      "properties": {
        "name": {
          "description": "The name of the additional fee. Examples: convenience fee, handling fee etc. Required.",
          "type": "string"
        },
        "fee": {
          "$ref": "MaddenIngestionOfferFee"
        }
      }
    },
    "FoodOrderingServiceV1ServiceData": {
      "description": "[START epa_service_feed_entity_definition] Service feed entity data.",
      "type": "object",
      "properties": {
        "service": {
          "$ref": "FoodOrderingServiceV1FoodOrderingService"
        },
        "serviceHours": {
          "$ref": "FoodOrderingServiceV1ServiceHours"
        },
        "fee": {
          "$ref": "FoodOrderingServiceV1Fee"
        },
        "serviceArea": {
          "$ref": "FoodOrderingServiceV1ServiceArea"
        }
      },
      "id": "FoodOrderingServiceV1ServiceData"
    },
    "LinkoutTemplate": {
      "id": "LinkoutTemplate",
      "description": "A template specifying how Google should generate URLs to a partner's site.",
      "type": "object",
      "properties": {
        "uriTemplate": {
          "type": "string",
          "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"
        }
      }
    },
    "FoodOrderingServiceV1ValidityRange": {
      "type": "object",
      "properties": {
        "validFromTime": {
          "description": "The beginning time of the range (inclusive). Optional.",
          "format": "google-datetime",
          "type": "string"
        },
        "validThroughTime": {
          "type": "string",
          "description": "The ending time of the range (exclusive). Optional.",
          "format": "google-datetime"
        }
      },
      "description": "[START epa_validty_range_definition] A closed-open timestamp range.",
      "id": "FoodOrderingServiceV1ValidityRange"
    },
    "MaddenIngestionOfferOfferDetails": {
      "id": "MaddenIngestionOfferOfferDetails",
      "description": "[START offer_details_definition] Next tag: 15",
      "type": "object",
      "properties": {
        "additionalFees": {
          "items": {
            "$ref": "MaddenIngestionOfferAdditionalFee"
          },
          "type": "array",
          "description": "Additional fees that are charged to the user. Examples: convenience, handling, delivery, packaging, service fee etc."
        },
        "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"
          ]
        },
        "convenienceFee": {
          "$ref": "MaddenIngestionOfferFee"
        },
        "giftCardInfo": {
          "description": "Details specifically for gift card deals.",
          "$ref": "MaddenIngestionOfferGiftCardInfo"
        },
        "offerDiscountType": {
          "description": "The type of discount.",
          "enum": [
            "OFFER_DISCOUNT_TYPE_UNSPECIFIED",
            "OFFER_DISCOUNT_TYPE_INSTANT_DISCOUNT",
            "OFFER_DISCOUNT_TYPE_CASHBACK",
            "OFFER_DISCOUNT_TYPE_REWARD_POINT"
          ],
          "type": "string",
          "enumDescriptions": [
            "",
            "",
            "",
            ""
          ]
        },
        "discountPercent": {
          "type": "number",
          "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.",
          "format": "float"
        },
        "bookingCost": {
          "description": "The cost to book this offer. For example, $100 off the final bill when a table is reserved at the cost of $15.",
          "$ref": "Money"
        },
        "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"
        },
        "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"
        },
        "maxDiscountValue": {
          "description": "The maximum discount that can be availed. For example, 10% off up to $100.",
          "$ref": "Money"
        },
        "offerSummaryText": {
          "description": "[START_EXCLUDE silent] A short summary of the offer, applicable mostly for offers from Merchant posts. [END_EXCLUDE]",
          "type": "string"
        },
        "discountValue": {
          "description": "Fixed value of the discount.",
          "$ref": "Money"
        },
        "offerDisplayText": {
          "description": "The offer text the offer provider wants to display to customers on the search results page. Required.",
          "type": "string"
        },
        "minSpendValue": {
          "description": "The minimum spend value to avail the discount. For example, 10% off when the total price is $100 or more.",
          "$ref": "Money"
        }
      }
    },
    "FixedFee": {
      "id": "FixedFee",
      "description": "The fixed fee required for the fulfillment method associated with the action link.",
      "type": "object",
      "properties": {
        "amount": {
          "description": "Required. The amount of the fixed fee for the fulfillment method.",
          "$ref": "Price"
        }
      }
    },
    "ServiceAvailability": {
      "type": "object",
      "properties": {
        "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"
        },
        "endTimeRestrict": {
          "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.",
          "format": "google-datetime"
        },
        "durationRestrict": {
          "type": "string",
          "description": "Setting duration further restricts the scope of the update to just the availability with matching duration.",
          "format": "google-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"
        },
        "availability": {
          "items": {
            "$ref": "Availability"
          },
          "description": "The new list of availability.",
          "type": "array"
        },
        "name": {
          "type": "string",
          "description": "The resource name of the service to apply this to. In the format of `partners/{partner_id}/merchants/{merchant_id}/services/{service_id}`"
        }
      },
      "description": "A list of availability and who/when they should be applied to.",
      "id": "ServiceAvailability"
    },
    "FoodOrderingMetadataFeeDetails": {
      "id": "FoodOrderingMetadataFeeDetails",
      "type": "object",
      "properties": {
        "type": {
          "description": "Fee type. (required)",
          "enum": [
            "FEE_TYPE_UNSPECIFIED",
            "DELIVERY",
            "SERVICE"
          ],
          "type": "string",
          "enumDescriptions": [
            "Fee type unspecified.",
            "For delivery fees.",
            "For service fees."
          ]
        },
        "feeAmount": {
          "description": "Fee amount either in unit currency, a percentage of the cart value, or a combination of both. (required)",
          "$ref": "FeeAmount"
        }
      },
      "description": "Fee details."
    },
    "PostalAddress": {
      "type": "object",
      "properties": {
        "postalCode": {
          "description": "The postal code, e.g. \"94043\". (required)",
          "type": "string"
        },
        "addressLocality": {
          "type": "string",
          "description": "The locality, e.g. \"Mountain View\". (required)"
        },
        "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"
        },
        "streetAddress": {
          "type": "string",
          "description": "The street address, e.g. \"1600 Amphitheatre Pkwy\". (required)"
        }
      },
      "description": "Address of a customer or a business.",
      "id": "PostalAddress"
    },
    "ValidityPeriod": {
      "id": "ValidityPeriod",
      "description": "[START validity_period_definition]",
      "type": "object",
      "properties": {
        "validityDurationInDays": {
          "description": "The duration (in days) the voucher/coupon is valid for, once purchased.",
          "format": "int32",
          "type": "integer"
        },
        "timeOfDay": {
          "type": "array",
          "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"
          }
        },
        "validityScope": {
          "description": "Specifies the scope of the validity period.",
          "enum": [
            "VALIDITY_SCOPE_UNSPECIFIED",
            "VALIDITY_SCOPE_CLAIM",
            "VALIDITY_SCOPE_REDEEM"
          ],
          "type": "string",
          "enumDescriptions": [
            "",
            "",
            ""
          ]
        },
        "dateExceptions": {
          "items": {
            "$ref": "Date"
          },
          "type": "array",
          "description": "Specifies exceptions in days to the above valid_period and time_of_day"
        },
        "timeExceptions": {
          "items": {
            "$ref": "ValidTimeException"
          },
          "description": "Specifies exceptions to the above valid_period and valid_time_of_week",
          "type": "array"
        },
        "validPeriod": {
          "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.",
          "$ref": "ValidityRange"
        }
      }
    },
    "MaddenIngestionOfferGiftCardInfo": {
      "type": "object",
      "properties": {
        "fixedDenominations": {
          "description": "Used when the gift card is available in specific, fixed amounts.",
          "$ref": "MaddenIngestionOfferFixedDenominations"
        },
        "customRange": {
          "description": "Used when the brand allows users to choose a custom (flexible) face value within a defined range.",
          "$ref": "MaddenIngestionOfferMoneyRange"
        }
      },
      "description": "[START gift_card_info_definition]",
      "id": "MaddenIngestionOfferGiftCardInfo"
    },
    "BatchDeleteGenericRecordsRequest": {
      "id": "BatchDeleteGenericRecordsRequest",
      "description": "The batch request to delete records of specified feed type.",
      "type": "object",
      "properties": {
        "records": {
          "items": {
            "$ref": "GenericDeleteRecord"
          },
          "description": "Records to be deleted. Maximum of 1000 records are allowed in one api call.",
          "type": "array"
        }
      }
    },
    "SchedulingRuleOverrides": {
      "id": "SchedulingRuleOverrides",
      "description": "Availability level scheduling rules.",
      "type": "object",
      "properties": {
        "firstBookableSec": {
          "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.",
          "format": "int64",
          "type": "string"
        },
        "lastOnlineCancellableSec": {
          "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)",
          "format": "int64",
          "type": "string"
        },
        "lastBookableSec": {
          "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.",
          "format": "int64"
        }
      }
    },
    "QuantitativeValue": {
      "id": "QuantitativeValue",
      "type": "object",
      "properties": {
        "value": {
          "description": "A singular value. For example: 5.6",
          "format": "double",
          "type": "number"
        },
        "valueRange": {
          "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",
          "$ref": "RangeValue"
        }
      },
      "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}`"
    },
    "PerOrderFee": {
      "id": "PerOrderFee",
      "description": "Fees that must be paid once per order, regardless of number of tickets.",
      "type": "object",
      "properties": {
        "processingFee": {
          "description": "A fee to process the user's payment method.",
          "$ref": "Price"
        },
        "deliveryFee": {
          "description": "A fee that can vary by delivery method.",
          "$ref": "Price"
        }
      }
    },
    "MaddenIngestionOfferOffer": {
      "type": "object",
      "properties": {
        "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"
        },
        "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"
        },
        "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"
        },
        "offerDetails": {
          "description": "Details of the offer such as the discount, booking cost, etc. Required.",
          "$ref": "MaddenIngestionOfferOfferDetails"
        },
        "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": {
            "enum": [
              "OFFER_TAG_UNSPECIFIED",
              "OFFER_TAG_NEW_YEAR_SPECIAL",
              "OFFER_TAG_VALENTINES_SPECIAL"
            ],
            "type": "string",
            "enumDescriptions": [
              "The UNSPECIFIED or default enum value should not be used in feeds.",
              "",
              ""
            ]
          }
        },
        "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"
        },
        "bannerImageUrl": {
          "type": "string",
          "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."
        },
        "offerSocialMediaPlatform": {
          "type": "string",
          "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"
          ]
        },
        "subscription": {
          "description": "Details of a subscription. Required for offer_category: OFFER_CATEGORY_ADD_ON_SUBSCRIPTION_OFFER.",
          "$ref": "MaddenIngestionOfferSubscription"
        },
        "offerCategory": {
          "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",
          "enumDescriptions": [
            "The UNSPECIFIED or default enum value should not be used in feeds.",
            "",
            "",
            "",
            "",
            ""
          ]
        },
        "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"
        },
        "validityPeriods": {
          "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.",
          "type": "array",
          "items": {
            "$ref": "ValidityPeriod"
          }
        },
        "offerUrl": {
          "description": "URL to the merchant's offer page. Required for offer_category: OFFER_CATEGORY_BASE_OFFER.",
          "type": "string"
        },
        "currencyCode": {
          "type": "string",
          "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"
        },
        "addOnOfferApplicableToAllEntities": {
          "description": "If true, this offer is applicable to all entities under the aggregator. Only applicable for add on offers.",
          "type": "boolean"
        },
        "coupon": {
          "description": "Details of a coupon. Required for offer_category: OFFER_CATEGORY_ADD_ON_COUPON_OFFER.",
          "$ref": "MaddenIngestionOfferCoupon"
        },
        "collapsedImageUrl": {
          "description": "The collapsed thumbnail image url for the offer. [END_EXCLUDE]",
          "type": "string"
        },
        "brandId": {
          "description": "Required for Gift Card deals to identify the brand offering the deal.",
          "type": "string"
        },
        "offerModes": {
          "items": {
            "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": "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."
            ]
          },
          "description": "The methods the offer can be availed - walk in, reservation, online, etc. Required.",
          "type": "array"
        },
        "imageUrl": {
          "description": "URL to the merchant’s offer image.",
          "type": "string"
        },
        "availabilityLevel": {
          "description": "The availability level of the offer.",
          "enum": [
            "AVAILABILITY_LEVEL_UNSPECIFIED",
            "AVAILABILITY_LEVEL_LOW"
          ],
          "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."
          ]
        },
        "entityIds": {
          "description": "List of merchants who are participating in this offer.",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "paymentInstrument": {
          "description": "Details of a payment instrument. Required for offer_category: OFFER_CATEGORY_ADD_ON_PAYMENT_OFFER.",
          "$ref": "MaddenIngestionOfferPaymentInstrument"
        },
        "offerId": {
          "type": "string",
          "description": "Unique ID of the offer. Required."
        },
        "terms": {
          "description": "Terms and conditions of the offer. Required.",
          "$ref": "MaddenIngestionOfferTerms"
        },
        "offerProvider": {
          "description": "The entity providing or funding the offer. [END_EXCLUDE]",
          "$ref": "MaddenIngestionOfferOfferProvider"
        },
        "offerSource": {
          "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",
          "enumDescriptions": [
            "",
            "",
            "[START_EXCLUDE silent]",
            "[END_EXCLUDE]"
          ]
        },
        "actionType": {
          "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"
          ],
          "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": "LINT.IfChange(offer_definition) [START offer_definition] Next tag: 29",
      "id": "MaddenIngestionOfferOffer"
    },
    "FoodOrderingServiceV1FoodOrderingService": {
      "type": "object",
      "properties": {
        "serviceId": {
          "type": "string",
          "description": "Unique identifier of the provided service. Required."
        },
        "serviceType": {
          "type": "string",
          "enumDescriptions": [
            "",
            "",
            ""
          ],
          "description": "The type of the service. Required and cannot be SERVICE_TYPE_UNKNOWN.",
          "enum": [
            "SERVICE_TYPE_UNKNOWN",
            "DELIVERY",
            "TAKEOUT"
          ]
        },
        "leadTime": {
          "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.",
          "$ref": "FoodOrderingServiceV1ETA"
        },
        "parentEntityId": {
          "type": "string",
          "description": "The parent entity’s ID. Required."
        },
        "actionLinkId": {
          "description": "Parent action detail's link ID. Required.",
          "type": "string"
        },
        "disabled": {
          "description": "Indicates if the entity is disabled. Optional.",
          "type": "boolean"
        }
      },
      "description": "[START fo_epa_service_definition]",
      "id": "FoodOrderingServiceV1FoodOrderingService"
    },
    "Service": {
      "type": "object",
      "properties": {
        "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"
          ],
          "type": "string",
          "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."
          ]
        },
        "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)",
          "$ref": "Deposit"
        },
        "rating": {
          "description": "User rating for this service as an aggregate metric over all reviews.",
          "$ref": "Rating"
        },
        "form": {
          "items": {
            "$ref": "ServiceIntakeForm"
          },
          "type": "array",
          "description": "Deprecated. Please use intake_form and per_ticket_intake_form.",
          "deprecated": true
        },
        "virtualSession": {
          "description": "Optional. Information about virtual session. It is required for enabling virtual services.",
          "$ref": "VirtualSession"
        },
        "toursAndActivitiesContent": {
          "description": "Content fields specific to Tours and Activities.",
          "$ref": "ToursAndActivitiesContent"
        },
        "description": {
          "description": "The user-visible description of the service. Deprecated, use localized_description instead.",
          "type": "string"
        },
        "price": {
          "description": "The price of the service.",
          "$ref": "Price"
        },
        "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)",
          "$ref": "NoShowFee"
        },
        "waitlistRules": {
          "description": "Rules to joining the waitlist.",
          "$ref": "WaitlistRules"
        },
        "name": {
          "description": "The service resource name, which has the format of `partners/{partner_id}/merchants/{merchant_id}/services/{service_id}`.",
          "type": "string"
        },
        "requireCreditCard": {
          "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"
          ],
          "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."
          ]
        },
        "integrationType": {
          "type": "string",
          "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"
          ]
        },
        "perOrderFee": {
          "description": "Order level fees for purchasing this service. (optional)",
          "$ref": "PerOrderFee"
        },
        "uriTemplate": {
          "description": "Optional. An optional template specifying how Google should generate URLs to external site.",
          "$ref": "UriTemplate"
        },
        "priceInterpretation": {
          "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"
          ],
          "type": "string",
          "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"
          ]
        },
        "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.",
          "$ref": "TaxRate"
        },
        "serviceAttributeValueId": {
          "type": "array",
          "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"
          }
        },
        "localizedServiceName": {
          "description": "The name of the service, e.g. \"Men's haircut\". Possibly in several locales.",
          "$ref": "Text"
        },
        "prepaymentTerms": {
          "description": "Terms around when the prepayment is completed.",
          "$ref": "PrepaymentTerms"
        },
        "actionLink": {
          "description": "An action link related to this service. If action link exists, type (see below) must be set in the Service.",
          "type": "array",
          "items": {
            "$ref": "ActionLink"
          }
        },
        "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"
          ]
        },
        "perTicketIntakeForm": {
          "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)",
          "$ref": "ServiceIntakeForm"
        },
        "paymentOptionId": {
          "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.",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "rules": {
          "description": "Rules to book/cancel an appointment.",
          "$ref": "SchedulingRules"
        },
        "relatedMedia": {
          "type": "array",
          "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"
          }
        },
        "ticketingVerticalSpecificData": {
          "description": "Additional information unique to the event ticketing vertical. (optional)",
          "$ref": "TicketingVerticalSpecificData"
        },
        "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"
        },
        "homeServiceData": {
          "description": "Additional information unique to home service vertical. (optional)",
          "$ref": "HomeServiceData"
        },
        "localizedDescription": {
          "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.",
          "$ref": "Text"
        },
        "location": {
          "type": "array",
          "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"
          }
        },
        "serviceName": {
          "description": "The name of the service, e.g. \"Men's haircut\". Deprecated, use localized_service_name instead.",
          "type": "string"
        },
        "ticketType": {
          "type": "array",
          "description": "Types of tickets that can be booked/purchased for this service, if tickets are supported. (optional)",
          "items": {
            "$ref": "TicketType"
          }
        },
        "intakeForm": {
          "description": "A form requesting additional information from the user when they book this service. (optional)",
          "$ref": "ServiceIntakeForm"
        }
      },
      "description": "Info about a service that is provided by the merchant, e.g. haircut.",
      "id": "Service"
    },
    "ToursAndActivitiesContent": {
      "id": "ToursAndActivitiesContent",
      "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: , ",
      "type": "object",
      "properties": {
        "exclusions": {
          "items": {
            "$ref": "Text"
          },
          "description": "The user-visible list of exclusions.",
          "type": "array"
        },
        "highlights": {
          "type": "array",
          "description": "The user-visible list of highlights.",
          "items": {
            "$ref": "Text"
          }
        },
        "inclusions": {
          "items": {
            "$ref": "Text"
          },
          "description": "The user-visible list of inclusions.",
          "type": "array"
        },
        "mustKnow": {
          "type": "array",
          "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"
          }
        }
      }
    },
    "GenericRecord": {
      "type": "object",
      "properties": {
        "dataRecord": {
          "type": "string",
          "description": "For non-proto based feeds.",
          "format": "byte"
        },
        "generationTimestamp": {
          "description": "Required. This timestamp is used to to ensure correct ordering of inventory updates.",
          "format": "google-datetime",
          "type": "string"
        },
        "protoRecord": {
          "additionalProperties": {
            "description": "Properties of the object. Contains field @type with type URL.",
            "type": "any"
          },
          "type": "object",
          "description": "For proto-based feeds."
        }
      },
      "description": "Record of the feed type mentioned in url request.",
      "id": "GenericRecord"
    },
    "FoodOrderingServiceV1DurationInterval": {
      "id": "FoodOrderingServiceV1DurationInterval",
      "description": "[START epa_duration_interval_definition] A closed-open duration range.",
      "type": "object",
      "properties": {
        "minOffset": {
          "description": "The minimum duration (inclusive). Required.",
          "format": "google-duration",
          "type": "string"
        },
        "maxOffset": {
          "type": "string",
          "description": "The maximum duration (exclusive). Required.",
          "format": "google-duration"
        }
      }
    },
    "NoShowFee": {
      "id": "NoShowFee",
      "type": "object",
      "properties": {
        "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"
          ]
        },
        "fee": {
          "description": "The amount the user may be charged if they do not show up for their reservation.",
          "$ref": "Price"
        }
      },
      "description": "A fee that a user may be charged if they have made a booking but do not show up."
    },
    "TicketingVerticalSpecificData": {
      "id": "TicketingVerticalSpecificData",
      "type": "object",
      "properties": {
        "eventOrganizer": {
          "description": "Optional. Organizer who hosts the event.",
          "$ref": "Text"
        },
        "eventAttendanceMode": {
          "type": "string",
          "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"
          ]
        },
        "eventOrganizerUrl": {
          "description": "Optional. URL of the organizer who hosts the event.",
          "type": "string"
        },
        "entity": {
          "items": {
            "$ref": "Entity"
          },
          "description": "A list of entities related to the event. (optional)",
          "type": "array"
        },
        "eventSourceUrl": {
          "type": "array",
          "description": "Required. URL of the pages where the event information or descriptions can be found.",
          "items": {
            "type": "string"
          }
        },
        "eventCreator": {
          "description": "Optional. Information about the creator of the event.",
          "$ref": "EventCreator"
        },
        "eventOrganizerType": {
          "description": "Optional. The type of the organizer.",
          "enum": [
            "ORGANIZER_TYPE_UNSPECIFIED",
            "PERSON",
            "ORGANIZATION"
          ],
          "type": "string",
          "enumDescriptions": [
            "Not specified.",
            "For organizer who is a person.",
            "For organizer who is an organization."
          ]
        },
        "eventVirtualLocationUrl": {
          "items": {
            "type": "string"
          },
          "description": "Optional. URL where the event can be watched.",
          "type": "array"
        },
        "brandName": {
          "description": "Optional. The localized brand name.",
          "$ref": "Text"
        },
        "eventUrl": {
          "description": "The URL of the event on the partner's website. (optional)",
          "type": "string"
        },
        "eventState": {
          "type": "string",
          "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"
          ]
        },
        "eventCategory": {
          "type": "string",
          "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"
          ]
        }
      },
      "description": "Additional information unique to the event ticketing vertical."
    },
    "BatchPushGenericRecordRequest": {
      "description": "The batch request to insert and/or update records of feed type specified in the request url.",
      "type": "object",
      "properties": {
        "records": {
          "description": "Records to be inserted and/or updated. Maximum of 1000 records are allowed in one api call.",
          "type": "array",
          "items": {
            "$ref": "GenericRecord"
          }
        }
      },
      "id": "BatchPushGenericRecordRequest"
    },
    "PrepaymentTerms": {
      "description": "Specific information around when prepayment is completed.",
      "type": "object",
      "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.",
          "format": "int64",
          "type": "string"
        },
        "chargeTiming": {
          "description": "When the charge will occur relative to the purchase time.",
          "enum": [
            "CHARGE_TIMING_UNSPECIFIED",
            "CHARGE_NOW",
            "CHARGE_LATER"
          ],
          "type": "string",
          "enumDescriptions": [
            "Unused.",
            "Customer will be charged immediately.",
            "Customer will be charged later."
          ]
        }
      },
      "id": "PrepaymentTerms"
    },
    "Prepayment": {
      "description": "A payment the user may be charged as part of their reservation.",
      "type": "object",
      "properties": {
        "priceInfo": {
          "description": "Container for price details.",
          "$ref": "PriceInfo"
        }
      },
      "id": "Prepayment"
    },
    "Deposit": {
      "type": "object",
      "properties": {
        "deposit": {
          "description": "Deposit amount.",
          "$ref": "Price"
        },
        "minAdvanceCancellationSec": {
          "type": "string",
          "description": "Minimum advance cancellation for the deposit.",
          "format": "int64"
        },
        "depositType": {
          "description": "Defines how the deposit is determined from the availability.",
          "enum": [
            "FIXED_RATE_DEFAULT",
            "PER_PERSON"
          ],
          "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": "A deposit that the user may be charged or have a hold on their credit card for.",
      "id": "Deposit"
    },
    "GenericDeleteRecord": {
      "type": "object",
      "properties": {
        "deleteTime": {
          "description": "Required. This timestamp is used to determine the order in which a delete will be applied to the inventory.",
          "format": "google-datetime",
          "type": "string"
        },
        "protoRecord": {
          "additionalProperties": {
            "type": "any",
            "description": "Properties of the object. Contains field @type with type URL."
          },
          "type": "object",
          "description": "For proto-based feeds."
        },
        "dataRecord": {
          "description": "For non-proto based feeds.",
          "format": "byte",
          "type": "string"
        }
      },
      "description": "Record to be deleted of the feed type mentioned in url request.",
      "id": "GenericDeleteRecord"
    },
    "WaitlistRules": {
      "description": "Rules related to joining the waitlist.",
      "type": "object",
      "properties": {
        "maxPartySize": {
          "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.",
          "format": "int32",
          "type": "integer"
        },
        "aboveMaxPartySizeOptions": {
          "items": {
            "$ref": "UnsupportedPartySizeOption"
          },
          "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.",
          "type": "array"
        },
        "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.",
          "format": "int32",
          "type": "integer"
        },
        "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"
        }
      },
      "id": "WaitlistRules"
    },
    "FeeDetails": {
      "id": "FeeDetails",
      "description": "Fee details for the fulfillment method associated with the action link.",
      "type": "object",
      "properties": {
        "noFee": {
          "description": "No fee for the fulfillment method.",
          "$ref": "NoFee"
        },
        "baseFee": {
          "description": "The base fee associated with the fulfillment method.",
          "$ref": "MinimumFee"
        },
        "fixedFee": {
          "description": "The fixed fee associated with the fulfillment method.",
          "$ref": "FixedFee"
        }
      }
    },
    "ExtendedServiceAvailability": {
      "type": "object",
      "properties": {
        "merchantId": {
          "type": "string",
          "description": "This is a mandatory field required to specify which merchant the availability messages below belong to."
        },
        "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"
        },
        "endTimeRestrict": {
          "description": "Setting end_time_restrict while leaving start_time_restrict unset is interpreted to mean all time up to the end_time_restrict.",
          "format": "google-datetime",
          "type": "string"
        },
        "durationRestrict": {
          "type": "string",
          "description": "Setting duration further restricts the scope of the update to just the availability with matching duration.",
          "format": "google-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"
        },
        "availability": {
          "items": {
            "$ref": "Availability"
          },
          "type": "array",
          "description": "The new list of availability."
        },
        "serviceId": {
          "type": "string",
          "description": "This is a mandatory field required to specify which service the availability messages below belong to."
        }
      },
      "description": "A list of availability and who/when they should be applied to.",
      "id": "ExtendedServiceAvailability"
    },
    "MerchantStatus": {
      "id": "MerchantStatus",
      "description": "Status of a merchant in the Reserve with Google platform.",
      "type": "object",
      "properties": {
        "waitlistStatus": {
          "description": "Status related to waitlist integration.",
          "$ref": "WaitlistStatus"
        },
        "geoMatch": {
          "description": "Matched Geo place of this merchant. Empty if the merchant is not Geo matched.",
          "$ref": "PlaceInfo"
        },
        "processingStatus": {
          "description": "Merchant processing status.",
          "enum": [
            "PROCESSING_STATUS_UNSPECIFIED",
            "IN_PROGRESS",
            "COMPLETED"
          ],
          "type": "string",
          "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."
          ]
        },
        "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": {
          "type": "string",
          "description": "The merchant status resource name, which has the format of `partners/{partner_id}/merchants/{merchant_id}/status`"
        },
        "directUrls": {
          "items": {
            "$ref": "DirectUrl"
          },
          "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.",
          "type": "array"
        },
        "merchantName": {
          "type": "string",
          "description": "Name of the merchant provided by partners."
        },
        "bookingStatus": {
          "description": "Status related to end-to-end booking integration.",
          "$ref": "BookingStatus"
        },
        "inputGeoInfo": {
          "description": "Partners provided Geo info of the merchant.",
          "$ref": "GeoCoordinates"
        }
      }
    },
    "FoodOrderingServiceV1Fee": {
      "type": "object",
      "properties": {
        "areaIds": {
          "description": "Service area can be provided to further restrict eligibility of the fee. Optional.",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "feeType": {
          "type": "string",
          "enumDescriptions": [
            "",
            "",
            ""
          ],
          "description": "Indicates the nature of the service, e.g. delivery fee/service fee. Required.",
          "enum": [
            "FEE_TYPE_UNKNOWN",
            "DELIVERY",
            "SERVICE"
          ]
        },
        "fixedAmount": {
          "description": "A fixed amount of fees to be collected.",
          "$ref": "Money"
        },
        "rangeAmount": {
          "description": "A range of fees that could be collected. Will mirror madden.ingestion.MoneyRange for the starting point.",
          "$ref": "FoodOrderingServiceV1MoneyRange"
        },
        "cartPercentage": {
          "description": "Fees in terms of amount percentage. Will mirror madden.ingestion.QuantitativeValue for the starter.",
          "$ref": "FoodOrderingServiceV1PercentageBasedFee"
        },
        "serviceIds": {
          "items": {
            "type": "string"
          },
          "description": "Service association needs to be provided. Required.",
          "type": "array"
        },
        "feeId": {
          "type": "string",
          "description": "Unique identifier to the Fee entity. Required."
        }
      },
      "description": "[START epa_fee_definition]",
      "id": "FoodOrderingServiceV1Fee"
    },
    "UnsupportedPartySizeOption": {
      "type": "object",
      "properties": {
        "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.",
          "$ref": "CallMerchant"
        }
      },
      "description": "Options for parties that are out of range.",
      "id": "UnsupportedPartySizeOption"
    },
    "FoodOrderingServiceV1TimeOfDayRange": {
      "description": "[START epa_time_of_range_definition] A closed-open time range.",
      "type": "object",
      "properties": {
        "openTime": {
          "description": "A Time indicating the beginning time of the day of the range (inclusive). Required. If not given, we assume 00:00:00.",
          "$ref": "TimeOfDay"
        },
        "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"
        }
      },
      "id": "FoodOrderingServiceV1TimeOfDayRange"
    },
    "Recurrence": {
      "id": "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.",
      "type": "object",
      "properties": {
        "repeatEvery": {
          "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)",
          "format": "google-duration"
        },
        "repeatUntil": {
          "type": "string",
          "description": "The inclusive maximum UTC timestamp the availability repeats until.",
          "format": "google-datetime"
        }
      }
    },
    "LocalizedString": {
      "id": "LocalizedString",
      "description": "Instance of a string in one locale.",
      "type": "object",
      "properties": {
        "value": {
          "type": "string",
          "description": "Message in the locale above (UTF-8)."
        },
        "locale": {
          "type": "string",
          "description": "IETF BCP 47 language code, such as \"en\", \"mas\", \"zh-Hant\", \"de-CH-1901\". See http://www.w3.org/International/articles/language-tags/."
        }
      }
    },
    "Order": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "description": "Resource name of the order: `partners/{partner ID}/orders/{order ID}`"
        },
        "item": {
          "items": {
            "$ref": "LineItem"
          },
          "type": "array",
          "description": "Line items in this order."
        },
        "clientInformation": {
          "description": "Personal information of the client making the order.",
          "$ref": "ClientInformation"
        },
        "merchantId": {
          "description": "ID of the merchant that all services in this order belong to.",
          "type": "string"
        },
        "paymentInformation": {
          "description": "Information about payment transactions that relate to the order.",
          "$ref": "PaymentInformation"
        }
      },
      "description": "An order for service appointments with a merchant.",
      "id": "Order"
    },
    "TokenizationConfig": {
      "type": "object",
      "properties": {
        "tokenizationParameter": {
          "type": "object",
          "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\" }",
          "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"
          ]
        }
      },
      "description": "A configuration for payment-processor tokenization, set up on a per-Merchant basis.",
      "id": "TokenizationConfig"
    },
    "FoodOrderingServiceV1ETA": {
      "id": "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.",
      "type": "object",
      "properties": {
        "minLeadTimeDuration": {
          "description": "Indicates a range of ETA duration.",
          "format": "google-duration",
          "type": "string"
        },
        "maxLeadTimeDuration": {
          "format": "google-duration",
          "type": "string"
        }
      }
    },
    "PublicIdentificationData": {
      "type": "object",
      "properties": {
        "relevantUrl": {
          "type": "array",
          "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"
          }
        },
        "musicbrainzId": {
          "type": "string",
          "description": "The 36-character musicbrainz identifier of the artist or other music entities, if applicable. See https://musicbrainz.org/doc/MusicBrainz_Identifier. (optional)"
        }
      },
      "description": "Identifiers, webpages, or any other public sources that reference an entity.",
      "id": "PublicIdentificationData"
    },
    "MaddenIngestionOfferFoodOfferRestrictions": {
      "type": "object",
      "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": {
            "enum": [
              "MEAL_TYPE_UNSPECIFIED",
              "MEAL_TYPE_BREAKFAST",
              "MEAL_TYPE_LUNCH",
              "MEAL_TYPE_DINNER"
            ],
            "type": "string",
            "enumDescriptions": [
              "The UNSPECIFIED or default enum value should not be used in feeds.",
              "",
              "",
              ""
            ]
          }
        },
        "restrictedToCertainCourses": {
          "description": "Whether the offer can only be applied to certain courses.",
          "type": "boolean"
        }
      },
      "description": "[START food_offer_restrictions_definition]",
      "id": "MaddenIngestionOfferFoodOfferRestrictions"
    },
    "FoodOrderingServiceV1Locality": {
      "type": "object",
      "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.",
      "id": "FoodOrderingServiceV1Locality"
    },
    "BatchReplaceServiceAvailabilityResponse": {
      "id": "BatchReplaceServiceAvailabilityResponse",
      "type": "object",
      "properties": {
        "extendedServiceAvailability": {
          "items": {
            "$ref": "ExtendedServiceAvailability"
          },
          "type": "array",
          "description": "The successfully updated extended service availability messages that were used to replace the existing availability slots."
        }
      },
      "description": "The batch response to replace multiple Service's availability slots. Only successfully updated slots will be included in this message"
    },
    "MaddenIngestionOfferPaymentInstrumentItem": {
      "description": "[START payment_instrument_item_definition]",
      "type": "object",
      "properties": {
        "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"
          ],
          "type": "string",
          "enumDescriptions": [
            "The UNSPECIFIED or default enum value should not be used in feeds.",
            "",
            "",
            "",
            "",
            "",
            ""
          ]
        },
        "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"
        }
      },
      "id": "MaddenIngestionOfferPaymentInstrumentItem"
    },
    "NoFee": {
      "description": "No fee required for the fulfillment method associated with the action link.",
      "type": "object",
      "properties": {},
      "id": "NoFee"
    },
    "AdvanceOrderDetails": {
      "id": "AdvanceOrderDetails",
      "type": "object",
      "properties": {
        "isSupported": {
          "description": "True if Advance Orders, also known as Order Ahead, is supported. (required)",
          "type": "boolean"
        }
      },
      "description": "For order ahead support."
    },
    "DurationRange": {
      "id": "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.",
      "type": "object",
      "properties": {
        "minDuration": {
          "description": "Minimum duration.",
          "format": "google-duration",
          "type": "string"
        },
        "maxDuration": {
          "type": "string",
          "description": "Maximum duration.",
          "format": "google-duration"
        }
      }
    },
    "MaddenIngestionOfferFixedDenominations": {
      "id": "MaddenIngestionOfferFixedDenominations",
      "type": "object",
      "properties": {
        "amounts": {
          "items": {
            "$ref": "Money"
          },
          "type": "array",
          "description": "A list of all available discrete denominations (e.g., [100, 500, 1000])."
        }
      }
    },
    "UriTemplate": {
      "type": "object",
      "properties": {
        "uriTemplate": {
          "type": "string",
          "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"
        }
      },
      "description": "A template specifying how Google should generate URLs to external site.",
      "id": "UriTemplate"
    },
    "UserPurchaseRestriction": {
      "type": "object",
      "properties": {
        "newToMerchant": {
          "type": "boolean",
          "description": "A payment option that can only be purchased by users who have never purchased from the same merchant before."
        },
        "newToPaymentOption": {
          "description": "A payment option that can only be purchased by users who have never purchased the same payment option before.",
          "type": "boolean"
        }
      },
      "description": "Restricts the users eligible to purchase a payment option.",
      "id": "UserPurchaseRestriction"
    },
    "FoodOrderingServiceV1AsapTimeWindow": {
      "description": "The orderable and fulfillment time window for ASAP orders. [START epa_asap_time_window_definition]",
      "type": "object",
      "properties": {
        "timeWindows": {
          "description": "A time window the ASAP order can be placed and fulfilled. Required.",
          "$ref": "FoodOrderingServiceV1TimeOfDayWindow"
        },
        "leadTime": {
          "description": "Indicates the lead time, specific to service_time, the service can be fulfilled. Optional.",
          "$ref": "FoodOrderingServiceV1ETA"
        }
      },
      "id": "FoodOrderingServiceV1AsapTimeWindow"
    },
    "PriceInfo": {
      "id": "PriceInfo",
      "type": "object",
      "properties": {
        "priceRange": {
          "description": "The upper and/or lower bound of a service or a fee.",
          "$ref": "PriceRange"
        },
        "price": {
          "description": "The price of a service or a fee.",
          "$ref": "Price"
        },
        "priceType": {
          "description": "Defines how price or price range is applied (per person or fixed)",
          "enum": [
            "FIXED_RATE_DEFAULT",
            "PER_PERSON"
          ],
          "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": "Container for price details."
    },
    "RangeValue": {
      "id": "RangeValue",
      "type": "object",
      "properties": {
        "minValue": {
          "description": "Minimum value.",
          "format": "double",
          "type": "number"
        },
        "maxValue": {
          "description": "Maximum value.",
          "format": "double",
          "type": "number"
        }
      },
      "description": "Range of values such that `min_value` \u003c `max_value`. Requires at least one of `min_value` and `max_value`."
    },
    "AvailableDay": {
      "description": "Day level availability.",
      "type": "object",
      "properties": {
        "lastOrderingTime": {
          "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.",
          "format": "google-datetime",
          "type": "string"
        },
        "fulfillmentDate": {
          "description": "Required. An available date for a fulfillment method. Assumed to be in merchant's timezone.",
          "$ref": "Date"
        }
      },
      "id": "AvailableDay"
    },
    "ValidTimeException": {
      "id": "ValidTimeException",
      "description": "[START valid_time_exception_definition]",
      "type": "object",
      "properties": {
        "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.",
          "type": "array",
          "items": {
            "$ref": "TimeOfDayWindow"
          }
        },
        "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"
        }
      }
    },
    "ActionLink": {
      "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.",
      "type": "object",
      "properties": {
        "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"
        },
        "orderOnlineMetadata": {
          "description": "Metadata for the order online link. Supports action with ActionLinkType of ACTION_LINK_TYPE_SHOP_ONLINE.",
          "$ref": "OrderOnlineMetadata"
        },
        "eventMetadata": {
          "description": "Additional information about action link which is unique to the events vertical.",
          "$ref": "EventMetadata"
        },
        "language": {
          "description": "The BCP-47 language tag identifying the language in which the content from this URI is available.",
          "type": "string"
        },
        "actionLinkType": {
          "type": "string",
          "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."
          ],
          "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"
          ]
        },
        "url": {
          "description": "The entry point URL for this action link.",
          "type": "string"
        },
        "restrictedCountry": {
          "items": {
            "type": "string"
          },
          "description": "ISO 3166-1 alpha-2 country code. Leave empty for unrestricted visibility.",
          "type": "array"
        },
        "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"
          ],
          "type": "string",
          "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."
          ]
        }
      },
      "id": "ActionLink"
    },
    "TimeOfDay": {
      "type": "object",
      "properties": {
        "hours": {
          "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.",
          "format": "int32"
        },
        "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": {
          "type": "integer",
          "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"
        },
        "seconds": {
          "type": "integer",
          "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.",
          "format": "int32"
        }
      },
      "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`.",
      "id": "TimeOfDay"
    },
    "MaddenIngestionOfferCoupon": {
      "id": "MaddenIngestionOfferCoupon",
      "description": "[START coupon_definition]",
      "type": "object",
      "properties": {
        "code": {
          "description": "Coupon code required to redeem the offer. Required.",
          "type": "string"
        },
        "text": {
          "description": "The coupon text the offer provider wants to display to users.",
          "type": "string"
        }
      }
    },
    "Price": {
      "type": "object",
      "properties": {
        "pricingOptionTag": {
          "type": "string",
          "description": "An optional and opaque string that identifies the pricing option that is associated with the extended price."
        },
        "priceMicros": {
          "type": "string",
          "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"
        },
        "currencyCode": {
          "description": "The currency of the price that is defined in ISO 4217.",
          "type": "string"
        }
      },
      "description": "The price of a service or a fee.",
      "id": "Price"
    },
    "FoodOrderingServiceV1PercentageBasedFee": {
      "description": "[START epa_percentage_based_fee] Variable fee which changes based on the price of the order.",
      "type": "object",
      "properties": {
        "baseValue": {
          "description": "Optional, base fee not including the variable percentage based fee.",
          "$ref": "Money"
        },
        "percentageOfCartValue": {
          "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.",
          "format": "double",
          "type": "number"
        },
        "range": {
          "description": "Optional, overall range of possible values of the PercentageBasedFee.",
          "$ref": "FoodOrderingServiceV1MoneyRange"
        }
      },
      "id": "FoodOrderingServiceV1PercentageBasedFee"
    },
    "FoodOrderingServiceV1GeoCircle": {
      "description": "[START epa_geo_circle_definition] Geographical circular area described by a point and radius.",
      "type": "object",
      "properties": {
        "center": {
          "description": "Geographical center of the area. Required.",
          "$ref": "LatLng"
        },
        "radius": {
          "type": "number",
          "description": "Radius for the circular area, in meters. Must be greater than 0. Required.",
          "format": "double"
        }
      },
      "id": "FoodOrderingServiceV1GeoCircle"
    },
    "ServiceIntakeFormField": {
      "id": "ServiceIntakeFormField",
      "type": "object",
      "properties": {
        "choiceText": {
          "type": "array",
          "description": "Set if and only if the field type is MULTIPLE_CHOICE, CHECKBOXES, or DROPDOWN. Used to enumerate possible choices.",
          "items": {
            "$ref": "Text"
          }
        },
        "isRequired": {
          "type": "boolean",
          "description": "Indicates whether an answer to this field is required by a user."
        },
        "ticketTypeRestrict": {
          "items": {
            "type": "string"
          },
          "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."
        },
        "type": {
          "type": "string",
          "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."
          ],
          "description": "The type of this field.",
          "enum": [
            "FIELD_TYPE_UNSPECIFIED",
            "SHORT_ANSWER",
            "PARAGRAPH",
            "MULTIPLE_CHOICE",
            "CHECKBOXES",
            "DROPDOWN",
            "BOOLEAN",
            "LOCATION_SEARCH"
          ]
        },
        "label": {
          "description": "The text shown to the user for this field. Deprecated, please use `localized_label` instead.",
          "type": "string"
        },
        "additionalOption": {
          "items": {
            "$ref": "Text"
          },
          "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)"
        },
        "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"
        },
        "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"
        },
        "hint": {
          "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)",
          "$ref": "Text"
        },
        "localizedLabel": {
          "description": "The text shown to the user for this field. The field can be supplied in multiple locales. (required)",
          "$ref": "Text"
        },
        "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"
          }
        }
      },
      "description": "Defines a field that is included in a ServiceIntakeForm."
    },
    "FeedStatistics": {
      "type": "object",
      "properties": {
        "deletedItems": {
          "description": "Items no longer present in this feed, and that were removed as a result.",
          "format": "int64",
          "type": "string"
        },
        "existingItems": {
          "type": "string",
          "description": "Existing items, updated as needed from newer information from the feed.",
          "format": "int64"
        },
        "newItems": {
          "type": "string",
          "description": "Newly added items by this feed. Items can be merchants, services or availability slots, depending on the type of the feed.",
          "format": "int64"
        }
      },
      "description": "Statistics obtained while processing an uploaded feed.",
      "id": "FeedStatistics"
    },
    "Availability": {
      "id": "Availability",
      "type": "object",
      "properties": {
        "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"
          ],
          "type": "string",
          "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."
          ]
        },
        "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"
        },
        "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"
        },
        "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"
          ],
          "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."
          ]
        },
        "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"
          }
        },
        "duration": {
          "type": "string",
          "description": "Duration of the appointment slot",
          "format": "google-duration"
        },
        "startTime": {
          "description": "Start time of the appointment slot.",
          "format": "google-datetime",
          "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"
          ],
          "type": "string",
          "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."
          ]
        },
        "linkoutRequiredReason": {
          "type": "string",
          "enumDescriptions": [
            "Default value: Do not use, equates to unknown.",
            "Slot requires payment in the partner platform to be booked."
          ],
          "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"
          ]
        },
        "spotsTotal": {
          "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`.",
          "format": "int64",
          "type": "string"
        },
        "spotsOpen": {
          "description": "Number of open spots.",
          "format": "int64",
          "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"
        },
        "prepayment": {
          "description": "Optional. Optional prepayment information for this availability.",
          "$ref": "Prepayment"
        },
        "schedulingRuleOverrides": {
          "description": "Availability scheduling rules. If fields are populated, they will override any corresponding scheduling rules on the service-level SchedulingRules.",
          "$ref": "SchedulingRuleOverrides"
        },
        "deposit": {
          "description": "Optional deposit for this availability. Overrides the service deposit if one was specified.",
          "$ref": "Deposit"
        },
        "paymentOptionId": {
          "items": {
            "type": "string"
          },
          "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."
        },
        "ticketTypeId": {
          "items": {
            "type": "string"
          },
          "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)",
          "type": "array"
        }
      },
      "description": "An availability slot of the merchant's service, indicating time and number of spots."
    },
    "Terms": {
      "id": "Terms",
      "description": "A set of rules and guidelines that are displayed to the user in order to make a booking through Reserve with Google.",
      "type": "object",
      "properties": {
        "text": {
          "type": "string",
          "description": "The text to be displayed to the user. Use localized_text below for new integrations."
        },
        "url": {
          "description": "Optionally, the URL to the Terms and Conditions.",
          "type": "string"
        },
        "localizedText": {
          "description": "The localized text to be displayed to the user.",
          "$ref": "Text"
        }
      }
    },
    "LatLng": {
      "id": "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",
      "properties": {
        "latitude": {
          "description": "The latitude in degrees. It must be in the range [-90.0, +90.0].",
          "format": "double",
          "type": "number"
        },
        "longitude": {
          "description": "The longitude in degrees. It must be in the range [-180.0, +180.0].",
          "format": "double",
          "type": "number"
        }
      }
    },
    "EventCreator": {
      "type": "object",
      "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.",
      "id": "EventCreator"
    },
    "WaitlistStatus": {
      "id": "WaitlistStatus",
      "description": "Status related to waitlist integration.",
      "type": "object",
      "properties": {
        "hasValidWaitlistService": {
          "type": "boolean",
          "description": "True if the merchant has waitlist service. Doesn't guarantee the merchant is actually served."
        }
      }
    },
    "FoodOrderingServiceV1TimeOfDayWindow": {
      "id": "FoodOrderingServiceV1TimeOfDayWindow",
      "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.",
      "type": "object",
      "properties": {
        "timeWindows": {
          "description": "The time window the order can be placed/fulfilled. Required.",
          "$ref": "FoodOrderingServiceV1TimeOfDayRange"
        },
        "dayOfWeek": {
          "items": {
            "type": "string",
            "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"
            ]
          },
          "description": "The list of days in a week the windows are applied. Required. If not given, we assume 7 days a week.",
          "type": "array"
        }
      }
    },
    "DirectMerchantPayment": {
      "id": "DirectMerchantPayment",
      "description": "Information about how the user can pay directly to the merchant instead of pre-paying for the service via RwG.",
      "type": "object",
      "properties": {
        "paymentMethods": {
          "items": {
            "$ref": "Text"
          },
          "type": "array",
          "description": "Users would be advised to pay only via the payment methods mentioned below."
        }
      }
    },
    "LocalServicesMatchInfo": {
      "id": "LocalServicesMatchInfo",
      "description": "Information of the Google local services match (only set for local services merchant).",
      "type": "object",
      "properties": {
        "matchedProviders": {
          "items": {
            "$ref": "MatchedProvider"
          },
          "type": "array",
          "description": "Matched service providers. A merchant can be matched to multiple service providers."
        }
      }
    },
    "CreditCardRestrictions": {
      "type": "object",
      "properties": {
        "creditCardType": {
          "items": {
            "enum": [
              "CREDIT_CARD_TYPE_UNSPECIFIED",
              "VISA",
              "MASTERCARD",
              "AMERICAN_EXPRESS",
              "DISCOVER",
              "JCB"
            ],
            "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."
            ]
          },
          "description": "A list of supported credit cards. No credit cards are supported if empty.",
          "type": "array"
        }
      },
      "description": "Restrictions to the credit card types this merchant accepts.",
      "id": "CreditCardRestrictions"
    },
    "MatchedProvider": {
      "type": "object",
      "properties": {
        "categories": {
          "items": {
            "type": "string"
          },
          "type": "array",
          "description": "Local service categories (verticals). E.g. \"plumber\" and \"carpet_cleaning\"."
        },
        "customerId": {
          "description": "Google local services external customer ID.",
          "format": "int64",
          "type": "string"
        }
      },
      "description": "Local services provider.",
      "id": "MatchedProvider"
    },
    "MaddenIngestionOfferMoneyRange": {
      "description": "[START money_range_definition]",
      "type": "object",
      "properties": {
        "minAmount": {
          "$ref": "Money"
        },
        "maxAmount": {
          "$ref": "Money"
        }
      },
      "id": "MaddenIngestionOfferMoneyRange"
    },
    "PaymentRestrictions": {
      "id": "PaymentRestrictions",
      "description": "Restrictions to the payment methods this merchant accepts.",
      "type": "object",
      "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"
        }
      }
    },
    "Location": {
      "id": "Location",
      "type": "object",
      "properties": {
        "telephone": {
          "type": "string",
          "description": "The public telephone number of the location including its country and area codes, e.g. +14567891234. (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"
        },
        "geo": {
          "description": "The Geo info of the location, including latitude, longitude, and address. (optional)",
          "$ref": "GeoCoordinates"
        },
        "name": {
          "type": "string",
          "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)"
        },
        "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"
        },
        "url": {
          "description": "The url of the location's public website. (optional)",
          "type": "string"
        }
      },
      "description": "Geographic information about a location."
    },
    "PaymentProcessorConfig": {
      "type": "object",
      "properties": {
        "publicKey": {
          "type": "string",
          "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"
        },
        "processor": {
          "type": "string",
          "enumDescriptions": [
            "Unused",
            "A configuration for payments with Stripe.",
            "A configuration for payments with Braintree."
          ],
          "description": "Defines the payment processor partner this configuration applies to.",
          "enum": [
            "PROCESSOR_UNSPECIFIED",
            "PROCESSOR_STRIPE",
            "PROCESSOR_BRAINTREE"
          ]
        },
        "version": {
          "type": "string",
          "description": "The API version number sent to the payment processor along with payment requests."
        }
      },
      "description": "A configuration for a payment processor, setup on a per Merchant basis.",
      "id": "PaymentProcessorConfig"
    },
    "FoodOrderingServiceV1AdvanceTimeWindow": {
      "id": "FoodOrderingServiceV1AdvanceTimeWindow",
      "type": "object",
      "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"
        }
      },
      "description": "[START advance_time_window_definition] The fulfillment time window for advance orders."
    },
    "MinimumFee": {
      "type": "object",
      "properties": {
        "baseFeeAmount": {
          "description": "Required. The base fee amount for the fulfillment method.",
          "$ref": "Price"
        }
      },
      "description": "The minimum fee required for the fulfillment method associated with the action link.",
      "id": "MinimumFee"
    },
    "FoodOrderingMetadata": {
      "id": "FoodOrderingMetadata",
      "description": "Metadata for food ordering action links.",
      "type": "object",
      "properties": {
        "fulfillmentLeadTimeDuration": {
          "type": "string",
          "description": "Fixed duration. For example: 30 mins.",
          "format": "google-duration"
        },
        "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": {
          "items": {
            "$ref": "FoodOrderingMetadataFeeDetails"
          },
          "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.",
          "type": "array"
        },
        "fulfillmentLeadTimeDurationRange": {
          "description": "A range of duration. Examples: * 30 mins to 45 mins * Greater than 30 mins * Less than 50 mins",
          "$ref": "DurationRange"
        }
      }
    },
    "AdsAccountLink": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "description": "Identifier. Resource name of the AdsAccountLink. Format: `partners/{partner}/adsAccountLinks/{ads_account_link}`"
        },
        "itemIds": {
          "description": "Required. List of inventory item Ids to be linked with the Google Ads account.",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "state": {
          "enum": [
            "STATE_UNSPECIFIED",
            "LINKED",
            "PENDING",
            "DELETED",
            "REJECTED"
          ],
          "description": "Output only. State of the Ads account link.",
          "readOnly": true,
          "type": "string",
          "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": "AdsAccountLink is a link between an Ads account and a Partner Center account along with the inventory items.",
      "id": "AdsAccountLink"
    },
    "VirtualSession": {
      "id": "VirtualSession",
      "description": "Information about virtual/online session. E.g. Online yoga class, virtual cooking class etc.",
      "type": "object",
      "properties": {
        "sessionRequirements": {
          "description": "Requirements for the given virtual session. Eg. yoga mat, cooking utensils etc. (Recommended)",
          "$ref": "Text"
        },
        "virtualPlatformInfo": {
          "description": "Information about the virtual platform used in this session. (Required to enable virtual services)",
          "$ref": "VirtualPlatformInfo"
        },
        "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"
        },
        "isSessionPrerecorded": {
          "type": "boolean",
          "description": "Required. Set this as true if the virtual session is not live and is pre-recorded."
        }
      }
    },
    "Merchant": {
      "type": "object",
      "properties": {
        "taxRateBasisPoints": {
          "type": "integer",
          "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.",
          "deprecated": true,
          "format": "uint32"
        },
        "geo": {
          "description": "The Geo info of the merchant, including latitude, longitude, and address.",
          "$ref": "GeoCoordinates"
        },
        "numBookings30d": {
          "description": "This field is deprecated.",
          "deprecated": true,
          "format": "int64",
          "type": "string"
        },
        "matchingHints": {
          "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)",
          "$ref": "MerchantMatchingHints"
        },
        "economicOperator": {
          "description": "Optional. Economic Operator information associated to this specific merchant needed for regulatory compliance. (optional)",
          "$ref": "EconomicOperator"
        },
        "url": {
          "description": "The url of the merchant's public website.",
          "type": "string"
        },
        "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,
          "$ref": "TaxRate"
        },
        "tokenizationConfig": {
          "description": "Configuration for a tokenized payment processor, if the merchant has support for it. Deprecated since E2E payments is no longer supported.",
          "deprecated": true,
          "$ref": "TokenizationConfig"
        },
        "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.",
          "$ref": "Terms"
        },
        "paymentProcessorConfig": {
          "description": "Configuration for a tokenized payment processor, if the merchant has support for it.",
          "deprecated": true,
          "$ref": "PaymentProcessorConfig"
        },
        "telephone": {
          "type": "string",
          "description": "The public telephone number of the merchant including its country and area codes, e.g. +14567891234."
        },
        "reservationLinkoutTemplate": {
          "type": "array",
          "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"
          }
        },
        "name": {
          "type": "string",
          "description": "The merchant resource name, which has the format of `partners/{partner_id}/merchants/{merchant_id}`."
        },
        "category": {
          "type": "string",
          "description": "The category of the business in aggregator's platform."
        },
        "serviceAttribute": {
          "description": "Definitions for any service attributes used to describe the Services for this Merchant. (optional)",
          "type": "array",
          "items": {
            "$ref": "ServiceAttribute"
          }
        },
        "merchantName": {
          "type": "string",
          "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."
        },
        "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"
        },
        "waitlistAdvisement": {
          "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.",
          "$ref": "Advisement"
        },
        "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.",
          "deprecated": true,
          "items": {
            "$ref": "PaymentOption"
          }
        },
        "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"
        },
        "actionLink": {
          "items": {
            "$ref": "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,",
          "type": "array"
        }
      },
      "description": "Info about a merchant that is on the aggregator's platform.",
      "id": "Merchant"
    },
    "RefundCondition": {
      "type": "object",
      "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": {
          "type": "integer",
          "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.",
          "format": "uint32"
        }
      },
      "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.",
      "id": "RefundCondition"
    },
    "TicketType": {
      "id": "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.",
      "type": "object",
      "properties": {
        "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"
        },
        "localizedShortDescription": {
          "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.",
          "$ref": "Text"
        },
        "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"
        },
        "localizedOptionDescription": {
          "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: ",
          "$ref": "Text"
        },
        "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"
        },
        "inventoryType": {
          "type": "string",
          "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"
          ]
        },
        "perTicketFee": {
          "description": "Additional fees for purchasing this ticket. (optional)",
          "$ref": "PerTicketFee"
        },
        "optionDescription": {
          "type": "string",
          "description": "Description of any additional option which this ticket type represents, if any. Deprecated, use localized_option_description instead."
        },
        "priceDisplayType": {
          "type": "string",
          "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."
          ],
          "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"
          ]
        }
      }
    },
    "ReplaceServiceAvailabilityRequest": {
      "id": "ReplaceServiceAvailabilityRequest",
      "type": "object",
      "properties": {
        "serviceAvailability": {
          "description": "The service availability that is used to replace the existing ones.",
          "$ref": "ServiceAvailability"
        }
      },
      "description": "The request to replace a Service's availability."
    },
    "HomeServiceData": {
      "id": "HomeServiceData",
      "description": "Additional information required to be provided for home service vertical.",
      "type": "object",
      "properties": {
        "jobType": {
          "type": "string",
          "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."
        },
        "categoryType": {
          "description": "The high level category to which this home service belongs to. E.g. plumber, electrician etc.",
          "type": "string"
        }
      }
    },
    "ValidityRange": {
      "type": "object",
      "properties": {
        "validFromTime": {
          "description": "The beginning time of the range (inclusive). Required.",
          "format": "google-datetime",
          "type": "string"
        },
        "validThroughTime": {
          "type": "string",
          "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.",
          "format": "google-datetime"
        }
      },
      "description": "[START validity_range_definition] A closed-open timestamp range.",
      "id": "ValidityRange"
    },
    "Rating": {
      "description": "Defines Rating for an entity.",
      "type": "object",
      "properties": {
        "value": {
          "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.",
          "format": "double",
          "type": "number"
        },
        "numberOfRatings": {
          "description": "Number of ratings used in calculating the value (required).",
          "format": "uint64",
          "type": "string"
        }
      },
      "id": "Rating"
    },
    "VirtualPlatformInfo": {
      "type": "object",
      "properties": {
        "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"
          ]
        },
        "otherPlatformName": {
          "description": "The name of the platform if the platform is set to OTHER. (Required if platform is set to OTHER)",
          "$ref": "Text"
        }
      },
      "description": "Information about platform which will be used for this virtual session.",
      "id": "VirtualPlatformInfo"
    }
  },
  "discoveryVersion": "v1",
  "mtlsRootUrl": "https://mapsbooking.mtls.googleapis.com/",
  "baseUrl": "https://mapsbooking.googleapis.com/",
  "rootUrl": "https://mapsbooking.googleapis.com/",
  "resources": {
    "invalidation": {
      "resources": {
        "partners": {
          "methods": {
            "invalidateResource": {
              "flatPath": "v1alpha/invalidation/partners/{partnersId}:invalidateResource",
              "httpMethod": "POST",
              "request": {
                "$ref": "InvalidateResourceRequest"
              },
              "response": {
                "$ref": "Empty"
              },
              "description": "Invalidates an existing resource. A request is ignored if the requested resource is not subscribed to Google service. Supported resource types: - Pickup",
              "path": "v1alpha/invalidation/{+resourceId}:invalidateResource",
              "parameterOrder": [
                "resourceId"
              ],
              "id": "mapsbooking.invalidation.partners.invalidateResource",
              "parameters": {
                "resourceId": {
                  "pattern": "^partners/.*$",
                  "location": "path",
                  "required": true,
                  "type": "string",
                  "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."
                }
              }
            }
          }
        }
      }
    },
    "partners": {
      "resources": {
        "adsAccountLinks": {
          "methods": {
            "delete": {
              "parameterOrder": [
                "name"
              ],
              "id": "mapsbooking.partners.adsAccountLinks.delete",
              "parameters": {
                "name": {
                  "pattern": "^partners/[^/]+/adsAccountLinks/[^/]+$",
                  "location": "path",
                  "required": true,
                  "type": "string",
                  "description": "Required. The name of the AdsAccountLink to delete. Format: partners/{partner}/adsAccountLinks/{ads_account_link}"
                }
              },
              "response": {
                "$ref": "Empty"
              },
              "flatPath": "v1alpha/partners/{partnersId}/adsAccountLinks/{adsAccountLinksId}",
              "httpMethod": "DELETE",
              "description": "Deletes Ads account link. This will unlink the Google Ads account and the Partner Center account.",
              "path": "v1alpha/{+name}"
            },
            "create": {
              "request": {
                "$ref": "AdsAccountLink"
              },
              "flatPath": "v1alpha/partners/{partnersId}/adsAccountLinks",
              "httpMethod": "POST",
              "response": {
                "$ref": "AdsAccountLink"
              },
              "path": "v1alpha/{+parent}/adsAccountLinks",
              "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.",
              "parameters": {
                "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}",
                  "type": "string",
                  "required": true,
                  "location": "path",
                  "pattern": "^partners/[^/]+$"
                },
                "adsAccountLinkId": {
                  "type": "string",
                  "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.",
                  "location": "query"
                }
              },
              "id": "mapsbooking.partners.adsAccountLinks.create",
              "parameterOrder": [
                "parent"
              ]
            },
            "get": {
              "path": "v1alpha/{+name}",
              "description": "Gets Ads account link.",
              "flatPath": "v1alpha/partners/{partnersId}/adsAccountLinks/{adsAccountLinksId}",
              "httpMethod": "GET",
              "response": {
                "$ref": "AdsAccountLink"
              },
              "parameters": {
                "name": {
                  "required": true,
                  "pattern": "^partners/[^/]+/adsAccountLinks/[^/]+$",
                  "location": "path",
                  "type": "string",
                  "description": "Required. The name of the Ads account link to retrieve. Format: `partners/{partner}/adsAccountLinks/{ads_account_link}`"
                }
              },
              "id": "mapsbooking.partners.adsAccountLinks.get",
              "parameterOrder": [
                "name"
              ]
            },
            "patch": {
              "request": {
                "$ref": "AdsAccountLink"
              },
              "flatPath": "v1alpha/partners/{partnersId}/adsAccountLinks/{adsAccountLinksId}",
              "httpMethod": "PATCH",
              "response": {
                "$ref": "AdsAccountLink"
              },
              "path": "v1alpha/{+name}",
              "description": "Updates Ads account link with inventory items. This will update the Ads account link with the provided inventory items.",
              "parameters": {
                "name": {
                  "required": true,
                  "location": "path",
                  "pattern": "^partners/[^/]+/adsAccountLinks/[^/]+$",
                  "description": "Identifier. Resource name of the AdsAccountLink. Format: `partners/{partner}/adsAccountLinks/{ads_account_link}`",
                  "type": "string"
                },
                "updateMask": {
                  "type": "string",
                  "description": "Optional. The list of fields to update.",
                  "location": "query",
                  "format": "google-fieldmask"
                }
              },
              "id": "mapsbooking.partners.adsAccountLinks.patch",
              "parameterOrder": [
                "name"
              ]
            }
          }
        }
      }
    },
    "notification": {
      "resources": {
        "partners": {
          "resources": {
            "bookings": {
              "methods": {
                "patch": {
                  "path": "v1alpha/notification/{+name}",
                  "description": "Updates an existing Booking.",
                  "id": "mapsbooking.notification.partners.bookings.patch",
                  "parameterOrder": [
                    "name"
                  ],
                  "parameters": {
                    "bookingFailure.paymentFailure.threeds1Parameters.mdMerchantData": {
                      "description": "Merchant data. To be posted to the ACSUrl form if supplied.",
                      "location": "query",
                      "type": "string"
                    },
                    "bookingFailure.cause": {
                      "description": "Required. The reason why the booking failed. (required)",
                      "type": "string",
                      "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."
                      ],
                      "location": "query",
                      "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",
                      "description": "A PaymentAuthentication Request. To be posted to the ACSUrl form if supplied.",
                      "location": "query"
                    },
                    "bookingFailure.rejectedCardType": {
                      "description": "(required only if cause is PAYMENT_ERROR_CARD_TYPE_REJECTED)",
                      "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."
                      ],
                      "location": "query",
                      "enum": [
                        "CREDIT_CARD_TYPE_UNSPECIFIED",
                        "VISA",
                        "MASTERCARD",
                        "AMERICAN_EXPRESS",
                        "DISCOVER",
                        "JCB"
                      ]
                    },
                    "bookingFailure.description": {
                      "type": "string",
                      "description": "This optional field is used for the partner to include additional information for debugging purpose only. (optional)",
                      "location": "query"
                    },
                    "bookingFailure.paymentFailure.threeds1Parameters.acsUrl": {
                      "type": "string",
                      "description": "The URL from which to load a form to present to the User for authentication.",
                      "location": "query"
                    },
                    "name": {
                      "location": "path",
                      "pattern": "^partners/[^/]+/bookings/[^/]+$",
                      "required": true,
                      "description": "Resource name of the booking: `partners/{partner ID}/bookings/{booking ID}`",
                      "type": "string"
                    },
                    "bookingFailure.paymentFailure.threeds1Parameters.transactionId": {
                      "description": "An identifier used by the ACS provider. To be posted to the ACSUrl form if supplied.",
                      "location": "query",
                      "type": "string"
                    },
                    "updateMask": {
                      "type": "string",
                      "description": "Field mask of all booking fields to be updated",
                      "location": "query",
                      "format": "google-fieldmask"
                    }
                  },
                  "flatPath": "v1alpha/notification/partners/{partnersId}/bookings/{bookingsId}",
                  "httpMethod": "PATCH",
                  "request": {
                    "$ref": "Booking"
                  },
                  "response": {
                    "$ref": "Booking"
                  }
                }
              }
            },
            "orders": {
              "methods": {
                "patch": {
                  "flatPath": "v1alpha/notification/partners/{partnersId}/orders/{ordersId}",
                  "httpMethod": "PATCH",
                  "request": {
                    "$ref": "Order"
                  },
                  "response": {
                    "$ref": "Order"
                  },
                  "description": "Updates an existing Order.",
                  "path": "v1alpha/notification/{+name}",
                  "parameterOrder": [
                    "name"
                  ],
                  "id": "mapsbooking.notification.partners.orders.patch",
                  "parameters": {
                    "updateMask": {
                      "type": "string",
                      "description": "Field mask of all order fields to be updated",
                      "location": "query",
                      "format": "google-fieldmask"
                    },
                    "name": {
                      "pattern": "^partners/[^/]+/orders/[^/]+$",
                      "location": "path",
                      "required": true,
                      "type": "string",
                      "description": "Resource name of the order: `partners/{partner ID}/orders/{order ID}`"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "inventory": {
      "resources": {
        "partners": {
          "resources": {
            "feeds": {
              "methods": {
                "getStatus": {
                  "response": {
                    "$ref": "FeedStatus"
                  },
                  "parameters": {
                    "name": {
                      "location": "path",
                      "pattern": "^partners/[^/]+/feeds/[^/]+/[^/]+$",
                      "required": true,
                      "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"
                    }
                  },
                  "id": "mapsbooking.inventory.partners.feeds.getStatus",
                  "parameterOrder": [
                    "name"
                  ],
                  "path": "v1alpha/inventory/{+name}/status",
                  "description": "Retrieves the Status of a previously uploaded feed by the specified aggregator, and returns it.",
                  "flatPath": "v1alpha/inventory/partners/{partnersId}/feeds/{feedsId}/{feedsId1}/status",
                  "httpMethod": "GET"
                }
              },
              "resources": {
                "record": {
                  "methods": {
                    "batchPush": {
                      "response": {
                        "$ref": "Empty"
                      },
                      "request": {
                        "$ref": "BatchPushGenericRecordRequest"
                      },
                      "flatPath": "v1alpha/inventory/partners/{partnersId}/feeds/{feedsId}/record:batchPush",
                      "httpMethod": "POST",
                      "parameters": {
                        "parent": {
                          "type": "string",
                          "description": "Resource name, which has the format of - `partners/{partner_id}/feeds/{feed_name}`.",
                          "pattern": "^partners/[^/]+/feeds/[^/]+$",
                          "location": "path",
                          "required": true
                        }
                      },
                      "id": "mapsbooking.inventory.partners.feeds.record.batchPush",
                      "parameterOrder": [
                        "parent"
                      ],
                      "path": "v1alpha/inventory/{+parent}/record:batchPush",
                      "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."
                    },
                    "batchDelete": {
                      "path": "v1alpha/inventory/{+parent}/record:batchDelete",
                      "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.",
                      "id": "mapsbooking.inventory.partners.feeds.record.batchDelete",
                      "parameterOrder": [
                        "parent"
                      ],
                      "parameters": {
                        "parent": {
                          "pattern": "^partners/[^/]+/feeds/[^/]+$",
                          "location": "path",
                          "required": true,
                          "type": "string",
                          "description": "Resource name, which has the format of - `partners/{partner_id}/feeds/{feed_name}`."
                        }
                      },
                      "flatPath": "v1alpha/inventory/partners/{partnersId}/feeds/{feedsId}/record:batchDelete",
                      "httpMethod": "POST",
                      "request": {
                        "$ref": "BatchDeleteGenericRecordsRequest"
                      },
                      "response": {
                        "$ref": "Empty"
                      }
                    }
                  }
                },
                "status": {
                  "methods": {
                    "list": {
                      "id": "mapsbooking.inventory.partners.feeds.status.list",
                      "parameterOrder": [
                        "name"
                      ],
                      "response": {
                        "$ref": "ListStatusResponse"
                      },
                      "parameters": {
                        "stateRestrict": {
                          "description": "Optional restrict to filter results by feed state.",
                          "type": "string",
                          "enumDescriptions": [
                            "Default value. Unused.",
                            "The feed is still being processed.",
                            "The feed has been successfully processed.",
                            "We encountered an error while processing the feed."
                          ],
                          "location": "query",
                          "enum": [
                            "STATE_UNSPECIFIED",
                            "IN_PROGRESS",
                            "SUCCESS",
                            "FAILURE"
                          ]
                        },
                        "timeRangeRestrict.startTime": {
                          "description": "The lower bound of the time range.",
                          "location": "query",
                          "format": "google-datetime",
                          "type": "string"
                        },
                        "pageSize": {
                          "description": "The maximum number of items to return.",
                          "location": "query",
                          "format": "int32",
                          "type": "integer"
                        },
                        "pageToken": {
                          "description": "The next_page_token value returned from a previous List request, if any.",
                          "location": "query",
                          "type": "string"
                        },
                        "name": {
                          "type": "string",
                          "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`",
                          "required": true,
                          "pattern": "^partners/[^/]+/feeds/[^/]+$",
                          "location": "path"
                        },
                        "timeRangeRestrict.endTime": {
                          "type": "string",
                          "description": "The upper bound of the time range.",
                          "location": "query",
                          "format": "google-datetime"
                        }
                      },
                      "flatPath": "v1alpha/inventory/partners/{partnersId}/feeds/{feedsId}/status",
                      "httpMethod": "GET",
                      "path": "v1alpha/inventory/{+name}/status",
                      "description": "Retrieves the Status of multiple previously uploaded merchant, service, or availability feeds by the specified aggregator, and returns them."
                    }
                  }
                }
              }
            },
            "merchants": {
              "methods": {
                "patch": {
                  "flatPath": "v1alpha/inventory/partners/{partnersId}/merchants/{merchantsId}",
                  "httpMethod": "PATCH",
                  "request": {
                    "$ref": "Merchant"
                  },
                  "response": {
                    "$ref": "Merchant"
                  },
                  "path": "v1alpha/inventory/{+name}",
                  "description": "Updates an existing Merchant managed by the specified aggregator, and returns it.",
                  "id": "mapsbooking.inventory.partners.merchants.patch",
                  "parameterOrder": [
                    "name"
                  ],
                  "parameters": {
                    "updateMask": {
                      "description": "The specific fields to update for the merchant.",
                      "location": "query",
                      "format": "google-fieldmask",
                      "type": "string"
                    },
                    "name": {
                      "required": true,
                      "pattern": "^partners/[^/]+/merchants/[^/]+$",
                      "location": "path",
                      "type": "string",
                      "description": "The merchant resource name, which has the format of `partners/{partner_id}/merchants/{merchant_id}`."
                    }
                  }
                },
                "getStatus": {
                  "id": "mapsbooking.inventory.partners.merchants.getStatus",
                  "parameterOrder": [
                    "name"
                  ],
                  "response": {
                    "$ref": "MerchantStatus"
                  },
                  "parameters": {
                    "name": {
                      "required": true,
                      "pattern": "^partners/[^/]+/merchants/[^/]+/status$",
                      "location": "path",
                      "type": "string",
                      "description": "Required. Resource name, in the format of partners/{partner_id}/merchants/{merchant_id}/status."
                    }
                  },
                  "flatPath": "v1alpha/inventory/partners/{partnersId}/merchants/{merchantsId}/status",
                  "httpMethod": "GET",
                  "path": "v1alpha/inventory/{+name}",
                  "description": "Get the MerchantStatus of a Merchant."
                },
                "create": {
                  "description": "Creates a new Merchant managed by the specified aggregator, and returns it.",
                  "path": "v1alpha/inventory/{+parent}/merchants",
                  "parameterOrder": [
                    "parent"
                  ],
                  "id": "mapsbooking.inventory.partners.merchants.create",
                  "parameters": {
                    "parent": {
                      "location": "path",
                      "pattern": "^partners/[^/]+$",
                      "required": true,
                      "description": "The parent resource name for the partner who owns this merchant, in the format of `partners/{partner_id}`.",
                      "type": "string"
                    },
                    "merchantId": {
                      "type": "string",
                      "description": "The merchant id to use for this merchant.",
                      "location": "query"
                    }
                  },
                  "flatPath": "v1alpha/inventory/partners/{partnersId}/merchants",
                  "httpMethod": "POST",
                  "request": {
                    "$ref": "Merchant"
                  },
                  "response": {
                    "$ref": "Merchant"
                  }
                },
                "delete": {
                  "id": "mapsbooking.inventory.partners.merchants.delete",
                  "parameterOrder": [
                    "name"
                  ],
                  "response": {
                    "$ref": "Empty"
                  },
                  "parameters": {
                    "name": {
                      "description": "The resource name of the merchant to delete. In the format of partners/{partner_id}/merchants/{merchant_id}",
                      "type": "string",
                      "location": "path",
                      "pattern": "^partners/[^/]+/merchants/[^/]+$",
                      "required": true
                    }
                  },
                  "flatPath": "v1alpha/inventory/partners/{partnersId}/merchants/{merchantsId}",
                  "httpMethod": "DELETE",
                  "path": "v1alpha/inventory/{+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."
                }
              },
              "resources": {
                "services": {
                  "resources": {
                    "availability": {
                      "methods": {
                        "replace": {
                          "request": {
                            "$ref": "ReplaceServiceAvailabilityRequest"
                          },
                          "flatPath": "v1alpha/inventory/partners/{partnersId}/merchants/{merchantsId}/services/{servicesId}/availability:replace",
                          "httpMethod": "POST",
                          "response": {
                            "$ref": "ServiceAvailability"
                          },
                          "path": "v1alpha/inventory/{+name}/availability:replace",
                          "description": "Replaces the Availability of an existing Service of a merchant managed by the specified aggregator, and returns it.",
                          "parameters": {
                            "name": {
                              "required": true,
                              "location": "path",
                              "pattern": "^partners/[^/]+/merchants/[^/]+/services/[^/]+$",
                              "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"
                            }
                          },
                          "id": "mapsbooking.inventory.partners.merchants.services.availability.replace",
                          "parameterOrder": [
                            "name"
                          ]
                        }
                      }
                    }
                  },
                  "methods": {
                    "delete": {
                      "response": {
                        "$ref": "Empty"
                      },
                      "parameters": {
                        "name": {
                          "description": "The resource name of the service to delete. In the format of `partners/{partner_id}/merchants/{merchant_id}/services/{service_id}`",
                          "type": "string",
                          "location": "path",
                          "pattern": "^partners/[^/]+/merchants/[^/]+/services/[^/]+$",
                          "required": true
                        }
                      },
                      "id": "mapsbooking.inventory.partners.merchants.services.delete",
                      "parameterOrder": [
                        "name"
                      ],
                      "path": "v1alpha/inventory/{+name}",
                      "description": "Deletes an existing Service of a merchant managed by the specified aggregator. All the service's availability will be deleted, too.",
                      "flatPath": "v1alpha/inventory/partners/{partnersId}/merchants/{merchantsId}/services/{servicesId}",
                      "httpMethod": "DELETE"
                    },
                    "create": {
                      "flatPath": "v1alpha/inventory/partners/{partnersId}/merchants/{merchantsId}/services",
                      "httpMethod": "POST",
                      "request": {
                        "$ref": "Service"
                      },
                      "response": {
                        "$ref": "Service"
                      },
                      "path": "v1alpha/inventory/{+parent}/services",
                      "description": "Creates a new Service of a merchant managed by the specified aggregator, and returns it.",
                      "id": "mapsbooking.inventory.partners.merchants.services.create",
                      "parameterOrder": [
                        "parent"
                      ],
                      "parameters": {
                        "parent": {
                          "description": "The parent resource name for the merchant who owns this service, in the format of `partners/{partner_id}/merchants/{merchant_id}`.",
                          "type": "string",
                          "required": true,
                          "location": "path",
                          "pattern": "^partners/[^/]+/merchants/[^/]+$"
                        },
                        "serviceId": {
                          "type": "string",
                          "description": "The service id to use for this service.",
                          "location": "query"
                        }
                      }
                    },
                    "patch": {
                      "description": "Updates an existing Service of a merchant managed by the specified aggregator, and returns it.",
                      "path": "v1alpha/inventory/{+name}",
                      "parameters": {
                        "name": {
                          "location": "path",
                          "pattern": "^partners/[^/]+/merchants/[^/]+/services/[^/]+$",
                          "required": true,
                          "description": "The service resource name, which has the format of `partners/{partner_id}/merchants/{merchant_id}/services/{service_id}`.",
                          "type": "string"
                        },
                        "updateMask": {
                          "type": "string",
                          "description": "The specific fields to update for the service.",
                          "location": "query",
                          "format": "google-fieldmask"
                        }
                      },
                      "parameterOrder": [
                        "name"
                      ],
                      "id": "mapsbooking.inventory.partners.merchants.services.patch",
                      "request": {
                        "$ref": "Service"
                      },
                      "flatPath": "v1alpha/inventory/partners/{partnersId}/merchants/{merchantsId}/services/{servicesId}",
                      "httpMethod": "PATCH",
                      "response": {
                        "$ref": "Service"
                      }
                    }
                  }
                },
                "status": {
                  "methods": {
                    "list": {
                      "parameters": {
                        "parent": {
                          "pattern": "^partners/[^/]+/merchants$",
                          "location": "path",
                          "required": true,
                          "type": "string",
                          "description": "Required. The parent, which owns this collection of merchant status. Format: `partners/{partner_id}/merchants`"
                        },
                        "bookingInventoryStatusRestrict": {
                          "description": "Optional. Optional restriction to filter results by booking inventory status.",
                          "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."
                          ],
                          "location": "query",
                          "enum": [
                            "BOOKING_INVENTORY_STATUS_UNSPECIFIED",
                            "NO_VALID_FUTURE_INVENTORY",
                            "HAS_VALID_FUTURE_INVENTORY"
                          ]
                        },
                        "geoMatchRestrict": {
                          "type": "string",
                          "enumDescriptions": [
                            "Not specified.",
                            "Merchant is not geo matched.",
                            "Merchant is geo matched."
                          ],
                          "description": "Optional. Optional restriction to filter results by Geo matching status.",
                          "location": "query",
                          "enum": [
                            "GEO_MATCHING_STATUS_UNSPECIFIED",
                            "GEO_UNMATCHED",
                            "GEO_MATCHED"
                          ]
                        },
                        "waitlistInventoryStatusRestrict": {
                          "location": "query",
                          "enum": [
                            "WAITLIST_INVENTORY_STATUS_UNSPECIFIED",
                            "NO_VALID_WAITLIST_SERVICE",
                            "HAS_VALID_WAITLIST_SERVICE"
                          ],
                          "description": "Optional. Optional restriction to filter results by waitlist inventory status.",
                          "type": "string",
                          "enumDescriptions": [
                            "Not specified.",
                            "Merchant doesn't have service supporting waitlist.",
                            "Merchant has service supporting waitlist."
                          ]
                        },
                        "pageSize": {
                          "type": "integer",
                          "description": "Required. The maximum number of items to return. Note that the server may reduce the page size.",
                          "location": "query",
                          "format": "int32"
                        },
                        "pageToken": {
                          "type": "string",
                          "description": "Optional. The nextPageToken value returned from a previous ListMerchantStatusResponse, if any.",
                          "location": "query"
                        }
                      },
                      "response": {
                        "$ref": "ListMerchantStatusesResponse"
                      },
                      "parameterOrder": [
                        "parent"
                      ],
                      "id": "mapsbooking.inventory.partners.merchants.status.list",
                      "description": "List all MerchantStatus of a partner that satisfy the filter conditions.",
                      "path": "v1alpha/inventory/{+parent}/status",
                      "flatPath": "v1alpha/inventory/partners/{partnersId}/merchants/status",
                      "httpMethod": "GET"
                    }
                  }
                }
              }
            },
            "availability": {
              "methods": {
                "replace": {
                  "response": {
                    "$ref": "BatchReplaceServiceAvailabilityResponse"
                  },
                  "flatPath": "v1alpha/inventory/partners/{partnersId}/availability:replace",
                  "httpMethod": "POST",
                  "request": {
                    "$ref": "BatchReplaceServiceAvailabilityRequest"
                  },
                  "id": "mapsbooking.inventory.partners.availability.replace",
                  "parameterOrder": [
                    "parent"
                  ],
                  "parameters": {
                    "parent": {
                      "description": "Format of `partners/{partner_id}`.",
                      "type": "string",
                      "location": "path",
                      "pattern": "^partners/[^/]+$",
                      "required": true
                    }
                  },
                  "path": "v1alpha/inventory/{+parent}/availability:replace",
                  "description": "Replaces the Availability of existing Services. This batch call does not guarantee atomicity. Only successfully updated availability slots will be returned."
                }
              }
            }
          }
        }
      }
    }
  },
  "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"
  },
  "description": "Scheduling aggregators call this API to notify us of appointment updates, and update their inventories including merchants, services, and availability.",
  "name": "mapsbooking",
  "revision": "20260609",
  "kind": "discovery#restDescription",
  "protocol": "rest",
  "title": "Google Maps Booking API",
  "documentationLink": "https://developers.google.com",
  "id": "mapsbooking:v1alpha",
  "basePath": "",
  "fullyEncodeReservedExpansion": true,
  "version_module": true
}
